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

Add support for NV_fog_distance to the NV10 and NV20 drivers.
---
 src/mesa/drivers/dri/nouveau/nv10_context.c   |    1 +
 src/mesa/drivers/dri/nouveau/nv10_state_tnl.c |   14 +++++++++++---
 src/mesa/drivers/dri/nouveau/nv20_context.c   |    1 +
 src/mesa/drivers/dri/nouveau/nv20_state_tnl.c |   14 +++++++++++---
 4 files changed, 24 insertions(+), 6 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..aa261ec 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_tnl.c
@@ -80,13 +80,21 @@ get_fog_mode(unsigned mode)
 }
 
 static unsigned
-get_fog_source(unsigned source)
+get_fog_source_and_distance_mode(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 +143,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_and_distance_mode(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..eaaec44 100644
--- a/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
+++ b/src/mesa/drivers/dri/nouveau/nv20_state_tnl.c
@@ -127,13 +127,21 @@ get_fog_mode_unsigned(unsigned mode)
 }
 
 static unsigned
-get_fog_source(unsigned source)
+get_fog_source_and_distance_mode(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);
        }
@@ -156,7 +164,7 @@ nv20_emit_fog(struct gl_context *ctx, int emit)
        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, get_fog_source_and_distance_mode(source, 
f->FogDistanceMode));
        OUT_RINGb(chan, f->Enabled);
        OUT_RING(chan, pack_rgba_f(MESA_FORMAT_RGBA8888_REV, f->Color));
 
-- 
1.7.6.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to