summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/dri/r200/r200_cmdbuf.c69
-rw-r--r--src/mesa/drivers/dri/r200/r200_context.h1
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? */
};