[Mesa-dev] [PATCH 13/29] nouveau: Use bitmask/ffs to iterate enabled lights

Mathias.Froehlich at gmx.net Mathias.Froehlich at gmx.net
Tue May 24 06:42:09 UTC 2016


From: Mathias Fröhlich <mathias.froehlich at web.de>

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.

Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
---
 src/mesa/drivers/dri/nouveau/nouveau_state.c  | 10 +++++----
 src/mesa/drivers/dri/nouveau/nv10_state_tnl.c | 29 +++++++++++++++++----------
 src/mesa/drivers/dri/nouveau/nv20_state_tnl.c | 29 +++++++++++++++++----------
 3 files changed, 42 insertions(+), 26 deletions(-)

diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c
index 3aad10e..a624211 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_state.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c
@@ -122,7 +122,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 +187,11 @@ 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 = ffs(mask) - 1;
+			mask ^= (1u << i);
+			context_dirty_i(ctx, LIGHT_SOURCE, i);
 		}
 
 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
index 1398385..4a3ad57 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
@@ -31,8 +31,6 @@
 #include "nv10_3d.xml.h"
 #include "nv10_driver.h"
 
-#include "util/simple_list.h"
-
 void
 nv10_emit_clip_plane(struct gl_context *ctx, int emit)
 {
@@ -323,7 +321,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,11 +345,14 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(AMBIENT) ?
 				  l->Ambient :
 				  l->_MatAmbient[0]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, NV10_3D(LIGHT_AMBIENT_R(i)), 3);
 		PUSH_DATAp(push, c_light, 3);
@@ -363,16 +364,19 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(DIFFUSE) ?
 				  l->Diffuse :
 				  l->_MatDiffuse[0]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, NV10_3D(LIGHT_DIFFUSE_R(i)), 3);
 		PUSH_DATAp(push, c_light, 3);
@@ -383,13 +387,16 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(SPECULAR) ?
 				  l->Specular :
 				  l->_MatSpecular[0]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, NV10_3D(LIGHT_SPECULAR_R(i)), 3);
 		PUSH_DATAp(push, c_light, 3);
diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
index 4139551..8e0485a 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
@@ -32,8 +32,6 @@
 #include "nv10_driver.h"
 #include "nv20_driver.h"
 
-#include "util/simple_list.h"
-
 #define LIGHT_MODEL_AMBIENT_R(side)			\
 	((side) ? NV20_3D_LIGHT_MODEL_BACK_AMBIENT_R :	\
 	 NV20_3D_LIGHT_MODEL_FRONT_AMBIENT_R)
@@ -240,7 +238,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,11 +262,14 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(AMBIENT, side) ?
 				  l->Ambient :
 				  l->_MatAmbient[side]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, SUBC_3D(LIGHT_AMBIENT_R(side, i)), 3);
 		PUSH_DATAp(push, c_light, 3);
@@ -281,16 +282,19 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(DIFFUSE, side) ?
 				  l->Diffuse :
 				  l->_MatDiffuse[side]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, SUBC_3D(LIGHT_DIFFUSE_R(side, i)), 3);
 		PUSH_DATAp(push, c_light, 3);
@@ -302,13 +306,16 @@ 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 = ffs(mask) - 1;
+		struct gl_light *l = &ctx->Light.Light[i];
 		float *c_light = (USE_COLOR_MATERIAL(SPECULAR, side) ?
 				  l->Specular :
 				  l->_MatSpecular[side]);
+		mask ^= (1u << i);
 
 		BEGIN_NV04(push, SUBC_3D(LIGHT_SPECULAR_R(side, i)), 3);
 		PUSH_DATAp(push, c_light, 3);
-- 
2.5.5



More information about the mesa-dev mailing list