nouveau: Use bitmask/ffs to iterate enabled lights
authorMathias Fröhlich <mathias.froehlich@web.de>
Sun, 22 May 2016 12:10:19 +0000 (14:10 +0200)
committerMathias Fröhlich <mathias.froehlich@web.de>
Thu, 16 Jun 2016 03:50:54 +0000 (05:50 +0200)
Replaces a loop that iterates all lights and test
which of them is enabled by a loop only iterating over
the bits set in the enabled 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>
src/mesa/drivers/dri/nouveau/nouveau_state.c
src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
src/mesa/drivers/dri/nouveau/nv20_state_tnl.c

index 3aad10e..6189997 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "swrast/swrast.h"
 #include "tnl/tnl.h"
+#include "util/bitscan.h"
 
 static void
 nouveau_alpha_func(struct gl_context *ctx, GLenum func, GLfloat ref)
@@ -122,7 +123,7 @@ nouveau_draw_buffers(struct gl_context *ctx, GLsizei n, const GLenum *buffers)
 static void
 nouveau_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
 {
-       int i;
+       GLbitfield mask;
 
        switch (cap) {
        case GL_ALPHA_TEST:
@@ -187,9 +188,10 @@ nouveau_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
                context_dirty(ctx, LIGHT_MODEL);
                context_dirty(ctx, LIGHT_ENABLE);
 
-               for (i = 0; i < MAX_LIGHTS; i++) {
-                       if (ctx->Light.Light[i].Enabled)
-                               context_dirty_i(ctx, LIGHT_SOURCE, i);
+               mask = ctx->Light._EnabledLights;
+               while (mask) {
+                       const int i = u_bit_scan(&mask);
+                       context_dirty_i(ctx, LIGHT_SOURCE, i);
                }
 
                context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
index 1398385..9f80e41 100644 (file)
@@ -30,8 +30,7 @@
 #include "nouveau_util.h"
 #include "nv10_3d.xml.h"
 #include "nv10_driver.h"
-
-#include "util/simple_list.h"
+#include "util/bitscan.h"
 
 void
 nv10_emit_clip_plane(struct gl_context *ctx, int emit)
@@ -323,7 +322,7 @@ nv10_emit_material_ambient(struct gl_context *ctx, int emit)
        struct nouveau_pushbuf *push = context_push(ctx);
        float (*mat)[4] = ctx->Light.Material.Attrib;
        float c_scene[3], c_factor[3];
-       struct gl_light *l;
+       GLbitfield mask;
 
        if (USE_COLOR_MATERIAL(AMBIENT)) {
                COPY_3V(c_scene, ctx->Light.Model.Ambient);
@@ -347,8 +346,10 @@ nv10_emit_material_ambient(struct gl_context *ctx, int emit)
                PUSH_DATAp(push, c_factor, 3);
        }
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(AMBIENT) ?
                                  l->Ambient :
                                  l->_MatAmbient[0]);
@@ -363,13 +364,15 @@ nv10_emit_material_diffuse(struct gl_context *ctx, int emit)
 {
        struct nouveau_pushbuf *push = context_push(ctx);
        GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
-       struct gl_light *l;
+       GLbitfield mask;
 
        BEGIN_NV04(push, NV10_3D(MATERIAL_FACTOR_A), 1);
        PUSH_DATAf(push, mat[MAT_ATTRIB_FRONT_DIFFUSE][3]);
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(DIFFUSE) ?
                                  l->Diffuse :
                                  l->_MatDiffuse[0]);
@@ -383,10 +386,12 @@ void
 nv10_emit_material_specular(struct gl_context *ctx, int emit)
 {
        struct nouveau_pushbuf *push = context_push(ctx);
-       struct gl_light *l;
+       GLbitfield mask;
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(SPECULAR) ?
                                  l->Specular :
                                  l->_MatSpecular[0]);
index 4139551..607a5c0 100644 (file)
@@ -31,8 +31,7 @@
 #include "nv20_3d.xml.h"
 #include "nv10_driver.h"
 #include "nv20_driver.h"
-
-#include "util/simple_list.h"
+#include "util/bitscan.h"
 
 #define LIGHT_MODEL_AMBIENT_R(side)                    \
        ((side) ? NV20_3D_LIGHT_MODEL_BACK_AMBIENT_R :  \
@@ -240,7 +239,7 @@ nv20_emit_material_ambient(struct gl_context *ctx, int emit)
        struct nouveau_pushbuf *push = context_push(ctx);
        float (*mat)[4] = ctx->Light.Material.Attrib;
        float c_scene[3], c_factor[3];
-       struct gl_light *l;
+       GLbitfield mask;
 
        if (USE_COLOR_MATERIAL(AMBIENT, side)) {
                COPY_3V(c_scene, mat[MAT_ATTRIB_EMISSION(side)]);
@@ -264,8 +263,10 @@ nv20_emit_material_ambient(struct gl_context *ctx, int emit)
                PUSH_DATAp(push, c_factor, 3);
        }
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(AMBIENT, side) ?
                                  l->Ambient :
                                  l->_MatAmbient[side]);
@@ -281,13 +282,15 @@ nv20_emit_material_diffuse(struct gl_context *ctx, int emit)
        const int side = emit - NOUVEAU_STATE_MATERIAL_FRONT_DIFFUSE;
        struct nouveau_pushbuf *push = context_push(ctx);
        GLfloat (*mat)[4] = ctx->Light.Material.Attrib;
-       struct gl_light *l;
+       GLbitfield mask;
 
        BEGIN_NV04(push, SUBC_3D(MATERIAL_FACTOR_A(side)), 1);
        PUSH_DATAf(push, mat[MAT_ATTRIB_DIFFUSE(side)][3]);
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(DIFFUSE, side) ?
                                  l->Diffuse :
                                  l->_MatDiffuse[side]);
@@ -302,10 +305,12 @@ nv20_emit_material_specular(struct gl_context *ctx, int emit)
 {
        const int side = emit - NOUVEAU_STATE_MATERIAL_FRONT_SPECULAR;
        struct nouveau_pushbuf *push = context_push(ctx);
-       struct gl_light *l;
+       GLbitfield mask;
 
-       foreach(l, &ctx->Light.EnabledList) {
-               const int i = l - ctx->Light.Light;
+       mask = ctx->Light._EnabledLights;
+       while (mask) {
+               const int i = u_bit_scan(&mask);
+               struct gl_light *l = &ctx->Light.Light[i];
                float *c_light = (USE_COLOR_MATERIAL(SPECULAR, side) ?
                                  l->Specular :
                                  l->_MatSpecular[side]);