summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/radeon
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/radeon')
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_context.c2
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_context.h7
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_ioctl.c74
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_ioctl.h2
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_lock.h4
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_state_init.c2
6 files changed, 42 insertions, 49 deletions
diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
index dcc704cfd2..5f419347b4 100644
--- a/src/mesa/drivers/dri/radeon/radeon_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_context.c
@@ -62,7 +62,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "radeon_vtxfmt.h"
#include "radeon_maos.h"
-#define DRIVER_DATE "20040924"
+#define DRIVER_DATE "20040929"
#include "vblank.h"
#include "utils.h"
diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h
index f5bc0b0547..b44ea08dc8 100644
--- a/src/mesa/drivers/dri/radeon/radeon_context.h
+++ b/src/mesa/drivers/dri/radeon/radeon_context.h
@@ -185,7 +185,6 @@ struct radeon_state_atom {
GLuint is_tcl;
int *cmd; /* one or more cmd's */
int *lastcmd; /* one or more cmd's */
- int *savedcmd; /* one or more cmd's */
GLboolean dirty; /* dirty-mark in emit_state_list */
GLboolean (*check)( GLcontext * ); /* is this state active? */
};
@@ -714,6 +713,10 @@ struct radeon_context {
struct radeon_ioctl ioctl;
struct radeon_dma dma;
struct radeon_store store;
+ /* A full state emit as of the first state emit in the main store, in case
+ * the context is lost.
+ */
+ struct radeon_store backup_store;
/* Page flipping
*/
@@ -732,7 +735,7 @@ struct radeon_context {
drm_clip_rect_t *pClipRects;
unsigned int lastStamp;
GLboolean lost_context;
- GLboolean save_on_next_unlock;
+ GLboolean save_on_next_emit;
radeonScreenPtr radeonScreen; /* Screen private DRI data */
drm_radeon_sarea_t *sarea; /* Private SAREA data */
diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c
index 5ef14e34bb..50d5154016 100644
--- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c
+++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c
@@ -62,59 +62,52 @@ static void radeonWaitForIdle( radeonContextPtr rmesa );
static int radeonFlushCmdBufLocked( radeonContextPtr rmesa,
const char * caller );
-void radeonSaveHwState( radeonContextPtr rmesa )
+static void radeonSaveHwState( radeonContextPtr rmesa )
{
struct radeon_state_atom *atom;
+ char * dest = rmesa->backup_store.cmd_buf;
- foreach(atom, &rmesa->hw.atomlist)
- memcpy(atom->savedcmd, atom->cmd, atom->cmd_size * 4);
-}
-
-static void radeonSwapHwState( radeonContextPtr rmesa )
-{
- int *temp;
- struct radeon_state_atom *atom;
+ rmesa->backup_store.cmd_used = 0;
- foreach(atom, &rmesa->hw.atomlist) {
- temp = atom->cmd;
- atom->cmd = atom->savedcmd;
- atom->savedcmd = temp;
+ foreach( atom, &rmesa->hw.atomlist ) {
+ if ( atom->check( rmesa->glCtx ) ) {
+ int size = atom->cmd_size * 4;
+ memcpy( dest, atom->cmd, size);
+ dest += size;
+ rmesa->backup_store.cmd_used += size;
+ }
}
+
+ assert( rmesa->backup_store.cmd_used <= RADEON_CMD_BUF_SZ );
}
/* At this point we were in FlushCmdBufLocked but we had lost our context, so
- * we need to unwire our current cmdbuf and hook a new one in, emit that, then
- * wire the old cmdbuf back in so that FlushCmdBufLocked can continue and the
- * buffer can depend on the state not being lost across lock/unlock.
+ * we need to unwire our current cmdbuf, hook the one with the saved state in
+ * it, flush it, and then put the current one back. This is so commands at the
+ * start of a cmdbuf can rely on the state being kept from the previous one.
*/
static void radeonBackUpAndEmitLostStateLocked( radeonContextPtr rmesa )
{
- GLuint nr_released_bufs;
- struct radeon_store store;
+ GLuint nr_released_bufs, saved_cmd_used;
+ struct radeon_store saved_store;
+
+ if (rmesa->backup_store.cmd_used == 0)
+ return;
+
+ if (RADEON_DEBUG & DEBUG_STATE)
+ fprintf(stderr, "Emitting backup state on lost context\n");
rmesa->lost_context = GL_FALSE;
nr_released_bufs = rmesa->dma.nr_released_bufs;
- store = rmesa->store;
- rmesa->store.statenr = 0;
- rmesa->store.primnr = 0;
- rmesa->store.cmd_used = 0;
- rmesa->store.elts_start = 0;
- rmesa->hw.all_dirty = GL_TRUE;
- radeonSwapHwState( rmesa );
- /* In this case it's okay to EmitState while locked because we won't exhaust
- * our (empty) cmdbuf.
- */
- radeonEmitState(rmesa);
- radeonFlushCmdBufLocked(rmesa, __FUNCTION__);
-
- radeonSwapHwState(rmesa);
- /* We've just cleared out the dirty flags, so we don't remember what
- * actually needed to be emitted for the next state emit.
- */
- rmesa->hw.all_dirty = GL_TRUE;
+ saved_store = rmesa->store;
+ rmesa->dma.nr_released_bufs = 0;
+ rmesa->store = rmesa->backup_store;
+ saved_cmd_used = rmesa->backup_store.cmd_used;
+ radeonFlushCmdBufLocked( rmesa, __FUNCTION__ );
+ rmesa->backup_store.cmd_used = saved_cmd_used;
rmesa->dma.nr_released_bufs = nr_released_bufs;
- rmesa->store = store;
+ rmesa->store = saved_store;
}
/* =============================================================
@@ -176,6 +169,11 @@ void radeonEmitState( radeonContextPtr rmesa )
if (RADEON_DEBUG & (DEBUG_STATE|DEBUG_PRIMS))
fprintf(stderr, "%s\n", __FUNCTION__);
+ if (rmesa->save_on_next_emit) {
+ radeonSaveHwState(rmesa);
+ rmesa->save_on_next_emit = GL_FALSE;
+ }
+
if (!rmesa->hw.is_dirty && !rmesa->hw.all_dirty)
return;
@@ -582,7 +580,7 @@ static int radeonFlushCmdBufLocked( radeonContextPtr rmesa,
rmesa->store.statenr = 0;
rmesa->store.cmd_used = 0;
rmesa->dma.nr_released_bufs = 0;
- rmesa->save_on_next_unlock = 1;
+ rmesa->save_on_next_emit = 1;
return ret;
}
diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.h b/src/mesa/drivers/dri/radeon/radeon_ioctl.h
index 7ad4f3a932..79b3b72c60 100644
--- a/src/mesa/drivers/dri/radeon/radeon_ioctl.h
+++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.h
@@ -103,8 +103,6 @@ extern void radeonWaitForIdleLocked( radeonContextPtr rmesa );
extern void radeonWaitForVBlank( radeonContextPtr rmesa );
extern void radeonInitIoctlFuncs( GLcontext *ctx );
extern void radeonGetAllParams( radeonContextPtr rmesa );
-
-extern void radeonSaveHwState( radeonContextPtr rmesa );
extern void radeonSetUpAtomList( radeonContextPtr rmesa );
/* radeon_compat.c:
diff --git a/src/mesa/drivers/dri/radeon/radeon_lock.h b/src/mesa/drivers/dri/radeon/radeon_lock.h
index c28cf23161..c2e0c3706b 100644
--- a/src/mesa/drivers/dri/radeon/radeon_lock.h
+++ b/src/mesa/drivers/dri/radeon/radeon_lock.h
@@ -105,10 +105,6 @@ extern int prevLockLine;
rmesa->dri.hwLock, \
rmesa->dri.hwContext ); \
DEBUG_RESET(); \
- if ( rmesa->save_on_next_unlock ) { \
- radeonSaveHwState( rmesa ); \
- rmesa->save_on_next_unlock = GL_FALSE; \
- } \
} while (0)
#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_state_init.c b/src/mesa/drivers/dri/radeon/radeon_state_init.c
index 4df76603bb..0945fa803f 100644
--- a/src/mesa/drivers/dri/radeon/radeon_state_init.c
+++ b/src/mesa/drivers/dri/radeon/radeon_state_init.c
@@ -205,7 +205,6 @@ void radeonInitState( radeonContextPtr rmesa )
rmesa->hw.ATOM.cmd_size = SZ; \
rmesa->hw.ATOM.cmd = (int *)CALLOC(SZ * sizeof(int)); \
rmesa->hw.ATOM.lastcmd = (int *)CALLOC(SZ * sizeof(int)); \
- rmesa->hw.ATOM.savedcmd = (int *)CALLOC(SZ * sizeof(int)); \
rmesa->hw.ATOM.name = NM; \
rmesa->hw.ATOM.is_tcl = FLAG; \
rmesa->hw.ATOM.check = check_##CHK; \
@@ -551,6 +550,5 @@ void radeonInitState( radeonContextPtr rmesa )
rmesa->hw.eye.cmd[EYE_Z] = IEEE_ONE;
rmesa->hw.eye.cmd[EYE_RESCALE_FACTOR] = IEEE_ONE;
- radeonSaveHwState( rmesa );
rmesa->hw.all_dirty = GL_TRUE;
}