Browse Source

nouveau: Implement much of the fog handling.

tags/pre-merge-glsl-compiler-1
Carlos Martín Nieto 19 years ago
parent
commit
89f91d1804

+ 1
- 0
src/mesa/drivers/dri/nouveau/nouveau_reg.h View File

@@ -1035,6 +1035,7 @@ Object NV30_TCL_PRIMITIVE_3D used on: NV30 NV40 G70
# define NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_OP_ZPASS 0x00000364
# define NV30_TCL_PRIMITIVE_3D_SHADE_MODEL 0x00000368
# define NV30_TCL_PRIMITIVE_3D_FOG_ENABLE 0x0000036c
# define NV30_TCL_PRIMITIVE_3D_FOG_COLOR 0x00000370
# define NV40_TCL_PRIMITIVE_3D_COLOR_MASK_BUFFER123 0x00000370 /* Parameters: buffer3 b buffer3 g buffer3 r buffer3 a buffer2 b buffer2 g buffer2 r buffer2 a buffer1 b buffer1 g buffer1 r buffer1 a */
# define NV30_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE 0x0000037c
# define NV30_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR 0x00000394

+ 60
- 6
src/mesa/drivers/dri/nouveau/nv30_state.c View File

@@ -348,17 +348,71 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
static void nv30Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *params)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);

if (NOUVEAU_CARD_USING_SHADERS)
return;

switch(pname)
{
case GL_FOG_MODE:
//BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_MODE, 1);
//OUT_RING_CACHE (params);
case GL_FOG_MODE:
{
int mode = 0;
/* The modes are different in GL and the card. */
switch(ctx->Fog.Mode)
{
case GL_LINEAR:
mode = 0x804;
break;
/* TODO: unsure about the rest.*/
default:
case GL_EXP:
mode = 0x802;
break;
case GL_EXP2:
mode = 0x803;
break;
}
BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_MODE, 1);
OUT_RING_CACHE (mode);
break;
}
case GL_FOG_COLOR:
{
GLubyte c[4];
UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,params);
BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_COLOR, 1);
/* nvidia ignores the alpha channel */
OUT_RING_CACHE(PACK_COLOR_8888_REV(c[0],c[1],c[2],c[3]));
break;
}
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
{
GLfloat f=0., c=0.;
switch(ctx->Fog.Mode)
{
case GL_LINEAR:
f = -1.0/(ctx->Fog.End - ctx->Fog.Start);
c = ctx->Fog.Start/(ctx->Fog.End - ctx->Fog.Start) + 2.001953;
break;
case GL_EXP:
f = -0.090168*ctx->Fog.Density;
c = 1.5;
case GL_EXP2:
f = -0.212330*ctx->Fog.Density;
c = 1.5;
}
BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_LINEAR, 1);
OUT_RING_CACHE(f);
BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_CONSTANT, 1);
OUT_RING_CACHE(c);
BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_EQUATION_QUADRATIC, 1);
OUT_RING_CACHE(0); /* Is this always the same? */
break;
}
// case GL_FOG_COORD_SRC:
default:
break;
}

}
static void nv30Hint(GLcontext *ctx, GLenum target, GLenum mode)

Loading…
Cancel
Save