X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Ftexstate.c;h=4676d4aa0d9289268f148ad8f169f536c7ac4945;hb=e70d0d22a2dccc1df2c88890a2964491cdafac94;hp=cb147fac476602d4a91d5e19ae24e76c278b27d6;hpb=7e441bf025cf8c5d088430d546acb4c0ed58d27b;p=mesa.git diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index cb147fac476..4676d4aa0d9 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -38,6 +38,7 @@ #include "teximage.h" #include "texstate.h" #include "mtypes.h" +#include "util/bitscan.h" #include "util/bitset.h" @@ -330,7 +331,8 @@ _mesa_ClientActiveTexture(GLenum texture) return; if (texUnit >= ctx->Const.MaxTextureCoordUnits) { - _mesa_error(ctx, GL_INVALID_ENUM, "glClientActiveTexture(texture)"); + _mesa_error(ctx, GL_INVALID_ENUM, "glClientActiveTexture(texture=%s)", + _mesa_enum_to_string(texture)); return; } @@ -597,7 +599,7 @@ update_program_texture_state(struct gl_context *ctx, struct gl_program **prog, if (prog[MESA_SHADER_FRAGMENT]) { const GLuint coordMask = (1 << MAX_TEXTURE_COORD_UNITS) - 1; ctx->Texture._EnabledCoordUnits |= - (prog[MESA_SHADER_FRAGMENT]->InputsRead >> VARYING_SLOT_TEX0) & + (prog[MESA_SHADER_FRAGMENT]->info.inputs_read >> VARYING_SLOT_TEX0) & coordMask; } } @@ -610,7 +612,8 @@ update_ff_texture_state(struct gl_context *ctx, for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) { struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; - GLuint texIndex; + GLbitfield mask; + bool complete; if (texUnit->Enabled == 0x0) continue; @@ -648,23 +651,25 @@ update_ff_texture_state(struct gl_context *ctx, * another unit, then the results of texture blending are * undefined." */ - for (texIndex = 0; texIndex < NUM_TEXTURE_TARGETS; texIndex++) { - if (texUnit->Enabled & (1 << texIndex)) { - struct gl_texture_object *texObj = texUnit->CurrentTex[texIndex]; - struct gl_sampler_object *sampler = texUnit->Sampler ? - texUnit->Sampler : &texObj->Sampler; - - if (!_mesa_is_texture_complete(texObj, sampler)) { - _mesa_test_texobj_completeness(ctx, texObj); - } - if (_mesa_is_texture_complete(texObj, sampler)) { - _mesa_reference_texobj(&texUnit->_Current, texObj); - break; - } + complete = false; + mask = texUnit->Enabled; + while (mask) { + const int texIndex = u_bit_scan(&mask); + struct gl_texture_object *texObj = texUnit->CurrentTex[texIndex]; + struct gl_sampler_object *sampler = texUnit->Sampler ? + texUnit->Sampler : &texObj->Sampler; + + if (!_mesa_is_texture_complete(texObj, sampler)) { + _mesa_test_texobj_completeness(ctx, texObj); + } + if (_mesa_is_texture_complete(texObj, sampler)) { + _mesa_reference_texobj(&texUnit->_Current, texObj); + complete = true; + break; } } - if (texIndex == NUM_TEXTURE_TARGETS) + if (!complete) continue; /* if we get here, we know this texture unit is enabled */ @@ -696,11 +701,11 @@ update_texture_state( struct gl_context *ctx ) for (i = 0; i < MESA_SHADER_STAGES; i++) { if (ctx->_Shader->CurrentProgram[i] && - ctx->_Shader->CurrentProgram[i]->LinkStatus) { + ctx->_Shader->CurrentProgram[i]->data->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; + prog[i] = ctx->FragmentProgram.Current; else prog[i] = NULL; } @@ -785,7 +790,7 @@ alloc_proxy_textures( struct gl_context *ctx ) GL_TEXTURE_2D_ARRAY_EXT, GL_TEXTURE_1D_ARRAY_EXT, GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_CUBE_MAP_ARB, + GL_TEXTURE_CUBE_MAP, GL_TEXTURE_3D, GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_2D,