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>
This commit is contained in:
@@ -46,6 +46,7 @@
|
|||||||
#include "compiler/glsl/ir_uniform.h"
|
#include "compiler/glsl/ir_uniform.h"
|
||||||
#include "compiler/glsl_types.h"
|
#include "compiler/glsl_types.h"
|
||||||
#include "program/program.h"
|
#include "program/program.h"
|
||||||
|
#include "util/bitscan.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the vertex/fragment program's TexturesUsed array.
|
* Update the vertex/fragment program's TexturesUsed array.
|
||||||
@@ -66,7 +67,7 @@ void
|
|||||||
_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
|
||||||
struct gl_program *prog)
|
struct gl_program *prog)
|
||||||
{
|
{
|
||||||
GLuint s;
|
GLbitfield mask = prog->SamplersUsed;
|
||||||
struct gl_shader *shader =
|
struct gl_shader *shader =
|
||||||
shProg->_LinkedShaders[_mesa_program_enum_to_shader_stage(prog->Target)];
|
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;
|
shProg->SamplersValidated = GL_TRUE;
|
||||||
|
|
||||||
for (s = 0; s < MAX_SAMPLERS; s++) {
|
while (mask) {
|
||||||
if (prog->SamplersUsed & (1u << s)) {
|
const int s = u_bit_scan(&mask);
|
||||||
GLuint unit = shader->SamplerUnits[s];
|
GLuint unit = shader->SamplerUnits[s];
|
||||||
GLuint tgt = shader->SamplerTargets[s];
|
GLuint tgt = shader->SamplerTargets[s];
|
||||||
assert(unit < ARRAY_SIZE(prog->TexturesUsed));
|
assert(unit < ARRAY_SIZE(prog->TexturesUsed));
|
||||||
assert(tgt < NUM_TEXTURE_TARGETS);
|
assert(tgt < NUM_TEXTURE_TARGETS);
|
||||||
|
|
||||||
/* The types of the samplers associated with a particular texture
|
/* 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
|
* unit must be an exact match. Page 74 (page 89 of the PDF) of the
|
||||||
* OpenGL 3.3 core spec says:
|
* OpenGL 3.3 core spec says:
|
||||||
*
|
*
|
||||||
* "It is not allowed to have variables of different sampler
|
* "It is not allowed to have variables of different sampler
|
||||||
* types pointing to the same texture image unit within a program
|
* types pointing to the same texture image unit within a program
|
||||||
* object."
|
* object."
|
||||||
*/
|
*/
|
||||||
if (prog->TexturesUsed[unit] & ~(1 << tgt))
|
if (prog->TexturesUsed[unit] & ~(1 << tgt))
|
||||||
shProg->SamplersValidated = GL_FALSE;
|
shProg->SamplersValidated = GL_FALSE;
|
||||||
|
|
||||||
prog->TexturesUsed[unit] |= (1 << tgt);
|
prog->TexturesUsed[unit] |= (1 << tgt);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user