diff options
Diffstat (limited to 'src/mesa/drivers/dri/radeon')
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_context.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_context.h | 7 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_ioctl.c | 74 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_ioctl.h | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_lock.h | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_state_init.c | 2 |
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; } |