mesa: Use bitmask/ffs to build ff fragment shader keys.

Replaces an iterate and test bit in a bitmask loop by a
loop only iterating over the bits set in the bitmask.
The bitmask used here for iteration is a combination
of different enabled masks present for texture units.

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:
Mathias Fröhlich 2016-05-22 14:10:19 +02:00
parent 3ee409bebf
commit d4eb2f9cda
1 changed files with 7 additions and 3 deletions

View File

@ -49,6 +49,7 @@
#include "program/prog_parameter.h"
#include "program/prog_print.h"
#include "program/prog_statevars.h"
#include "util/bitscan.h"
using namespace ir_builder;
@ -398,22 +399,25 @@ static GLbitfield get_fp_input_mask( struct gl_context *ctx )
*/
static GLuint make_state_key( struct gl_context *ctx, struct state_key *key )
{
GLuint i, j;
GLuint j;
GLbitfield inputs_referenced = VARYING_BIT_COL0;
const GLbitfield inputs_available = get_fp_input_mask( ctx );
GLbitfield mask;
GLuint keySize;
memset(key, 0, sizeof(*key));
/* _NEW_TEXTURE */
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
mask = ctx->Texture._EnabledCoordUnits;
while (mask) {
const int i = u_bit_scan(&mask);
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
const struct gl_texture_object *texObj = texUnit->_Current;
const struct gl_tex_env_combine_state *comb = texUnit->_CurrentCombine;
const struct gl_sampler_object *samp;
GLenum format;
if (!texUnit->_Current || !texUnit->Enabled)
if (!texObj)
continue;
samp = _mesa_get_samplerobj(ctx, i);