mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 22:49:13 +02:00
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 ]
This commit is contained in:
parent
64cebb6c83
commit
66389bb99d
4 changed files with 30 additions and 9 deletions
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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. */
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue