[Mesa-dev] [PATCH 3/5] Add NV_fog_distance to the fixed-function vertex program generator
Brian Paul
brianp at vmware.com
Mon Sep 19 09:52:15 PDT 2011
On 09/19/2011 03:48 AM, Nicholas Miell wrote:
> This is all that is needed to implement NV_fog_distance on programmable
> hardware.
> ---
> src/mesa/main/ffvertex_prog.c | 40 ++++++++++++++++++++++++++++++++++++----
> 1 files changed, 36 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/main/ffvertex_prog.c b/src/mesa/main/ffvertex_prog.c
> index 2d2485c..fc7b01a 100644
> --- a/src/mesa/main/ffvertex_prog.c
> +++ b/src/mesa/main/ffvertex_prog.c
> @@ -61,6 +61,7 @@ struct state_key {
> unsigned rescale_normals:1;
>
> unsigned fog_source_is_depth:1;
> + unsigned fog_distance_mode:2;
> unsigned separate_specular:1;
> unsigned point_attenuated:1;
> unsigned point_array:1;
> @@ -108,7 +109,19 @@ static GLuint translate_texgen( GLboolean enabled, GLenum mode )
> }
> }
>
> +#define FDM_EYE_RADIAL 0
> +#define FDM_EYE_PLANE 1
> +#define FDM_EYE_PLANE_ABS 2
>
> +static GLuint translate_fog_distance_mode( GLenum mode )
> +{
> + switch (mode) {
> + case GL_EYE_RADIAL_NV: return FDM_EYE_RADIAL;
> + case GL_EYE_PLANE: return FDM_EYE_PLANE;
> + default: /* shouldn't happen; fall through to a sensible default */
> + case GL_EYE_PLANE_ABSOLUTE_NV: return FDM_EYE_PLANE_ABS;
> + }
> +}
Please reformat this code to put the case and return statements on
separate lines. Looks good otherwise.
-Brian
> static GLboolean check_active_shininess( struct gl_context *ctx,
> const struct state_key *key,
> @@ -205,8 +218,10 @@ static void make_state_key( struct gl_context *ctx, struct state_key *key )
> if (ctx->Transform.RescaleNormals)
> key->rescale_normals = 1;
>
> - if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH_EXT)
> + if (ctx->Fog.FogCoordinateSource == GL_FRAGMENT_DEPTH_EXT) {
> key->fog_source_is_depth = 1;
> + key->fog_distance_mode = translate_fog_distance_mode(ctx->Fog.FogDistanceMode);
> + }
>
> if (ctx->Point._Attenuated)
> key->point_attenuated = 1;
> @@ -1308,14 +1323,31 @@ static void build_fog( struct tnl_program *p )
> struct ureg input;
>
> if (p->state->fog_source_is_depth) {
> - input = get_eye_position_z(p);
> +
> + switch (p->state->fog_distance_mode) {
> + case FDM_EYE_RADIAL: /* Z = sqrt(Xe*Xe + Ye*Ye + Ze*Ze) */
> + input = get_eye_position(p);
> + emit_op2(p, OPCODE_DP3, fog, WRITEMASK_X, input, input);
> + emit_op1(p, OPCODE_RSQ, fog, WRITEMASK_X, fog);
> + emit_op1(p, OPCODE_RCP, fog, WRITEMASK_X, fog);
> + break;
> + case FDM_EYE_PLANE: /* Z = Ze */
> + input = get_eye_position_z(p);
> + emit_op1(p, OPCODE_MOV, fog, WRITEMASK_X, input);
> + break;
> + case FDM_EYE_PLANE_ABS: /* Z = abs(Ze) */
> + input = get_eye_position_z(p);
> + emit_op1(p, OPCODE_ABS, fog, WRITEMASK_X, input);
> + break;
> + default: assert(0); break; /* can't happen */
> + }
> +
> }
> else {
> input = swizzle1(register_input(p, VERT_ATTRIB_FOG), X);
> + emit_op1(p, OPCODE_ABS, fog, WRITEMASK_X, input);
> }
>
> - /* result.fog = {abs(f),0,0,1}; */
> - emit_op1(p, OPCODE_ABS, fog, WRITEMASK_X, input);
> emit_op1(p, OPCODE_MOV, fog, WRITEMASK_YZW, get_identity_param(p));
> }
>
More information about the mesa-dev
mailing list