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