X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Ftnl%2Ft_vb_light.c;h=3acedf6e577da2cf644166e8ac538439143107d3;hb=8c1637a4c233fd02a57dee1e38ac87012a04c4c5;hp=d286129650bc4cfb5ff6ff08f3011c711b28e74b;hpb=3db7ae3a38f712a89a44dab8c0f6975250683db0;p=mesa.git diff --git a/src/mesa/tnl/t_vb_light.c b/src/mesa/tnl/t_vb_light.c index d286129650b..3acedf6e577 100644 --- a/src/mesa/tnl/t_vb_light.c +++ b/src/mesa/tnl/t_vb_light.c @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.3 + * Version: 6.5 * - * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -24,13 +24,13 @@ -#include "glheader.h" -#include "colormac.h" -#include "light.h" -#include "macros.h" -#include "imports.h" -#include "simple_list.h" -#include "mtypes.h" +#include "main/glheader.h" +#include "main/colormac.h" +#include "main/light.h" +#include "main/macros.h" +#include "main/imports.h" +#include "main/simple_list.h" +#include "main/mtypes.h" #include "math/m_translate.h" @@ -41,23 +41,29 @@ #define LIGHT_MATERIAL 0x2 #define MAX_LIGHT_FUNC 0x4 -typedef void (*light_func)( GLcontext *ctx, +typedef void (*light_func)( struct gl_context *ctx, struct vertex_buffer *VB, struct tnl_pipeline_stage *stage, GLvector4f *input ); +/** + * Information for updating current material attributes from vertex color, + * for GL_COLOR_MATERIAL. + */ struct material_cursor { - const GLfloat *ptr; - GLuint stride; - GLfloat *current; - GLuint size; /* 1, 2, 3 or 4 */ + const GLfloat *ptr; /* points to src vertex color (in VB array) */ + GLuint stride; /* stride to next vertex color (bytes) */ + GLfloat *current; /* points to material attribute to update */ + GLuint size; /* vertex/color size: 1, 2, 3 or 4 */ }; +/** + * Data private to this pipeline stage. + */ struct light_stage_data { GLvector4f Input; GLvector4f LitColor[2]; GLvector4f LitSecondary[2]; - GLvector4f LitIndex[2]; light_func *light_func_tab; struct material_cursor mat[MAT_ATTRIB_MAX]; @@ -70,55 +76,75 @@ struct light_stage_data { -/* In the case of colormaterial, the effected material attributes +/** + * In the case of colormaterial, the effected material attributes * should already have been bound to point to the incoming color data, * prior to running the pipeline. + * This function copies the vertex's color to the material attributes + * which are tracking glColor. + * It's called per-vertex in the lighting loop. */ -static void update_materials( GLcontext *ctx, - struct light_stage_data *store ) +static void +update_materials(struct gl_context *ctx, struct light_stage_data *store) { GLuint i; for (i = 0 ; i < store->mat_count ; i++) { + /* update the material */ COPY_CLEAN_4V(store->mat[i].current, store->mat[i].size, store->mat[i].ptr); + /* increment src vertex color pointer */ STRIDE_F(store->mat[i].ptr, store->mat[i].stride); } + /* recompute derived light/material values */ _mesa_update_material( ctx, store->mat_bitmask ); + /* XXX we should only call this if we're tracking/changing the specular + * exponent. + */ _mesa_validate_all_lighting_tables( ctx ); } -static GLuint prepare_materials( GLcontext *ctx, - struct vertex_buffer *VB, - struct light_stage_data *store ) + +/** + * Prepare things prior to running the lighting stage. + * Return number of material attributes which will track vertex color. + */ +static GLuint +prepare_materials(struct gl_context *ctx, + struct vertex_buffer *VB, struct light_stage_data *store) { GLuint i; store->mat_count = 0; store->mat_bitmask = 0; - /* If ColorMaterial enabled, overwrite affected AttrPtr's with - * the color pointer. This could be done earlier. + /* Examine the ColorMaterialBitmask to determine which materials + * track vertex color. Override the material attribute's pointer + * with the color pointer for each one. */ if (ctx->Light.ColorMaterialEnabled) { - GLuint bitmask = ctx->Light.ColorMaterialBitmask; + const GLuint bitmask = ctx->Light.ColorMaterialBitmask; for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) if (bitmask & (1<AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->ColorPtr[0]; + VB->AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->AttribPtr[_TNL_ATTRIB_COLOR0]; } - for (i = _TNL_ATTRIB_MAT_FRONT_AMBIENT ; i < _TNL_ATTRIB_INDEX ; i++) { + /* Now, for each material attribute that's tracking vertex color, save + * some values (ptr, stride, size, current) that we'll need in + * update_materials(), above, that'll actually copy the vertex color to + * the material attribute(s). + */ + for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) { if (VB->AttribPtr[i]->stride) { - GLuint j = store->mat_count++; - GLuint attr = i - _TNL_ATTRIB_MAT_FRONT_AMBIENT; + const GLuint j = store->mat_count++; + const GLuint attr = i - _TNL_ATTRIB_MAT_FRONT_AMBIENT; store->mat[j].ptr = VB->AttribPtr[i]->start; store->mat[j].stride = VB->AttribPtr[i]->stride; - store->mat[j].size = VB->AttribPtr[i]->size; + store->mat[j].size = VB->AttribPtr[i]->size; store->mat[j].current = ctx->Light.Material.Attrib[attr]; store->mat_bitmask |= (1<vb; - GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->ObjPtr; + GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->AttribPtr[_TNL_ATTRIB_POS]; GLuint idx; + if (!ctx->Light.Enabled || ctx->VertexProgram._Current) + return GL_TRUE; + /* Make sure we can talk about position x,y and z: */ - if (stage->changed_inputs & _TNL_BIT_POS) { - if (input->size <= 2 && input == VB->ObjPtr) { - - _math_trans_4f( store->Input.data, - VB->ObjPtr->data, - VB->ObjPtr->stride, - GL_FLOAT, - VB->ObjPtr->size, - 0, - VB->Count ); - - if (input->size <= 2) { - /* Clean z. - */ - _mesa_vector4f_clean_elem(&store->Input, VB->Count, 2); - } + if (input->size <= 2 && input == VB->AttribPtr[_TNL_ATTRIB_POS]) { + + _math_trans_4f( store->Input.data, + VB->AttribPtr[_TNL_ATTRIB_POS]->data, + VB->AttribPtr[_TNL_ATTRIB_POS]->stride, + GL_FLOAT, + VB->AttribPtr[_TNL_ATTRIB_POS]->size, + 0, + VB->Count ); + + if (input->size <= 2) { + /* Clean z. + */ + _mesa_vector4f_clean_elem(&store->Input, VB->Count, 2); + } - if (input->size <= 1) { - /* Clean y. - */ - _mesa_vector4f_clean_elem(&store->Input, VB->Count, 1); - } - - input = &store->Input; + if (input->size <= 1) { + /* Clean y. + */ + _mesa_vector4f_clean_elem(&store->Input, VB->Count, 1); } + + input = &store->Input; } idx = 0; @@ -218,37 +244,32 @@ static GLboolean run_lighting( GLcontext *ctx, */ store->light_func_tab[idx]( ctx, VB, stage, input ); - VB->AttribPtr[_TNL_ATTRIB_COLOR0] = VB->ColorPtr[0]; - VB->AttribPtr[_TNL_ATTRIB_COLOR1] = VB->SecondaryColorPtr[0]; - VB->AttribPtr[_TNL_ATTRIB_INDEX] = VB->IndexPtr[0]; - return GL_TRUE; } /* Called in place of do_lighting when the light table may have changed. */ -static GLboolean run_validate_lighting( GLcontext *ctx, +static void validate_lighting( struct gl_context *ctx, struct tnl_pipeline_stage *stage ) { light_func *tab; - if (ctx->Visual.rgbMode) { - if (ctx->Light._NeedVertices) { - if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) - tab = _tnl_light_spec_tab; - else - tab = _tnl_light_tab; - } - else { - if (ctx->Light.EnabledList.next == ctx->Light.EnabledList.prev) - tab = _tnl_light_fast_single_tab; - else - tab = _tnl_light_fast_tab; - } + if (!ctx->Light.Enabled || ctx->VertexProgram._Current) + return; + + if (ctx->Light._NeedVertices) { + if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) + tab = _tnl_light_spec_tab; + else + tab = _tnl_light_tab; + } + else { + if (ctx->Light.EnabledList.next == ctx->Light.EnabledList.prev) + tab = _tnl_light_fast_single_tab; + else + tab = _tnl_light_fast_tab; } - else - tab = _tnl_light_ci_tab; LIGHT_STAGE_DATA(stage)->light_func_tab = tab; @@ -256,11 +277,6 @@ static GLboolean run_validate_lighting( GLcontext *ctx, /* This and the above should only be done on _NEW_LIGHT: */ TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); - - /* Now run the stage... - */ - stage->run = run_lighting; - return stage->run( ctx, stage ); } @@ -268,8 +284,8 @@ static GLboolean run_validate_lighting( GLcontext *ctx, /* Called the first time stage->run is called. In effect, don't * allocate data until the first time the stage is run. */ -static GLboolean run_init_lighting( GLcontext *ctx, - struct tnl_pipeline_stage *stage ) +static GLboolean init_lighting( struct gl_context *ctx, + struct tnl_pipeline_stage *stage ) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct light_stage_data *store; @@ -282,56 +298,24 @@ static GLboolean run_init_lighting( GLcontext *ctx, /* Do onetime init. */ - init_lighting(); + init_lighting_tables(); _mesa_vector4f_alloc( &store->Input, 0, size, 32 ); _mesa_vector4f_alloc( &store->LitColor[0], 0, size, 32 ); _mesa_vector4f_alloc( &store->LitColor[1], 0, size, 32 ); _mesa_vector4f_alloc( &store->LitSecondary[0], 0, size, 32 ); _mesa_vector4f_alloc( &store->LitSecondary[1], 0, size, 32 ); - _mesa_vector4f_alloc( &store->LitIndex[0], 0, size, 32 ); - _mesa_vector4f_alloc( &store->LitIndex[1], 0, size, 32 ); store->LitColor[0].size = 4; store->LitColor[1].size = 4; store->LitSecondary[0].size = 3; store->LitSecondary[1].size = 3; - store->LitIndex[0].size = 1; - store->LitIndex[0].stride = sizeof(GLfloat); - store->LitIndex[1].size = 1; - store->LitIndex[1].stride = sizeof(GLfloat); - - /* Now validate the stage derived data... - */ - stage->run = run_validate_lighting; - return stage->run( ctx, stage ); + return GL_TRUE; } -/* - * Check if lighting is enabled. If so, configure the pipeline stage's - * type, inputs, and outputs. - */ -static void check_lighting( GLcontext *ctx, struct tnl_pipeline_stage *stage ) -{ - stage->active = ctx->Light.Enabled && !ctx->VertexProgram._Enabled; - if (stage->active) { - if (stage->privatePtr) - stage->run = run_validate_lighting; - stage->inputs = _TNL_BIT_NORMAL|_TNL_BITS_MAT_ANY; - if (ctx->Light._NeedVertices) - stage->inputs |= _TNL_BIT_POS; - if (ctx->Light.ColorMaterialEnabled) - stage->inputs |= _TNL_BIT_COLOR0; - - stage->outputs = _TNL_BIT_COLOR0; - if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) - stage->outputs |= _TNL_BIT_COLOR1; - } -} - static void dtr( struct tnl_pipeline_stage *stage ) { @@ -343,8 +327,6 @@ static void dtr( struct tnl_pipeline_stage *stage ) _mesa_vector4f_free( &store->LitColor[1] ); _mesa_vector4f_free( &store->LitSecondary[0] ); _mesa_vector4f_free( &store->LitSecondary[1] ); - _mesa_vector4f_free( &store->LitIndex[0] ); - _mesa_vector4f_free( &store->LitIndex[1] ); FREE( store ); stage->privatePtr = NULL; } @@ -353,16 +335,9 @@ static void dtr( struct tnl_pipeline_stage *stage ) const struct tnl_pipeline_stage _tnl_lighting_stage = { "lighting", /* name */ - _NEW_LIGHT|_NEW_PROGRAM, /* recheck */ - _NEW_LIGHT|_NEW_MODELVIEW, /* recalc -- modelview dependency - * otherwise not captured by inputs - * (which may be _TNL_BIT_POS) */ - GL_FALSE, /* active? */ - 0, /* inputs */ - 0, /* outputs */ - 0, /* changed_inputs */ NULL, /* private_data */ + init_lighting, dtr, /* destroy */ - check_lighting, /* check */ - run_init_lighting /* run -- initially set to ctr */ + validate_lighting, + run_lighting };