summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/ff_fragment_shader.cpp
diff options
context:
space:
mode:
authorMathias Fröhlich <mathias.froehlich@web.de>2016-05-22 14:10:19 +0200
committerMathias Fröhlich <mathias.froehlich@web.de>2016-06-16 05:50:54 +0200
commitd4eb2f9cda1fa08949f8e28ef414bbb41e150459 (patch)
tree8747a1c1844b7c5a3e0beac5f27259bb769356b7 /src/mesa/main/ff_fragment_shader.cpp
parent3ee409bebfa88eaec34a7f912a1bbc86304a522f (diff)
downloadexternal_mesa3d-d4eb2f9cda1fa08949f8e28ef414bbb41e150459.zip
external_mesa3d-d4eb2f9cda1fa08949f8e28ef414bbb41e150459.tar.gz
external_mesa3d-d4eb2f9cda1fa08949f8e28ef414bbb41e150459.tar.bz2
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>
Diffstat (limited to 'src/mesa/main/ff_fragment_shader.cpp')
-rw-r--r--src/mesa/main/ff_fragment_shader.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/mesa/main/ff_fragment_shader.cpp b/src/mesa/main/ff_fragment_shader.cpp
index 4977225..d0def7c 100644
--- a/src/mesa/main/ff_fragment_shader.cpp
+++ b/src/mesa/main/ff_fragment_shader.cpp
@@ -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);