diff options
Diffstat (limited to 'src/mesa/drivers/dri/r200')
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_cmdbuf.c | 69 | ||||
-rw-r--r-- | src/mesa/drivers/dri/r200/r200_context.h | 1 |
2 files changed, 65 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/r200/r200_cmdbuf.c b/src/mesa/drivers/dri/r200/r200_cmdbuf.c index 3a4fa30bcf..08dab8a4d8 100644 --- a/src/mesa/drivers/dri/r200/r200_cmdbuf.c +++ b/src/mesa/drivers/dri/r200/r200_cmdbuf.c @@ -63,11 +63,15 @@ static void r200_emit_state_list( r200ContextPtr rmesa, { struct r200_state_atom *state, *tmp; char *dest; + int i, size; + size = 0; foreach_s( state, tmp, list ) { if (state->check( rmesa->glCtx, state->idx )) { - dest = r200AllocCmdBuf( rmesa, state->cmd_size * 4, __FUNCTION__); - memcpy( dest, state->cmd, state->cmd_size * 4); +/* dest = r200AllocCmdBuf( rmesa, state->cmd_size * 4, __FUNCTION__); + memcpy( dest, state->cmd, state->cmd_size * 4);*/ + size += state->cmd_size; + state->dirty = GL_TRUE; move_to_head( &(rmesa->hw.clean), state ); if (R200_DEBUG & DEBUG_STATE) print_state_atom( state ); @@ -75,6 +79,61 @@ static void r200_emit_state_list( r200ContextPtr rmesa, else if (R200_DEBUG & DEBUG_STATE) fprintf(stderr, "skip state %s\n", state->name); } + + if (!size) + return; + + dest = r200AllocCmdBuf( rmesa, size * 4, __FUNCTION__); + +#define EMIT_ATOM(ATOM) \ +do { \ + if (rmesa->hw.ATOM.dirty) { \ + rmesa->hw.ATOM.dirty = GL_FALSE; \ + memcpy( dest, rmesa->hw.ATOM.cmd, rmesa->hw.ATOM.cmd_size * 4); \ + dest += rmesa->hw.ATOM.cmd_size * 4; \ + } \ +} while (0) + + EMIT_ATOM (ctx); + EMIT_ATOM (set); + EMIT_ATOM (lin); + EMIT_ATOM (msk); + EMIT_ATOM (vpt); + EMIT_ATOM (vtx); + EMIT_ATOM (vap); + EMIT_ATOM (vte); + EMIT_ATOM (msc); + EMIT_ATOM (cst); + EMIT_ATOM (zbs); + EMIT_ATOM (tcl); + EMIT_ATOM (msl); + EMIT_ATOM (tcg); + EMIT_ATOM (grd); + EMIT_ATOM (fog); + EMIT_ATOM (tam); + EMIT_ATOM (tf); + for (i = 0; i < 2; ++i) { + EMIT_ATOM (tex[i]); + } + for (i = 0; i < 2; ++i) { + EMIT_ATOM (cube[i]); + } + for (i = 0; i < 5; ++i) + EMIT_ATOM (mat[i]); + EMIT_ATOM (eye); + EMIT_ATOM (glt); + for (i = 0; i < 2; ++i) { + EMIT_ATOM (mtl[i]); + } + for (i = 0; i < 8; ++i) + EMIT_ATOM (lit[i]); + for (i = 0; i < 6; ++i) + EMIT_ATOM (ucp[i]); + for (i = 0; i < 6; ++i) + EMIT_ATOM (pix[i]); + +#undef EMIT_ATOM + } @@ -96,10 +155,10 @@ void r200EmitState( r200ContextPtr rmesa ) rmesa->lost_context = 0; } - else { - move_to_tail( &rmesa->hw.dirty, &rmesa->hw.mtl[0] ); +/* else { + move_to_tail( &rmesa->hw.dirty, &rmesa->hw.mtl[0] );*/ /* odd bug? -- isosurf, cycle between reflect & lit */ - } +/* }*/ r200_emit_state_list( rmesa, &rmesa->hw.dirty ); } diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index 5d3d408dbb..066803f236 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -186,6 +186,7 @@ struct r200_state_atom { GLuint idx; int *cmd; /* one or more cmd's */ int *lastcmd; /* one or more cmd's */ + GLboolean dirty; GLboolean (*check)( GLcontext *, int ); /* is this state active? */ }; |