summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Miell <[email protected]>2011-09-20 15:20:39 +0200
committerMarek Olšák <[email protected]>2011-11-01 11:37:11 +0100
commit66389bb99d86c8d96c2a7dbd83a5227c0e13e767 (patch)
tree12e97cbfd9ed239245e827c505e1d5fea82c849a
parent64cebb6c8339f515ff8acb7c34fd0615b0e34a19 (diff)
dri/nouveau: Enable NV_fog_distance on NV10 and NV20 hardware
Add support for NV_fog_distance to the NV10 and NV20 drivers. [ Francisco Jerez: Fix fog coord. signedness for GL_EYE_RADIAL_NV/GL_EYE_PLANE on nv20 ]
-rw-r--r--src/mesa/drivers/dri/nouveau/nv10_context.c1
-rw-r--r--src/mesa/drivers/dri/nouveau/nv10_state_tnl.c15
-rw-r--r--src/mesa/drivers/dri/nouveau/nv20_context.c1
-rw-r--r--src/mesa/drivers/dri/nouveau/nv20_state_tnl.c22
4 files changed, 30 insertions, 9 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c b/src/mesa/drivers/dri/nouveau/nv10_context.c
index da0ef2b3cf2..c4dc1c5767a 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_context.c
@@ -435,6 +435,7 @@ nv10_context_create(struct nouveau_screen *screen, const struct gl_config *visua
ctx->Extensions.ARB_texture_env_crossbar = true;
ctx->Extensions.ARB_texture_env_combine = true;
ctx->Extensions.ARB_texture_env_dot3 = true;
+ ctx->Extensions.NV_fog_distance = true;
ctx->Extensions.NV_texture_rectangle = true;
/* GL constants. */
diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
index 96d1b320d86..e21d8f12caf 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
@@ -80,13 +80,22 @@ get_fog_mode(unsigned mode)
}
static unsigned
-get_fog_source(unsigned source)
+get_fog_source(unsigned source, unsigned distance_mode)
{
switch (source) {
case GL_FOG_COORDINATE_EXT:
return NV10_3D_FOG_COORD_FOG;
case GL_FRAGMENT_DEPTH_EXT:
- return NV10_3D_FOG_COORD_DIST_ORTHOGONAL_ABS;
+ switch (distance_mode) {
+ case GL_EYE_PLANE_ABSOLUTE_NV:
+ return NV10_3D_FOG_COORD_DIST_ORTHOGONAL_ABS;
+ case GL_EYE_PLANE:
+ return NV10_3D_FOG_COORD_DIST_ORTHOGONAL;
+ case GL_EYE_RADIAL_NV:
+ return NV10_3D_FOG_COORD_DIST_RADIAL;
+ default:
+ assert(0);
+ }
default:
assert(0);
}
@@ -135,7 +144,7 @@ nv10_emit_fog(struct gl_context *ctx, int emit)
BEGIN_RING(chan, celsius, NV10_3D_FOG_MODE, 4);
OUT_RING(chan, get_fog_mode(f->Mode));
- OUT_RING(chan, get_fog_source(source));
+ OUT_RING(chan, get_fog_source(source, f->FogDistanceMode));
OUT_RINGb(chan, f->Enabled);
OUT_RING(chan, pack_rgba_f(MESA_FORMAT_RGBA8888_REV, f->Color));
diff --git a/src/mesa/drivers/dri/nouveau/nv20_context.c b/src/mesa/drivers/dri/nouveau/nv20_context.c
index 87a6db11967..2a883e31088 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_context.c
@@ -449,6 +449,7 @@ nv20_context_create(struct nouveau_screen *screen, const struct gl_config *visua
ctx->Extensions.ARB_texture_env_crossbar = true;
ctx->Extensions.ARB_texture_env_combine = true;
ctx->Extensions.ARB_texture_env_dot3 = true;
+ ctx->Extensions.NV_fog_distance = true;
ctx->Extensions.NV_texture_rectangle = true;
/* GL constants. */
diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
index 4f7ddd8e49f..638c5f0e37f 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
@@ -127,13 +127,22 @@ get_fog_mode_unsigned(unsigned mode)
}
static unsigned
-get_fog_source(unsigned source)
+get_fog_source(unsigned source, unsigned distance_mode)
{
switch (source) {
case GL_FOG_COORDINATE_EXT:
return NV20_3D_FOG_COORD_FOG;
case GL_FRAGMENT_DEPTH_EXT:
- return NV20_3D_FOG_COORD_DIST_ORTHOGONAL_ABS;
+ switch (distance_mode) {
+ case GL_EYE_PLANE_ABSOLUTE_NV:
+ return NV20_3D_FOG_COORD_DIST_ORTHOGONAL_ABS;
+ case GL_EYE_PLANE:
+ return NV20_3D_FOG_COORD_DIST_ORTHOGONAL;
+ case GL_EYE_RADIAL_NV:
+ return NV20_3D_FOG_COORD_DIST_RADIAL;
+ default:
+ assert(0);
+ }
default:
assert(0);
}
@@ -153,10 +162,11 @@ nv20_emit_fog(struct gl_context *ctx, int emit)
nv10_get_fog_coeff(ctx, k);
BEGIN_RING(chan, kelvin, NV20_3D_FOG_MODE, 4);
- OUT_RING(chan, (source == GL_FOG_COORDINATE_EXT ?
- get_fog_mode_signed(f->Mode) :
- get_fog_mode_unsigned(f->Mode)));
- OUT_RING(chan, get_fog_source(source));
+ OUT_RING(chan, ((source == GL_FRAGMENT_DEPTH_EXT &&
+ f->FogDistanceMode == GL_EYE_PLANE_ABSOLUTE_NV) ?
+ get_fog_mode_unsigned(f->Mode) :
+ get_fog_mode_signed(f->Mode)));
+ OUT_RING(chan, get_fog_source(source, f->FogDistanceMode));
OUT_RINGb(chan, f->Enabled);
OUT_RING(chan, pack_rgba_f(MESA_FORMAT_RGBA8888_REV, f->Color));