浏览代码

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.
tags/mesa-7.9-rc1
Brian Paul 15 年前
父节点
当前提交
b6b9b17d27
共有 2 个文件被更改,包括 9 次插入5 次删除
  1. 1
    1
      src/mesa/main/state.c
  2. 8
    4
      src/mesa/main/texenvprogram.c

+ 1
- 1
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);
}

+ 8
- 4
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 );

正在加载...
取消
保存