From 66389bb99d86c8d96c2a7dbd83a5227c0e13e767 Mon Sep 17 00:00:00 2001 From: Nicholas Miell Date: Tue, 20 Sep 2011 15:20:39 +0200 Subject: [PATCH] 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)); -- 2.7.4