1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/light.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/simple_list.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "math/m_translate.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_context.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_pipeline.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LIGHT_TWOSIDE 0x1 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LIGHT_MATERIAL 0x2 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAX_LIGHT_FUNC 0x4 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*light_func)( struct gl_context *ctx, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *input ); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Information for updating current material attributes from vertex color, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for GL_COLOR_MATERIAL. 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct material_cursor { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *ptr; /* points to src vertex color (in VB array) */ 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stride; /* stride to next vertex color (bytes) */ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *current; /* points to material attribute to update */ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint size; /* vertex/color size: 1, 2, 3 or 4 */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Data private to this pipeline stage. 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct light_stage_data { 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f Input; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f LitColor[2]; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f LitSecondary[2]; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_func *light_func_tab; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct material_cursor mat[MAT_ATTRIB_MAX]; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint mat_count; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint mat_bitmask; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LIGHT_STAGE_DATA(stage) ((struct light_stage_data *)(stage->privatePtr)) 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***** Lighting computation *****/ 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Notes: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When two-sided lighting is enabled we compute the color (or index) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for both the front and back side of the primitive. Then, when the 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * orientation of the facet is later learned, we can determine which 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * color (or index) to use for rendering. 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * KW: We now know orientation in advance and only shade for 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the side or sides which are actually required. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Variables: 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * n = normal vector 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * V = vertex position 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * P = light source position 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pe = (0,0,0,1) 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Precomputed: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IF P[3]==0 THEN 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * // light at infinity 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IF local_viewer THEN 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _VP_inf_norm = unit vector from V to P // Precompute 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ELSE 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * // eye at infinity 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _h_inf_norm = Normalize( VP + <0,0,1> ) // Precompute 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ENDIF 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ENDIF 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Functions: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Normalize( v ) = normalized vector v 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Magnitude( v ) = length of vector v 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_shine_table( struct gl_context *ctx, GLuint side, GLfloat shininess ) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_shine_tab *list = tnl->_ShineTabList; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_shine_tab *s; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(side < 2); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foreach(s, list) 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( s->shininess == shininess ) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s == list) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *m; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org foreach(s, list) 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->refcount == 0) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = s->tab; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[0] = 0.0; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shininess == 0.0) { 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 1 ; j <= SHINE_TABLE_SIZE ; j++) 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[j] = 1.0; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 1 ; j < SHINE_TABLE_SIZE ; j++) { 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLdouble t, x = j / (GLfloat) (SHINE_TABLE_SIZE - 1); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (x < 0.005) /* underflow check */ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x = 0.005; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = pow(x, shininess); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (t > 1e-20) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[j] = (GLfloat) t; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[j] = 0.0; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[SHINE_TABLE_SIZE] = 1.0; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->shininess = shininess; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tnl->_ShineTable[side]) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->_ShineTable[side]->refcount--; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tnl->_ShineTable[side] = s; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org move_to_tail( list, s ); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->refcount++; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_tnl_validate_shine_tables( struct gl_context *ctx ) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat shininess; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shininess = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SHININESS][0]; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tnl->_ShineTable[0] || tnl->_ShineTable[0]->shininess != shininess) 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_shine_table( ctx, 0, shininess ); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shininess = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_SHININESS][0]; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tnl->_ShineTable[1] || tnl->_ShineTable[1]->shininess != shininess) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_shine_table( ctx, 1, shininess ); 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In the case of colormaterial, the effected material attributes 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should already have been bound to point to the incoming color data, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * prior to running the pipeline. 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function copies the vertex's color to the material attributes 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * which are tracking glColor. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It's called per-vertex in the lighting loop. 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgupdate_materials(struct gl_context *ctx, struct light_stage_data *store) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < store->mat_count ; i++) { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* update the material */ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_CLEAN_4V(store->mat[i].current, store->mat[i].size, store->mat[i].ptr); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* increment src vertex color pointer */ 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(store->mat[i].ptr, store->mat[i].stride); 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* recompute derived light/material values */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_material( ctx, store->mat_bitmask ); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX we should only call this if we're tracking/changing the specular 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exponent. 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_validate_shine_tables( ctx ); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Prepare things prior to running the lighting stage. 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return number of material attributes which will track vertex color. 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprepare_materials(struct gl_context *ctx, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB, struct light_stage_data *store) 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat_count = 0; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat_bitmask = 0; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Examine the _ColorMaterialBitmask to determine which materials 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * track vertex color. Override the material attribute's pointer 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with the color pointer for each one. 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.ColorMaterialEnabled) { 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint bitmask = ctx->Light._ColorMaterialBitmask; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bitmask & (1<<i)) 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_MAT_FRONT_AMBIENT + i] = VB->AttribPtr[_TNL_ATTRIB_COLOR0]; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Now, for each material attribute that's tracking vertex color, save 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * some values (ptr, stride, size, current) that we'll need in 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * update_materials(), above, that'll actually copy the vertex color to 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the material attribute(s). 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (VB->AttribPtr[i]->stride) { 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint j = store->mat_count++; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint attr = i - _TNL_ATTRIB_MAT_FRONT_AMBIENT; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat[j].ptr = VB->AttribPtr[i]->start; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat[j].stride = VB->AttribPtr[i]->stride; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat[j].size = VB->AttribPtr[i]->size; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat[j].current = ctx->Light.Material.Attrib[attr]; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->mat_bitmask |= (1<<attr); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FIXME: Is this already done? 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_material( ctx, ~0 ); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _tnl_validate_shine_tables( ctx ); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store->mat_count; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute dp ^ SpecularExponent. 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Lerp between adjacent values in the f(x) lookup table, giving a 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * continuous function, with adequate overall accuracy. (Though still 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pretty good compared to a straight lookup). 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline GLfloat 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglookup_shininess(const struct gl_context *ctx, GLuint face, GLfloat dp) 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tnl_shine_tab *tab = tnl->_ShineTable[face]; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float f = dp * (SHINE_TABLE_SIZE - 1); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int k = (int) f; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (k < 0 /* gcc may cast an overflow float value to negative int value */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || k > SHINE_TABLE_SIZE - 2) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return powf(dp, tab->shininess); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tab->tab[k] + (f - k) * (tab->tab[k+1] - tab->tab[k]); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Tables for all the shading functions. 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic light_func _tnl_light_tab[MAX_LIGHT_FUNC]; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic light_func _tnl_light_fast_tab[MAX_LIGHT_FUNC]; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic light_func _tnl_light_fast_single_tab[MAX_LIGHT_FUNC]; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic light_func _tnl_light_spec_tab[MAX_LIGHT_FUNC]; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IDX (0) 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_vb_lighttmp.h" 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IDX (LIGHT_TWOSIDE) 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_vb_lighttmp.h" 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_material 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IDX (LIGHT_MATERIAL) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_vb_lighttmp.h" 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside_material 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IDX (LIGHT_TWOSIDE|LIGHT_MATERIAL) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_vb_lighttmp.h" 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_lighting_tables( void ) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static int done; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!done) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_light_tab(); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_light_tab_twoside(); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_light_tab_material(); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_light_tab_twoside_material(); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org done = 1; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean run_lighting( struct gl_context *ctx, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &tnl->vb; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *input = ctx->_NeedEyeCoords ? VB->EyePtr : VB->AttribPtr[_TNL_ATTRIB_POS]; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint idx; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Light.Enabled || ctx->VertexProgram._Current) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Make sure we can talk about position x,y and z: 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (input->size <= 2 && input == VB->AttribPtr[_TNL_ATTRIB_POS]) { 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _math_trans_4f( store->Input.data, 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_POS]->data, 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_POS]->stride, 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FLOAT, 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_POS]->size, 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->Count ); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (input->size <= 2) { 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clean z. 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_clean_elem(&store->Input, VB->Count, 2); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (input->size <= 1) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clean y. 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_clean_elem(&store->Input, VB->Count, 1); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org input = &store->Input; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx = 0; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prepare_materials( ctx, VB, store )) 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx |= LIGHT_MATERIAL; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Model.TwoSide) 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx |= LIGHT_TWOSIDE; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The individual functions know about replaying side-effects 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vs. full re-execution. 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->light_func_tab[idx]( ctx, VB, stage, input ); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Called in place of do_lighting when the light table may have changed. 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void validate_lighting( struct gl_context *ctx, 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org light_func *tab; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Light.Enabled || ctx->VertexProgram._Current) 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light._NeedVertices) { 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tab = _tnl_light_spec_tab; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tab = _tnl_light_tab; 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Light.EnabledList.next == ctx->Light.EnabledList.prev) 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tab = _tnl_light_fast_single_tab; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tab = _tnl_light_fast_tab; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIGHT_STAGE_DATA(stage)->light_func_tab = tab; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This and the above should only be done on _NEW_LIGHT: 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNL_CONTEXT(ctx)->Driver.NotifyMaterialChange( ctx ); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Called the first time stage->run is called. In effect, don't 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * allocate data until the first time the stage is run. 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean init_lighting( struct gl_context *ctx, 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct light_stage_data *store; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint size = tnl->vb.Size; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->privatePtr = MALLOC(sizeof(*store)); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store = LIGHT_STAGE_DATA(stage); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!store) 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do onetime init. 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_lighting_tables(); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->Input, 0, size, 32 ); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->LitColor[0], 0, size, 32 ); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->LitColor[1], 0, size, 32 ); 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->LitSecondary[0], 0, size, 32 ); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->LitSecondary[1], 0, size, 32 ); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->LitColor[0].size = 4; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->LitColor[1].size = 4; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->LitSecondary[0].size = 3; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->LitSecondary[1].size = 3; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void dtr( struct tnl_pipeline_stage *stage ) 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct light_stage_data *store = LIGHT_STAGE_DATA(stage); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (store) { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->Input ); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->LitColor[0] ); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->LitColor[1] ); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->LitSecondary[0] ); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->LitSecondary[1] ); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( store ); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->privatePtr = NULL; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct tnl_pipeline_stage _tnl_lighting_stage = 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "lighting", /* name */ 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, /* private_data */ 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_lighting, 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dtr, /* destroy */ 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_lighting, 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org run_lighting 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 474