Pārlūkot izejas kodu

Resend spot light parameters when part of it changes

tags/pre-merge-glsl-compiler-1
Patrice Mandin pirms 19 gadiem
vecāks
revīzija
65c54a685a
1 mainītis faili ar 61 papildinājumiem un 26 dzēšanām
  1. 61
    26
      src/mesa/drivers/dri/nouveau/nv10_state.c

+ 61
- 26
src/mesa/drivers/dri/nouveau/nv10_state.c Parādīt failu

@@ -326,11 +326,18 @@ static void nv10Hint(GLcontext *ctx, GLenum target, GLenum mode)

// void (*IndexMask)(GLcontext *ctx, GLuint mask);

enum {
SPOTLIGHT_UPDATE_EXPONENT,
SPOTLIGHT_UPDATE_DIRECTION,
SPOTLIGHT_UPDATE_ALL
};

static void nv10Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params )
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
GLint p = light - GL_LIGHT0;
struct gl_light *l = &ctx->Light.Light[p];
int spotlightUpdate = -1;

switch(pname)
{
@@ -352,41 +359,20 @@ static void nv10Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloa
OUT_RING_CACHEf(params[1]);
OUT_RING_CACHEf(params[2]);
break;
case GL_SPOT_DIRECTION:
{
GLfloat x,y,z;
x = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[0];
y = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[1];
z = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[2];
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(p), 3);
OUT_RING_CACHEf(x);
OUT_RING_CACHEf(y);
OUT_RING_CACHEf(z);
}
break;
case GL_POSITION:
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_POSITION_X(p), 3);
OUT_RING_CACHEf(params[0]);
OUT_RING_CACHEf(params[1]);
OUT_RING_CACHEf(params[2]);
break;
case GL_SPOT_DIRECTION:
spotlightUpdate = SPOTLIGHT_UPDATE_DIRECTION;
break;
case GL_SPOT_EXPONENT:
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_EXPONENT(p), 1);
OUT_RING_CACHEf(*params);
spotlightUpdate = SPOTLIGHT_UPDATE_DIRECTION;
break;
case GL_SPOT_CUTOFF:
/* you can't factor these */
{
GLfloat c;
c = -2.0 * (0.5 + l->_CosCutoff);

BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(p), 1);
OUT_RING_CACHEf(params[0]);
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_B(p), 1);
OUT_RING_CACHEf(params[1]);
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_C(p), 1);
OUT_RING_CACHEf(c);
}
spotlightUpdate = SPOTLIGHT_UPDATE_ALL;
break;
case GL_CONSTANT_ATTENUATION:
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_CONSTANT_ATTENUATION(p), 1);
@@ -403,6 +389,55 @@ static void nv10Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloa
default:
break;
}

switch(spotlightUpdate) {
case SPOTLIGHT_UPDATE_DIRECTION:
{
GLfloat x,y,z;
x = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[0];
y = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[1];
z = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[2];
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(p), 3);
OUT_RING_CACHEf(x);
OUT_RING_CACHEf(y);
OUT_RING_CACHEf(z);
}
break;
case SPOTLIGHT_UPDATE_EXPONENT:
{
GLfloat cc,lc,qc;
cc = 1.0; /* These need to be correctly computed */
lc = 0.0;
qc = 2.0;
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(p), 3);
OUT_RING_CACHEf(cc);
OUT_RING_CACHEf(lc);
OUT_RING_CACHEf(qc);
}
break;
case SPOTLIGHT_UPDATE_ALL:
{
GLfloat cc,lc,qc, x,y,z, c;
cc = 1.0; /* These need to be correctly computed */
lc = 0.0;
qc = 2.0;
x = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[0];
y = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[1];
z = -2.0 * (1.0 + l->_CosCutoff) * l->_NormDirection[2];
c = -2.0 * (0.5 + l->_CosCutoff);
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(p), 7);
OUT_RING_CACHEf(cc);
OUT_RING_CACHEf(lc);
OUT_RING_CACHEf(qc);
OUT_RING_CACHEf(x);
OUT_RING_CACHEf(y);
OUT_RING_CACHEf(z);
OUT_RING_CACHEf(c);
}
break;
default:
break;
}
}

/** Set the lighting model parameters */

Notiek ielāde…
Atcelt
Saglabāt