mesa: Change redundant code into loops in texstate.c.

This is possible now that ctx->Shader.CurrentProgram is an array.

Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Paul Berry
2014-01-09 11:34:33 -08:00
parent 6ac2e1e199
commit 1032c33cb9

View File

@@ -527,27 +527,20 @@ static void
update_texture_state( struct gl_context *ctx )
{
GLuint unit;
struct gl_program *fprog = NULL;
struct gl_program *vprog = NULL;
struct gl_program *gprog = NULL;
struct gl_program *prog[MESA_SHADER_STAGES];
GLbitfield enabledFragUnits = 0x0;
int i;
if (ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX] &&
ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]->LinkStatus) {
vprog = ctx->Shader.CurrentProgram[MESA_SHADER_VERTEX]->_LinkedShaders[MESA_SHADER_VERTEX]->Program;
}
if (ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY] &&
ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]->LinkStatus) {
gprog = ctx->Shader.CurrentProgram[MESA_SHADER_GEOMETRY]->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program;
}
if (ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT] &&
ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]->LinkStatus) {
fprog = ctx->Shader.CurrentProgram[MESA_SHADER_FRAGMENT]->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program;
}
else if (ctx->FragmentProgram._Enabled) {
fprog = &ctx->FragmentProgram.Current->Base;
for (i = 0; i < MESA_SHADER_STAGES; i++) {
if (ctx->Shader.CurrentProgram[i] &&
ctx->Shader.CurrentProgram[i]->LinkStatus) {
prog[i] = ctx->Shader.CurrentProgram[i]->_LinkedShaders[i]->Program;
} else {
if (i == MESA_SHADER_FRAGMENT && ctx->FragmentProgram._Enabled)
prog[i] = &ctx->FragmentProgram.Current->Base;
else
prog[i] = NULL;
}
}
/* TODO: only set this if there are actual changes */
@@ -563,9 +556,7 @@ update_texture_state( struct gl_context *ctx )
*/
for (unit = 0; unit < ctx->Const.MaxCombinedTextureImageUnits; unit++) {
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
GLbitfield enabledVertTargets = 0x0;
GLbitfield enabledFragTargets = 0x0;
GLbitfield enabledGeomTargets = 0x0;
GLbitfield enabledTargetsByStage[MESA_SHADER_STAGES];
GLbitfield enabledTargets = 0x0;
GLuint texIndex;
@@ -575,25 +566,16 @@ update_texture_state( struct gl_context *ctx )
* by a fragment program/program. When multiple flags are set, we'll
* settle on the one with highest priority (see below).
*/
if (vprog) {
enabledVertTargets |= vprog->TexturesUsed[unit];
for (i = 0; i < MESA_SHADER_STAGES; i++) {
if (prog[i])
enabledTargetsByStage[i] = prog[i]->TexturesUsed[unit];
else if (i == MESA_SHADER_FRAGMENT)
enabledTargetsByStage[i] = texUnit->Enabled;
else
enabledTargetsByStage[i] = 0;
enabledTargets |= enabledTargetsByStage[i];
}
if (gprog) {
enabledGeomTargets |= gprog->TexturesUsed[unit];
}
if (fprog) {
enabledFragTargets |= fprog->TexturesUsed[unit];
}
else {
/* fixed-function fragment program */
enabledFragTargets |= texUnit->Enabled;
}
enabledTargets = enabledVertTargets | enabledFragTargets |
enabledGeomTargets;
texUnit->_ReallyEnabled = 0x0;
if (enabledTargets == 0x0) {
@@ -625,7 +607,7 @@ update_texture_state( struct gl_context *ctx )
}
if (!texUnit->_ReallyEnabled) {
if (fprog) {
if (prog[MESA_SHADER_FRAGMENT]) {
/* If we get here it means the shader is expecting a texture
* object, but there isn't one (or it's incomplete). Use the
* fallback texture.
@@ -655,25 +637,26 @@ update_texture_state( struct gl_context *ctx )
ctx->Texture._EnabledUnits |= (1 << unit);
if (enabledFragTargets)
if (enabledTargetsByStage[MESA_SHADER_FRAGMENT])
enabledFragUnits |= (1 << unit);
if (!fprog)
if (!prog[MESA_SHADER_FRAGMENT])
update_tex_combine(ctx, texUnit);
}
/* Determine which texture coordinate sets are actually needed */
if (fprog) {
if (prog[MESA_SHADER_FRAGMENT]) {
const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1;
ctx->Texture._EnabledCoordUnits
= (fprog->InputsRead >> VARYING_SLOT_TEX0) & coordMask;
= (prog[MESA_SHADER_FRAGMENT]->InputsRead >> VARYING_SLOT_TEX0) &
coordMask;
}
else {
ctx->Texture._EnabledCoordUnits = enabledFragUnits;
}
if (!fprog || !vprog)
if (!prog[MESA_SHADER_FRAGMENT] || !prog[MESA_SHADER_VERTEX])
update_texgen(ctx);
_mesa_validate_image_units(ctx);