[Mesa-dev] [PATCH] dri/nouveau: Enable NV_fog_distance on NV10 and NV20 hardware

Francisco Jerez currojerez at riseup.net
Tue Sep 20 06:20:39 PDT 2011


From: Nicholas Miell <nmiell at gmail.com>

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 ]
---
Nicholas Miell <nmiell at gmail.com> writes:

> This has not been tested on real hardware. I have no idea if it works.

The nv10 implementation is (aside from the long lines) correct, on
nv20 you need to be careful with the fog coordinate signedness.

Fixed patch follows.

 src/mesa/drivers/dri/nouveau/nv10_context.c   |    1 +
 src/mesa/drivers/dri/nouveau/nv10_state_tnl.c |   15 ++++++++++++---
 src/mesa/drivers/dri/nouveau/nv20_context.c   |    1 +
 src/mesa/drivers/dri/nouveau/nv20_state_tnl.c |   22 ++++++++++++++++------
 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 da0ef2b..c4dc1c5 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 96d1b320..e21d8f1 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 87a6db1..2a883e3 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 4f7ddd8..638c5f0 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));
 
-- 
1.7.3.4



More information about the mesa-dev mailing list