From: Mathias Fröhlich Date: Sun, 22 May 2016 12:10:19 +0000 (+0200) Subject: mesa: Use bitmask/ffs to iterate SamplersUsed X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c14ec9aafa156c01fabf14d5f75cfe6fc4302480;p=mesa.git mesa: Use bitmask/ffs to iterate SamplersUsed Replaces an iterate and test bit in a bitmask loop by a loop only iterating over the bits set in the bitmask. v2: Use _mesa_bit_scan{,64} instead of open coding. v3: Use u_bit_scan{,64} instead of _mesa_bit_scan{,64}. Reviewed-by: Brian Paul Signed-off-by: Mathias Fröhlich --- diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 35b93d323b5..d02f92ee0a5 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -46,6 +46,7 @@ #include "compiler/glsl/ir_uniform.h" #include "compiler/glsl_types.h" #include "program/program.h" +#include "util/bitscan.h" /** * Update the vertex/fragment program's TexturesUsed array. @@ -66,7 +67,7 @@ void _mesa_update_shader_textures_used(struct gl_shader_program *shProg, struct gl_program *prog) { - GLuint s; + GLbitfield mask = prog->SamplersUsed; struct gl_shader *shader = shProg->_LinkedShaders[_mesa_program_enum_to_shader_stage(prog->Target)]; @@ -77,26 +78,25 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg, shProg->SamplersValidated = GL_TRUE; - for (s = 0; s < MAX_SAMPLERS; s++) { - if (prog->SamplersUsed & (1u << s)) { - GLuint unit = shader->SamplerUnits[s]; - GLuint tgt = shader->SamplerTargets[s]; - assert(unit < ARRAY_SIZE(prog->TexturesUsed)); - assert(tgt < NUM_TEXTURE_TARGETS); - - /* The types of the samplers associated with a particular texture - * unit must be an exact match. Page 74 (page 89 of the PDF) of the - * OpenGL 3.3 core spec says: - * - * "It is not allowed to have variables of different sampler - * types pointing to the same texture image unit within a program - * object." - */ - if (prog->TexturesUsed[unit] & ~(1 << tgt)) - shProg->SamplersValidated = GL_FALSE; - - prog->TexturesUsed[unit] |= (1 << tgt); - } + while (mask) { + const int s = u_bit_scan(&mask); + GLuint unit = shader->SamplerUnits[s]; + GLuint tgt = shader->SamplerTargets[s]; + assert(unit < ARRAY_SIZE(prog->TexturesUsed)); + assert(tgt < NUM_TEXTURE_TARGETS); + + /* The types of the samplers associated with a particular texture + * unit must be an exact match. Page 74 (page 89 of the PDF) of the + * OpenGL 3.3 core spec says: + * + * "It is not allowed to have variables of different sampler + * types pointing to the same texture image unit within a program + * object." + */ + if (prog->TexturesUsed[unit] & ~(1 << tgt)) + shProg->SamplersValidated = GL_FALSE; + + prog->TexturesUsed[unit] |= (1 << tgt); } }