diff options
author | Mathias Fröhlich <mathias.froehlich@web.de> | 2016-05-22 14:10:19 +0200 |
---|---|---|
committer | Mathias Fröhlich <mathias.froehlich@web.de> | 2016-06-16 05:50:55 +0200 |
commit | c14ec9aafa156c01fabf14d5f75cfe6fc4302480 (patch) | |
tree | 8d2ddb67869dfae2457ae08e79ecef06e261d191 | |
parent | 53691b7cb1246286db38db04f8aeb88fef75feb7 (diff) |
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 <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
-rw-r--r-- | src/mesa/main/uniforms.c | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 35b93d323b..d02f92ee0a 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); } } |