summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2010-07-02 08:14:54 -0600
committerBrian Paul <brianp@vmware.com>2010-07-02 08:14:54 -0600
commitb6b9b17d27c570cc99ae339e595cf2f63ca5e8d7 (patch)
tree72634b1de97dd6369a14f86f710340b5823f4cdf /src/mesa
parente845765f0f8791a0e6c2e54b91ebf9f0e831d19f (diff)
mesa: make the number of draw buffers part of the texenv program key state
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.
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/state.c2
-rw-r--r--src/mesa/main/texenvprogram.c12
2 files changed, 9 insertions, 5 deletions
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index 583dee53f2..4a3dffe4cf 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -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);
}
diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c
index 30963bdf7d..6aa89d1e61 100644
--- a/src/mesa/main/texenvprogram.c
+++ b/src/mesa/main/texenvprogram.c
@@ -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 );