#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)
static void
nouveau_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
{
- int i;
+ GLbitfield mask;
switch (cap) {
case GL_ALPHA_TEST:
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);
#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)
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);
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]);
{
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]);
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]);
#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 : \
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)]);
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]);
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]);
{
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]);