mesa: make the number of draw buffers part of the texenv program key state
authorBrian Paul <brianp@vmware.com>
Fri, 2 Jul 2010 14:14:54 +0000 (08:14 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 2 Jul 2010 14:14:54 +0000 (08:14 -0600)
All the state that effects the program should be in the key.
This didn't help with bug 28169 but is a good fix anyway.

NOTE: this is a low-priority candidate for the 7.8 branch.  In practice,
this issue might never be hit.

src/mesa/main/state.c
src/mesa/main/texenvprogram.c

index 583dee53f24a394a37d16c5f317c035d1f6efbe2..4a3dffe4cf82bf4ee126928b5fc72ce340bbc4c1 100644 (file)
@@ -565,7 +565,7 @@ _mesa_update_state_locked( GLcontext *ctx )
 
    /* Determine which state flags effect vertex/fragment program state */
    if (ctx->FragmentProgram._MaintainTexEnvProgram) {
-      prog_flags |= (_NEW_TEXTURE | _NEW_FOG |
+      prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
                     _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE |
                     _NEW_PROGRAM);
    }
index 30963bdf7d0c48822d469da1c90d9709464c88a6..6aa89d1e6199cf1bb7be5cb71785404b565973ef 100644 (file)
@@ -98,6 +98,7 @@ struct state_key {
    GLuint fog_enabled:1;
    GLuint fog_mode:2;          /**< FOG_x */
    GLuint inputs_available:12;
+   GLuint num_draw_buffers:4;
 
    /* NOTE: This array of structs must be last! (see "keySize" below) */
    struct {
@@ -485,6 +486,9 @@ static GLuint make_state_key( GLcontext *ctx,  struct state_key *key )
       inputs_referenced |= FRAG_BIT_FOGC; /* maybe */
    }
 
+   /* _NEW_BUFFERS */
+   key->num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
+
    key->inputs_available = (inputs_available & inputs_referenced);
 
    /* compute size of state key, ignoring unused texture units */
@@ -1438,10 +1442,10 @@ create_new_program(GLcontext *ctx, struct state_key *key,
    p.program->Base.Parameters = _mesa_new_parameter_list();
    p.program->Base.InputsRead = 0x0;
 
-   if (ctx->DrawBuffer->_NumColorDrawBuffers == 1)
+   if (key->num_draw_buffers == 1)
       p.program->Base.OutputsWritten = 1 << FRAG_RESULT_COLOR;
    else {
-      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++)
+      for (i = 0; i < key->num_draw_buffers; i++)
         p.program->Base.OutputsWritten |= (1 << (FRAG_RESULT_DATA0 + i));
    }
 
@@ -1493,8 +1497,8 @@ create_new_program(GLcontext *ctx, struct state_key *key,
 
    cf = get_source( &p, SRC_PREVIOUS, 0 );
 
-   for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
-      if (ctx->DrawBuffer->_NumColorDrawBuffers == 1)
+   for (i = 0; i < key->num_draw_buffers; i++) {
+      if (key->num_draw_buffers == 1)
         out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_COLOR );
       else {
         out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i );