Mesa (master): dri/nouveau: Enable NV_fog_distance on NV10 and NV20 hardware

Marek Olšák mareko at kemper.freedesktop.org
Tue Nov 1 10:40:28 UTC 2011


Module: Mesa
Branch: master
Commit: 66389bb99d86c8d96c2a7dbd83a5227c0e13e767
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=66389bb99d86c8d96c2a7dbd83a5227c0e13e767

Author: Nicholas Miell <nmiell at gmail.com>
Date:   Tue Sep 20 15:20:39 2011 +0200

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 ]

---

 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 96d1b32..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));
 




More information about the mesa-commit mailing list