100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/* 200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Mesa 3-D graphics library 3a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * Version: 7.1 400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 5b7978af6936d186112727cb9858fe7740eef1a7cBrian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Permission is hereby granted, free of charge, to any person obtaining a 800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * copy of this software and associated documentation files (the "Software"), 900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * to deal in the Software without restriction, including without limitation 1000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and/or sell copies of the Software, and to permit persons to whom the 1200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Software is furnished to do so, subject to the following conditions: 1300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The above copyright notice and this permission notice shall be included 1500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * in all copies or substantial portions of the Software. 1600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 2400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 2500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 2600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \file prog_statevars.c 2700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Program state variable management. 2800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \author Brian Paul 2900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 3000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 32bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 33bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 34bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 35bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h" 36bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h" 37284ad9c3b29a6d6f0bade050ea9e949d67967983Paul Berry#include "main/fbobject.h" 3800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_statevars.h" 3900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_parameter.h" 40ae58f9696c5f82c98767b3f244b2ad4b966905e5Pauli Nieminen#include "main/samplerobj.h" 4100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 4400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Use the list of tokens in the state[] array to find global GL state 4500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and return it in <value>. Usually, four values are returned in <value> 4600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * but matrix queries may return as many as 16 values. 4700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * This function is used for ARB vertex/fragment programs. 4800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The program parser will produce the state[] values. 4900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 5000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 51f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[], 5200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLfloat *value) 5300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 5400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[0]) { 5500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATERIAL: 5600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 5700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] is either 0=front or 1=back side */ 5800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint face = (GLuint) state[1]; 5900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const struct gl_material *mat = &ctx->Light.Material; 6000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ASSERT(face == 0 || face == 1); 6100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* we rely on tokens numbered so that _BACK_ == _FRONT_+ 1 */ 6200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ASSERT(MAT_ATTRIB_FRONT_AMBIENT + 1 == MAT_ATTRIB_BACK_AMBIENT); 6300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* XXX we could get rid of this switch entirely with a little 6400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * work in arbprogparse.c's parse_state_single_item(). 6500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 6600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] is the material attribute */ 6700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[2]) { 6800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_AMBIENT: 6900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_AMBIENT + face]); 7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DIFFUSE: 7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_DIFFUSE + face]); 7300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 7400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPECULAR: 7500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_SPECULAR + face]); 7600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 7700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_EMISSION: 7800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_EMISSION + face]); 7900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 8000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SHININESS: 8100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[0] = mat->Attrib[MAT_ATTRIB_FRONT_SHININESS + face][0]; 8200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[1] = 0.0F; 8300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[2] = 0.0F; 8400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = 1.0F; 8500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 8600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Invalid material state in fetch_state"); 8800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 8900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 9000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 9100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHT: 9200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 9300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] is the light number */ 9400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint ln = (GLuint) state[1]; 9500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] is the light attribute */ 9600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[2]) { 9700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_AMBIENT: 9800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Light.Light[ln].Ambient); 9900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 10000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DIFFUSE: 10100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Light.Light[ln].Diffuse); 10200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 10300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPECULAR: 10400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Light.Light[ln].Specular); 10500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 10600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_POSITION: 10700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Light.Light[ln].EyePosition); 10800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 10900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_ATTENUATION: 11000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[0] = ctx->Light.Light[ln].ConstantAttenuation; 11100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[1] = ctx->Light.Light[ln].LinearAttenuation; 11200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[2] = ctx->Light.Light[ln].QuadraticAttenuation; 11300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = ctx->Light.Light[ln].SpotExponent; 11400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 11500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPOT_DIRECTION: 1167391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul COPY_3V(value, ctx->Light.Light[ln].SpotDirection); 11700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = ctx->Light.Light[ln]._CosCutoff; 11800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 119f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_SPOT_CUTOFF: 120f958aabdf3e3dc82827628cab97b159bd5089651Brian value[0] = ctx->Light.Light[ln].SpotCutoff; 121f958aabdf3e3dc82827628cab97b159bd5089651Brian return; 122f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_HALF_VECTOR: 12300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 1244fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian static const GLfloat eye_z[] = {0, 0, 1}; 1254fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian GLfloat p[3]; 12600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* Compute infinite half angle vector: 1274fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian * halfVector = normalize(normalize(lightPos) + (0, 0, 1)) 12800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * light.EyePosition.w should be 0 for infinite lights. 12900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 1304fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian COPY_3V(p, ctx->Light.Light[ln].EyePosition); 1314fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian NORMALIZE_3FV(p); 1324fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian ADD_3V(value, p, eye_z); 13300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian NORMALIZE_3FV(value); 1344fca6bfa5d211a093c54b0bbeadaa38081e8c141Brian value[3] = 1.0; 135c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle } 13600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 13700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 13800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Invalid light state in fetch_state"); 13900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 14000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 14100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 14200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_AMBIENT: 14300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Light.Model.Ambient); 14400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 14500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_SCENECOLOR: 14600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (state[1] == 0) { 14700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* front */ 14800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLint i; 14900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < 3; i++) { 15000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i] = ctx->Light.Model.Ambient[i] 15100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT][i] 15200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian + ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION][i]; 15300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 15400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 15500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 15600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 15700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* back */ 15800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLint i; 15900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < 3; i++) { 16000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i] = ctx->Light.Model.Ambient[i] 16100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_AMBIENT][i] 16200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian + ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_EMISSION][i]; 16300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 16400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 16500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 16600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 16700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTPROD: 16800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 16900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint ln = (GLuint) state[1]; 17000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint face = (GLuint) state[2]; 17100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLint i; 17200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ASSERT(face == 0 || face == 1); 17300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[3]) { 17400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_AMBIENT: 17500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < 3; i++) { 17600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i] = ctx->Light.Light[ln].Ambient[i] * 17700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i]; 17800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 17900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* [3] = material alpha */ 180142fcd3a13bcac37b8b0124f68854d515f2596fcRoland Scheidegger value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3]; 18100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 18200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DIFFUSE: 18300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < 3; i++) { 18400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i] = ctx->Light.Light[ln].Diffuse[i] * 18500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][i]; 18600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 18700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* [3] = material alpha */ 18800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3]; 18900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 19000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPECULAR: 19100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < 3; i++) { 19200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i] = ctx->Light.Light[ln].Specular[i] * 19300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i]; 19400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 19500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* [3] = material alpha */ 196142fcd3a13bcac37b8b0124f68854d515f2596fcRoland Scheidegger value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3]; 19700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 19800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 19900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Invalid lightprod state in fetch_state"); 20000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 20100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 20200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 20300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN: 20400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 20500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] is the texture unit */ 20600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint unit = (GLuint) state[1]; 20700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] is the texgen attribute */ 20800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[2]) { 20900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_S: 2109705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenS.EyePlane); 21100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 21200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_T: 2139705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenT.EyePlane); 21400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 21500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_R: 2169705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenR.EyePlane); 21700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 21800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_Q: 2199705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenQ.EyePlane); 22000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 22100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_S: 2229705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenS.ObjectPlane); 22300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 22400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_T: 2259705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenT.ObjectPlane); 22600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 22700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_R: 2289705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenR.ObjectPlane); 22900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 23000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_Q: 2319705cff2033f1771a39ac3bb78eb5fcea522218aBrian Paul COPY_4V(value, ctx->Texture.Unit[unit].GenQ.ObjectPlane); 23200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 23300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 23400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Invalid texgen state in fetch_state"); 23500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 23600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 23700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 23800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXENV_COLOR: 239c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle { 24000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] is the texture unit */ 24100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint unit = (GLuint) state[1]; 242e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if(ctx->Color._ClampFragmentColor) 243e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4V(value, ctx->Texture.Unit[unit].EnvColor); 244e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák else 245e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4V(value, ctx->Texture.Unit[unit].EnvColorUnclamped); 246c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle } 24700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 248776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_FOG_COLOR: 249e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if(ctx->Color._ClampFragmentColor) 250e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4V(value, ctx->Fog.Color); 251e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák else 252e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4V(value, ctx->Fog.ColorUnclamped); 253776bc9cf55b116e17dddde4d097985b51879c83fBrian return; 254776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_FOG_PARAMS: 255776bc9cf55b116e17dddde4d097985b51879c83fBrian value[0] = ctx->Fog.Density; 256776bc9cf55b116e17dddde4d097985b51879c83fBrian value[1] = ctx->Fog.Start; 257776bc9cf55b116e17dddde4d097985b51879c83fBrian value[2] = ctx->Fog.End; 2585976a6a75cfa6749db306111a601d99c99cc00a4Brian Paul value[3] = (ctx->Fog.End == ctx->Fog.Start) 259016701f6860a840e079cb4c5f844a8cced712cd8Brian Paul ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start)); 26000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 26100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_CLIPPLANE: 26200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 26300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLuint plane = (GLuint) state[1]; 26400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->Transform.EyeUserPlane[plane]); 26500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 26600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 267776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_POINT_SIZE: 268776bc9cf55b116e17dddde4d097985b51879c83fBrian value[0] = ctx->Point.Size; 269776bc9cf55b116e17dddde4d097985b51879c83fBrian value[1] = ctx->Point.MinSize; 270776bc9cf55b116e17dddde4d097985b51879c83fBrian value[2] = ctx->Point.MaxSize; 271776bc9cf55b116e17dddde4d097985b51879c83fBrian value[3] = ctx->Point.Threshold; 272776bc9cf55b116e17dddde4d097985b51879c83fBrian return; 273776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_POINT_ATTENUATION: 274776bc9cf55b116e17dddde4d097985b51879c83fBrian value[0] = ctx->Point.Params[0]; 275776bc9cf55b116e17dddde4d097985b51879c83fBrian value[1] = ctx->Point.Params[1]; 276776bc9cf55b116e17dddde4d097985b51879c83fBrian value[2] = ctx->Point.Params[2]; 277776bc9cf55b116e17dddde4d097985b51879c83fBrian value[3] = 1.0F; 27800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 2796531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MODELVIEW_MATRIX: 2806531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROJECTION_MATRIX: 2816531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MVP_MATRIX: 2826531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_TEXTURE_MATRIX: 2836531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROGRAM_MATRIX: 28400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 285fb3f0beb42868cef6ee78385164fb9605820c365Brian /* state[0] = modelview, projection, texture, etc. */ 286fb3f0beb42868cef6ee78385164fb9605820c365Brian /* state[1] = which texture matrix or program matrix */ 287fb3f0beb42868cef6ee78385164fb9605820c365Brian /* state[2] = first row to fetch */ 288fb3f0beb42868cef6ee78385164fb9605820c365Brian /* state[3] = last row to fetch */ 289fb3f0beb42868cef6ee78385164fb9605820c365Brian /* state[4] = transpose, inverse or invtrans */ 29000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLmatrix *matrix; 2916531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const gl_state_index mat = state[0]; 2926531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint index = (GLuint) state[1]; 2936531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint firstRow = (GLuint) state[2]; 2946531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint lastRow = (GLuint) state[3]; 2956531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const gl_state_index modifier = state[4]; 29600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const GLfloat *m; 29700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint row, i; 2986531952b3c979be0dc95704beb3c3b9dad1dc37bBrian ASSERT(firstRow >= 0); 2996531952b3c979be0dc95704beb3c3b9dad1dc37bBrian ASSERT(firstRow < 4); 3006531952b3c979be0dc95704beb3c3b9dad1dc37bBrian ASSERT(lastRow >= 0); 3016531952b3c979be0dc95704beb3c3b9dad1dc37bBrian ASSERT(lastRow < 4); 3026531952b3c979be0dc95704beb3c3b9dad1dc37bBrian if (mat == STATE_MODELVIEW_MATRIX) { 30300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian matrix = ctx->ModelviewMatrixStack.Top; 30400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 3056531952b3c979be0dc95704beb3c3b9dad1dc37bBrian else if (mat == STATE_PROJECTION_MATRIX) { 30600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian matrix = ctx->ProjectionMatrixStack.Top; 30700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 3086531952b3c979be0dc95704beb3c3b9dad1dc37bBrian else if (mat == STATE_MVP_MATRIX) { 30900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian matrix = &ctx->_ModelProjectMatrix; 31000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 3116531952b3c979be0dc95704beb3c3b9dad1dc37bBrian else if (mat == STATE_TEXTURE_MATRIX) { 31260527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul ASSERT(index < Elements(ctx->TextureMatrixStack)); 31300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian matrix = ctx->TextureMatrixStack[index].Top; 31400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 3156531952b3c979be0dc95704beb3c3b9dad1dc37bBrian else if (mat == STATE_PROGRAM_MATRIX) { 31660527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul ASSERT(index < Elements(ctx->ProgramMatrixStack)); 31700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian matrix = ctx->ProgramMatrixStack[index].Top; 31800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 31900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 32000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Bad matrix name in _mesa_fetch_state()"); 32100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 32200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 32300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (modifier == STATE_MATRIX_INVERSE || 32400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian modifier == STATE_MATRIX_INVTRANS) { 32500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* Be sure inverse is up to date: 32600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 32700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _math_matrix_analyse( (GLmatrix*) matrix ); 32800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian m = matrix->inv; 32900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 33000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 33100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian m = matrix->m; 33200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 33300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (modifier == STATE_MATRIX_TRANSPOSE || 33400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian modifier == STATE_MATRIX_INVTRANS) { 33500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0, row = firstRow; row <= lastRow; row++) { 33600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row * 4 + 0]; 33700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row * 4 + 1]; 33800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row * 4 + 2]; 33900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row * 4 + 3]; 34000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 34100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 34200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 34300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0, row = firstRow; row <= lastRow; row++) { 34400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row + 0]; 34500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row + 4]; 34600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row + 8]; 34700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[i++] = m[row + 12]; 34800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 34900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 35000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 35100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 35200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DEPTH_RANGE: 35300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[0] = ctx->Viewport.Near; /* near */ 35400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[1] = ctx->Viewport.Far; /* far */ 35500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */ 356642d5ee8c51cdbab2b498c3413f29023f8ece929Roland Scheidegger value[3] = 1.0; 35700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 35800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FRAGMENT_PROGRAM: 35900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 36000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] = {STATE_ENV, STATE_LOCAL} */ 36100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] = parameter index */ 36200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const int idx = (int) state[2]; 36300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[1]) { 36400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_ENV: 36500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->FragmentProgram.Parameters[idx]); 366f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 36700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LOCAL: 36800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]); 369f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 37000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 37100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); 37200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 37300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 37400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 37500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 376c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle 37700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_VERTEX_PROGRAM: 37800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 37900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] = {STATE_ENV, STATE_LOCAL} */ 38000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] = parameter index */ 38100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const int idx = (int) state[2]; 38200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[1]) { 38300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_ENV: 38400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->VertexProgram.Parameters[idx]); 385f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 38600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LOCAL: 38700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]); 388f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 38900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 39000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); 39100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 39200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 39300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 39400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 39500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 396f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_NORMAL_SCALE: 397f958aabdf3e3dc82827628cab97b159bd5089651Brian ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1); 398f958aabdf3e3dc82827628cab97b159bd5089651Brian return; 399f958aabdf3e3dc82827628cab97b159bd5089651Brian 40000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_INTERNAL: 401fbc4929185ca1dc7d729ec737095ef0895f5b570Brian switch (state[1]) { 402f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul case STATE_CURRENT_ATTRIB: 403f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul { 404f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul const GLuint idx = (GLuint) state[2]; 405f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul COPY_4V(value, ctx->Current.Attrib[idx]); 406f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul } 407fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell return; 408fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell 409e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED: 410e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák { 411e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák const GLuint idx = (GLuint) state[2]; 412e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák if(ctx->Light._ClampVertexColor && 413e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák (idx == VERT_ATTRIB_COLOR0 || 414e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák idx == VERT_ATTRIB_COLOR1)) { 415e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák value[0] = CLAMP(ctx->Current.Attrib[idx][0], 0.0f, 1.0f); 416e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák value[1] = CLAMP(ctx->Current.Attrib[idx][1], 0.0f, 1.0f); 417e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák value[2] = CLAMP(ctx->Current.Attrib[idx][2], 0.0f, 1.0f); 418e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák value[3] = CLAMP(ctx->Current.Attrib[idx][3], 0.0f, 1.0f); 419e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák } 420e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák else 421e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák COPY_4V(value, ctx->Current.Attrib[idx]); 422e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák } 423e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák return; 424e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák 425fbc4929185ca1dc7d729ec737095ef0895f5b570Brian case STATE_NORMAL_SCALE: 42632ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell ASSIGN_4V(value, 42732ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell ctx->_ModelViewInvScale, 42832ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell ctx->_ModelViewInvScale, 42932ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell ctx->_ModelViewInvScale, 43032ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 1); 431fbc4929185ca1dc7d729ec737095ef0895f5b570Brian return; 432f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul 433fbc4929185ca1dc7d729ec737095ef0895f5b570Brian case STATE_TEXRECT_SCALE: 434f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* Value = { 1/texWidth, 1/texHeight, 0, 1 }. 435f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul * Used to convert unnormalized texcoords to normalized texcoords. 436f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul */ 437fbc4929185ca1dc7d729ec737095ef0895f5b570Brian { 438fbc4929185ca1dc7d729ec737095ef0895f5b570Brian const int unit = (int) state[2]; 439fbc4929185ca1dc7d729ec737095ef0895f5b570Brian const struct gl_texture_object *texObj 440fbc4929185ca1dc7d729ec737095ef0895f5b570Brian = ctx->Texture.Unit[unit]._Current; 441fbc4929185ca1dc7d729ec737095ef0895f5b570Brian if (texObj) { 442fbc4929185ca1dc7d729ec737095ef0895f5b570Brian struct gl_texture_image *texImage = texObj->Image[0][0]; 443f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul ASSIGN_4V(value, 444f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul (GLfloat) (1.0 / texImage->Width), 445f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul (GLfloat) (1.0 / texImage->Height), 446016701f6860a840e079cb4c5f844a8cced712cd8Brian Paul 0.0f, 1.0f); 447fbc4929185ca1dc7d729ec737095ef0895f5b570Brian } 44800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 449fbc4929185ca1dc7d729ec737095ef0895f5b570Brian return; 450f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul 451fbc4929185ca1dc7d729ec737095ef0895f5b570Brian case STATE_FOG_PARAMS_OPTIMIZED: 452fbc4929185ca1dc7d729ec737095ef0895f5b570Brian /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog) 453fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * might be more expensive than EX2 on some hw, plus it needs 454fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * another constant (e) anyway. Linear fog can now be done with a 455fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * single MAD. 456fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * linear: fogcoord * -1/(end-start) + end/(end-start) 457fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * exp: 2^-(density/ln(2) * fogcoord) 458fbc4929185ca1dc7d729ec737095ef0895f5b570Brian * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2) 459fbc4929185ca1dc7d729ec737095ef0895f5b570Brian */ 46088c0a7463328ef47106ea0afbeb148ebd4e6d067Brian Paul value[0] = (ctx->Fog.End == ctx->Fog.Start) 461016701f6860a840e079cb4c5f844a8cced712cd8Brian Paul ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start)); 46288c0a7463328ef47106ea0afbeb148ebd4e6d067Brian Paul value[1] = ctx->Fog.End * -value[0]; 463ebc0b2dca0eb6510189d433851bd475475e69aa6Matt Turner value[2] = (GLfloat)(ctx->Fog.Density * M_LOG2E); /* M_LOG2E == 1/ln(2) */ 464452a592ca4b1bac78eee53fb9f2f1deac7832840José Fonseca value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2); 465fbc4929185ca1dc7d729ec737095ef0895f5b570Brian return; 46632ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 4672c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger case STATE_POINT_SIZE_CLAMPED: 4682c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger { 4692c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger /* this includes implementation dependent limits, to avoid 4702c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * another potentially necessary clamp. 4712c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * Note: for sprites, point smooth (point AA) is ignored 4722c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * and we'll clamp to MinPointSizeAA and MaxPointSize, because we 4732c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * expect drivers will want to say their minimum for AA size is 0.0 4742c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * but for non-AA it's 1.0 (because normal points with size below 1.0 4752c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * need to get rounded up to 1.0, hence never disappear). GL does 4762c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * not specify max clamp size for sprites, other than it needs to be 4772c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * at least as large as max AA size, hence use non-AA size there. 4782c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger */ 4792c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger GLfloat minImplSize; 4802c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger GLfloat maxImplSize; 4812c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger if (ctx->Point.PointSprite) { 4822c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger minImplSize = ctx->Const.MinPointSizeAA; 4832c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger maxImplSize = ctx->Const.MaxPointSize; 4842c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 4852c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) { 4862c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger minImplSize = ctx->Const.MinPointSizeAA; 4872c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger maxImplSize = ctx->Const.MaxPointSizeAA; 4882c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 4892c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger else { 4902c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger minImplSize = ctx->Const.MinPointSize; 4912c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger maxImplSize = ctx->Const.MaxPointSize; 4922c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 4932c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger value[0] = ctx->Point.Size; 4942c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger value[1] = ctx->Point.MinSize >= minImplSize ? ctx->Point.MinSize : minImplSize; 4952c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger value[2] = ctx->Point.MaxSize <= maxImplSize ? ctx->Point.MaxSize : maxImplSize; 4962c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger value[3] = ctx->Point.Threshold; 4972c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 4982c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger return; 499f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul case STATE_LIGHT_SPOT_DIR_NORMALIZED: 500f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul { 501f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* here, state[2] is the light number */ 502f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* pre-normalize spot dir */ 503f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul const GLuint ln = (GLuint) state[2]; 5047391ba1e9d81f15465059db25d1279eefdbeb1a9Brian Paul COPY_3V(value, ctx->Light.Light[ln]._NormSpotDirection); 505f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul value[3] = ctx->Light.Light[ln]._CosCutoff; 506f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul } 507fbc4929185ca1dc7d729ec737095ef0895f5b570Brian return; 50832ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 509f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul case STATE_LIGHT_POSITION: 510f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul { 511f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul const GLuint ln = (GLuint) state[2]; 512f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul COPY_4V(value, ctx->Light.Light[ln]._Position); 513f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul } 51432ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell return; 51532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 516f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul case STATE_LIGHT_POSITION_NORMALIZED: 517f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul { 518f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul const GLuint ln = (GLuint) state[2]; 519f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul COPY_4V(value, ctx->Light.Light[ln]._Position); 520f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul NORMALIZE_3FV( value ); 521f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul } 52232ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell return; 52332ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 524f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul case STATE_LIGHT_HALF_VECTOR: 525f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul { 526f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul const GLuint ln = (GLuint) state[2]; 527f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul GLfloat p[3]; 528f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* Compute infinite half angle vector: 529f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul * halfVector = normalize(normalize(lightPos) + (0, 0, 1)) 530f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul * light.EyePosition.w should be 0 for infinite lights. 531f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul */ 532f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul COPY_3V(p, ctx->Light.Light[ln]._Position); 533f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul NORMALIZE_3FV(p); 534f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul ADD_3V(value, p, ctx->_EyeZDir); 535f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul NORMALIZE_3FV(value); 536f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul value[3] = 1.0; 537f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul } 53832ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell return; 53932ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell 5402f8fc325aca43693aac368ae5781547cc976d387Brian Paul case STATE_PT_SCALE: 5412f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[0] = ctx->Pixel.RedScale; 5422f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[1] = ctx->Pixel.GreenScale; 5432f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[2] = ctx->Pixel.BlueScale; 5442f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[3] = ctx->Pixel.AlphaScale; 545f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 546f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul 5472f8fc325aca43693aac368ae5781547cc976d387Brian Paul case STATE_PT_BIAS: 5482f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[0] = ctx->Pixel.RedBias; 5492f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[1] = ctx->Pixel.GreenBias; 5502f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[2] = ctx->Pixel.BlueBias; 5512f8fc325aca43693aac368ae5781547cc976d387Brian Paul value[3] = ctx->Pixel.AlphaBias; 552f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 553f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul 5541f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul case STATE_FB_SIZE: 5551f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul value[0] = (GLfloat) (ctx->DrawBuffer->Width - 1); 5561f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1); 5571f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul value[2] = 0.0F; 5581f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul value[3] = 0.0F; 5591f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul return; 5601f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul 561d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák case STATE_FB_WPOS_Y_TRANSFORM: 562d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* A driver may negate this conditional by using ZW swizzle 563d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * instead of XY (based on e.g. some other state). */ 564284ad9c3b29a6d6f0bade050ea9e949d67967983Paul Berry if (_mesa_is_user_fbo(ctx->DrawBuffer)) { 565d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* Identity (XY) followed by flipping Y upside down (ZW). */ 566d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[0] = 1.0F; 567d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[1] = 0.0F; 568d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[2] = -1.0F; 569f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller value[3] = (GLfloat) ctx->DrawBuffer->Height; 570d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } else { 571d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* Flipping Y upside down (XY) followed by identity (ZW). */ 572d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[0] = -1.0F; 573f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller value[1] = (GLfloat) ctx->DrawBuffer->Height; 574d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[2] = 1.0F; 575d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák value[3] = 0.0F; 576d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } 577d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák return; 578d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák 579114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_0: 580114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger { 581114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const int unit = (int) state[2]; 582114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix; 583114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[0] = rotMat22[0]; 584114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[1] = rotMat22[2]; 585114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[2] = 0.0; 586114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[3] = 0.0; 587114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 588f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 589f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul 590114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_1: 591114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger { 592114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const int unit = (int) state[2]; 593114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix; 594114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[0] = rotMat22[1]; 595114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[1] = rotMat22[3]; 596114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[2] = 0.0; 597114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger value[3] = 0.0; 598114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 599f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul return; 600c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle 601f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* XXX: make sure new tokens added here are also handled in the 602f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul * _mesa_program_state_flags() switch, below. 603f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul */ 604fbc4929185ca1dc7d729ec737095ef0895f5b570Brian default: 605f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul /* Unknown state indexes are silently ignored here. 606f5a4d20e4aafce04773729dc2dd6175e9538d887Brian Paul * Drivers may do something special. 607fbc4929185ca1dc7d729ec737095ef0895f5b570Brian */ 608fbc4929185ca1dc7d729ec737095ef0895f5b570Brian return; 60900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 61000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 61100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 61200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 61300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(ctx, "Invalid state in _mesa_fetch_state"); 61400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return; 61500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 61600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 61700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 61800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 61900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 62000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Return a bitmask of the Mesa state flags (_NEW_* values) which would 62100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * indicate that the given context state may have changed. 62200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The bitmask is used during validation to determine if we need to update 62300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * vertex/fragment program parameters (like "state.material.color") when 62400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * some GL state has changed. 62500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 62600cdc0a472c55330cbc58317f01b07f8f90be5a5BrianGLbitfield 627aa9d22a1c0f3256497088985c290d4046e089456Brian_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]) 62800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 62900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[0]) { 63000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATERIAL: 63157169c469406f1880107a6b9f052708ce078942dBrian Paul case STATE_LIGHTPROD: 63257169c469406f1880107a6b9f052708ce078942dBrian Paul case STATE_LIGHTMODEL_SCENECOLOR: 63357169c469406f1880107a6b9f052708ce078942dBrian Paul /* these can be effected by glColor when colormaterial mode is used */ 63457169c469406f1880107a6b9f052708ce078942dBrian Paul return _NEW_LIGHT | _NEW_CURRENT_ATTRIB; 63557169c469406f1880107a6b9f052708ce078942dBrian Paul 63600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHT: 63700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_AMBIENT: 63800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_LIGHT; 63900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 64000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN: 64100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_TEXTURE; 642e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák case STATE_TEXENV_COLOR: 643e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák return _NEW_TEXTURE | _NEW_BUFFERS | _NEW_FRAG_CLAMP; 64400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 64500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FOG_COLOR: 646e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák return _NEW_FOG | _NEW_BUFFERS | _NEW_FRAG_CLAMP; 64700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FOG_PARAMS: 64800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_FOG; 64900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 65000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_CLIPPLANE: 65100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_TRANSFORM; 65200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 653776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_POINT_SIZE: 654776bc9cf55b116e17dddde4d097985b51879c83fBrian case STATE_POINT_ATTENUATION: 65500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_POINT; 65600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 6576531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MODELVIEW_MATRIX: 6586531952b3c979be0dc95704beb3c3b9dad1dc37bBrian return _NEW_MODELVIEW; 6596531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROJECTION_MATRIX: 6606531952b3c979be0dc95704beb3c3b9dad1dc37bBrian return _NEW_PROJECTION; 6616531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MVP_MATRIX: 6626531952b3c979be0dc95704beb3c3b9dad1dc37bBrian return _NEW_MODELVIEW | _NEW_PROJECTION; 6636531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_TEXTURE_MATRIX: 6646531952b3c979be0dc95704beb3c3b9dad1dc37bBrian return _NEW_TEXTURE_MATRIX; 6656531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROGRAM_MATRIX: 6666531952b3c979be0dc95704beb3c3b9dad1dc37bBrian return _NEW_TRACK_MATRIX; 66700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 66800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DEPTH_RANGE: 66900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_VIEWPORT; 67000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 67100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FRAGMENT_PROGRAM: 67200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_VERTEX_PROGRAM: 67300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_PROGRAM; 67400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 675f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_NORMAL_SCALE: 676f958aabdf3e3dc82827628cab97b159bd5089651Brian return _NEW_MODELVIEW; 677f958aabdf3e3dc82827628cab97b159bd5089651Brian 67800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_INTERNAL: 67900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[1]) { 680fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell case STATE_CURRENT_ATTRIB: 681fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell return _NEW_CURRENT_ATTRIB; 682e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED: 683e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák return _NEW_CURRENT_ATTRIB | _NEW_LIGHT | _NEW_BUFFERS; 6840e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell 6850e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_NORMAL_SCALE: 6860e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell return _NEW_MODELVIEW; 6870e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell 68800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXRECT_SCALE: 689114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_0: 690114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_1: 69100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _NEW_TEXTURE; 6927f1879d4e137f9b98d7430976adf9c28c4bf9fcfRoland Scheidegger case STATE_FOG_PARAMS_OPTIMIZED: 6937f1879d4e137f9b98d7430976adf9c28c4bf9fcfRoland Scheidegger return _NEW_FOG; 6942c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger case STATE_POINT_SIZE_CLAMPED: 6952c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger return _NEW_POINT | _NEW_MULTISAMPLE; 6960e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_LIGHT_SPOT_DIR_NORMALIZED: 6970e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_LIGHT_POSITION: 6980e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_LIGHT_POSITION_NORMALIZED: 6990e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_LIGHT_HALF_VECTOR: 7000e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell return _NEW_LIGHT; 7010e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell 7020e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_PT_SCALE: 7030e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell case STATE_PT_BIAS: 7040e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell return _NEW_PIXEL; 7050e008d37979e4e5ede25056221583e02c08a5df7Keith Whitwell 7061f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul case STATE_FB_SIZE: 707d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák case STATE_FB_WPOS_Y_TRANSFORM: 7081f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul return _NEW_BUFFERS; 7091f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul 71000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 71100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* unknown state indexes are silently ignored and 71200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * no flag set, since it is handled by the driver. 71300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 71400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return 0; 71500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 71600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 71700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 71800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(NULL, "unexpected state[0] in make_state_flags()"); 71900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return 0; 72000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 72100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 72200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 72300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 72400cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 72500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianappend(char *dst, const char *src) 72600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 72700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian while (*dst) 72800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian dst++; 72900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian while (*src) 73000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *dst++ = *src++; 73100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian *dst = 0; 73200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 73300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 73400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 73511701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul/** 736ec17001cd4e17240039b9b96083ef9b831720107Brian Paul * Convert token 'k' to a string, append it onto 'dst' string. 73711701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul */ 73800cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 73900cdc0a472c55330cbc58317f01b07f8f90be5a5Brianappend_token(char *dst, gl_state_index k) 74000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 74100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (k) { 74200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATERIAL: 743f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "material"); 74400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 74500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHT: 74600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "light"); 74700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 74800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_AMBIENT: 74900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "lightmodel.ambient"); 75000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 75100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_SCENECOLOR: 75200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 75300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTPROD: 75400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "lightprod"); 75500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 75600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN: 75700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "texgen"); 75800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 75900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FOG_COLOR: 760776bc9cf55b116e17dddde4d097985b51879c83fBrian append(dst, "fog.color"); 76100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 76200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FOG_PARAMS: 763776bc9cf55b116e17dddde4d097985b51879c83fBrian append(dst, "fog.params"); 76400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 76500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_CLIPPLANE: 76600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "clip"); 76700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 76800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_POINT_SIZE: 769776bc9cf55b116e17dddde4d097985b51879c83fBrian append(dst, "point.size"); 77000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 77100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_POINT_ATTENUATION: 772776bc9cf55b116e17dddde4d097985b51879c83fBrian append(dst, "point.attenuation"); 77300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7746531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MODELVIEW_MATRIX: 775f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "matrix.modelview"); 77600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7776531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROJECTION_MATRIX: 778f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "matrix.projection"); 77900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7806531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MVP_MATRIX: 781f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "matrix.mvp"); 78200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7836531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_TEXTURE_MATRIX: 784f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "matrix.texture"); 78500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 7866531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROGRAM_MATRIX: 787f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "matrix.program"); 78800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 78900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATRIX_INVERSE: 79000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".inverse"); 79100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 79200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATRIX_TRANSPOSE: 79300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".transpose"); 79400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 79500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATRIX_INVTRANS: 79600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".invtrans"); 79700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 79800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_AMBIENT: 799f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".ambient"); 80000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 80100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DIFFUSE: 802f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".diffuse"); 80300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 80400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPECULAR: 805f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".specular"); 80600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 80700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_EMISSION: 808f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".emission"); 80900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 81000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SHININESS: 811f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "lshininess"); 81200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 813f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_HALF_VECTOR: 814f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".half"); 81500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 81600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_POSITION: 81700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".position"); 81800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 81900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_ATTENUATION: 82000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".attenuation"); 82100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 82200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_SPOT_DIRECTION: 82300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, ".spot.direction"); 82400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 825f958aabdf3e3dc82827628cab97b159bd5089651Brian case STATE_SPOT_CUTOFF: 826f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, ".spot.cutoff"); 827f958aabdf3e3dc82827628cab97b159bd5089651Brian break; 82800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_S: 8292555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".eye.s"); 83000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 83100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_T: 8322555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".eye.t"); 83300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 83400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_R: 8352555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".eye.r"); 83600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 83700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_EYE_Q: 8382555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".eye.q"); 83900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 84000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_S: 8412555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".object.s"); 84200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 84300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_T: 8442555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".object.t"); 84500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 84600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_R: 8472555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".object.r"); 84800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 84900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN_OBJECT_Q: 8502555bed7fcc6f9ba35e9fb91e84a144621ccc995Brian Paul append(dst, ".object.q"); 85100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 85200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXENV_COLOR: 85300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "texenv"); 85400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 85500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DEPTH_RANGE: 85600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "depth.range"); 85700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 85800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_VERTEX_PROGRAM: 85900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FRAGMENT_PROGRAM: 86000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 86100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_ENV: 86200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "env"); 86300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 86400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LOCAL: 86500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "local"); 86600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 86711701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul /* BEGIN internal state vars */ 86811701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_INTERNAL: 8698a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul append(dst, ".internal."); 8708a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul break; 8718a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul case STATE_CURRENT_ATTRIB: 8728a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul append(dst, "current"); 87311701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 87400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_NORMAL_SCALE: 875f958aabdf3e3dc82827628cab97b159bd5089651Brian append(dst, "normalScale"); 876f958aabdf3e3dc82827628cab97b159bd5089651Brian break; 87711701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_TEXRECT_SCALE: 87811701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "texrectScale"); 87911701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 88011701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_FOG_PARAMS_OPTIMIZED: 88111701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "fogParamsOptimized"); 88211701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 8832c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger case STATE_POINT_SIZE_CLAMPED: 8842c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger append(dst, "pointSizeClamped"); 8852c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger break; 88611701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_LIGHT_SPOT_DIR_NORMALIZED: 88711701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "lightSpotDirNormalized"); 88811701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 88911701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_LIGHT_POSITION: 89011701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "lightPosition"); 89111701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 89211701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_LIGHT_POSITION_NORMALIZED: 89311701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "light.position.normalized"); 89411701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul break; 89511701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul case STATE_LIGHT_HALF_VECTOR: 89611701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append(dst, "lightHalfVector"); 89700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 8982f8fc325aca43693aac368ae5781547cc976d387Brian Paul case STATE_PT_SCALE: 8992f8fc325aca43693aac368ae5781547cc976d387Brian Paul append(dst, "PTscale"); 9002f8fc325aca43693aac368ae5781547cc976d387Brian Paul break; 9012f8fc325aca43693aac368ae5781547cc976d387Brian Paul case STATE_PT_BIAS: 9022f8fc325aca43693aac368ae5781547cc976d387Brian Paul append(dst, "PTbias"); 9032f8fc325aca43693aac368ae5781547cc976d387Brian Paul break; 9041f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul case STATE_FB_SIZE: 9051f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul append(dst, "FbSize"); 9061f45ae0813f72fa92f52e0ebc440922362dc7cceBrian Paul break; 907d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák case STATE_FB_WPOS_Y_TRANSFORM: 908d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák append(dst, "FbWposYTransform"); 909d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák break; 910114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_0: 911114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger append(dst, "rotMatrixRow0"); 912114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 913114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case STATE_ROT_MATRIX_1: 914114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger append(dst, "rotMatrixRow1"); 915114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger break; 91600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 917ec17001cd4e17240039b9b96083ef9b831720107Brian Paul /* probably STATE_INTERNAL_DRIVER+i (driver private state) */ 918ec17001cd4e17240039b9b96083ef9b831720107Brian Paul append(dst, "driverState"); 91900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 92000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 92100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 92200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 92300cdc0a472c55330cbc58317f01b07f8f90be5a5Brianappend_face(char *dst, GLint face) 92400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 92500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (face == 0) 92600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "front."); 92700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else 92800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, "back."); 92900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 93000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 93100cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstatic void 93200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianappend_index(char *dst, GLint index) 93300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 93400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian char s[20]; 935298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(s, "[%d]", index); 93600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(dst, s); 93700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 93800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 93900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 94000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Make a string from the given state vector. 94100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * For example, return "state.matrix.texture[2].inverse". 94232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg * Use free() to deallocate the string. 94300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 944ce3cf63251b9d0de1de066f71d0c642360215f13Michal Krolchar * 945aa9d22a1c0f3256497088985c290d4046e089456Brian_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]) 94600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 94700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian char str[1000] = ""; 94800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian char tmp[30]; 94900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 95000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, "state."); 95111701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[0]); 95200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 95300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian switch (state[0]) { 95400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_MATERIAL: 95500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_face(str, state[1]); 95611701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[2]); 95700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 95800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHT: 95900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[1]); /* light number [i]. */ 96011701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[2]); /* coefficients */ 96100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 96200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_AMBIENT: 96300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, "lightmodel.ambient"); 96400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 96500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTMODEL_SCENECOLOR: 96600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (state[1] == 0) { 96700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, "lightmodel.front.scenecolor"); 96800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 96900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else { 97000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, "lightmodel.back.scenecolor"); 97100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 97200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 97300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_LIGHTPROD: 97400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[1]); /* light number [i]. */ 97500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_face(str, state[2]); 97611701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[3]); 97700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 97800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXGEN: 97900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[1]); /* tex unit [i] */ 98011701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[2]); /* plane coef */ 98100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 98200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_TEXENV_COLOR: 98300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[1]); /* tex unit [i] */ 98400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, "color"); 98500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 98600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_CLIPPLANE: 98700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[1]); /* plane [i] */ 988f958aabdf3e3dc82827628cab97b159bd5089651Brian append(str, ".plane"); 98900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 9906531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MODELVIEW_MATRIX: 9916531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROJECTION_MATRIX: 9926531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_MVP_MATRIX: 9936531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_TEXTURE_MATRIX: 9946531952b3c979be0dc95704beb3c3b9dad1dc37bBrian case STATE_PROGRAM_MATRIX: 99500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian { 9966531952b3c979be0dc95704beb3c3b9dad1dc37bBrian /* state[0] = modelview, projection, texture, etc. */ 9976531952b3c979be0dc95704beb3c3b9dad1dc37bBrian /* state[1] = which texture matrix or program matrix */ 9986531952b3c979be0dc95704beb3c3b9dad1dc37bBrian /* state[2] = first row to fetch */ 9996531952b3c979be0dc95704beb3c3b9dad1dc37bBrian /* state[3] = last row to fetch */ 10006531952b3c979be0dc95704beb3c3b9dad1dc37bBrian /* state[4] = transpose, inverse or invtrans */ 100111701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul const gl_state_index mat = state[0]; 10026531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint index = (GLuint) state[1]; 10036531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint firstRow = (GLuint) state[2]; 10046531952b3c979be0dc95704beb3c3b9dad1dc37bBrian const GLuint lastRow = (GLuint) state[3]; 100511701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul const gl_state_index modifier = state[4]; 1006f958aabdf3e3dc82827628cab97b159bd5089651Brian if (index || 1007f958aabdf3e3dc82827628cab97b159bd5089651Brian mat == STATE_TEXTURE_MATRIX || 1008f958aabdf3e3dc82827628cab97b159bd5089651Brian mat == STATE_PROGRAM_MATRIX) 100900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, index); 101000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (modifier) 101100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_token(str, modifier); 101200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (firstRow == lastRow) 1013298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(tmp, ".row[%d]", firstRow); 101400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian else 1015298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg sprintf(tmp, ".row[%d..%d]", firstRow, lastRow); 101600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append(str, tmp); 101700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 101800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 1019a2786a97d74647662f1fe6aa29257e70b9e3636aBrian case STATE_POINT_SIZE: 1020a2786a97d74647662f1fe6aa29257e70b9e3636aBrian break; 1021a2786a97d74647662f1fe6aa29257e70b9e3636aBrian case STATE_POINT_ATTENUATION: 1022a2786a97d74647662f1fe6aa29257e70b9e3636aBrian break; 1023a2786a97d74647662f1fe6aa29257e70b9e3636aBrian case STATE_FOG_PARAMS: 1024a2786a97d74647662f1fe6aa29257e70b9e3636aBrian break; 1025a2786a97d74647662f1fe6aa29257e70b9e3636aBrian case STATE_FOG_COLOR: 1026a2786a97d74647662f1fe6aa29257e70b9e3636aBrian break; 102700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_DEPTH_RANGE: 102800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 102900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_FRAGMENT_PROGRAM: 103000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_VERTEX_PROGRAM: 103100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[1] = {STATE_ENV, STATE_LOCAL} */ 103200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /* state[2] = parameter index */ 103311701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[1]); 103400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian append_index(str, state[2]); 103500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 10364a867be14378587574b3082071e9fff962d28d12Eric Anholt case STATE_NORMAL_SCALE: 10374a867be14378587574b3082071e9fff962d28d12Eric Anholt break; 103800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian case STATE_INTERNAL: 103911701b4c151de450e0b80d9e61266ff178b4bd60Brian Paul append_token(str, state[1]); 10408a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul if (state[1] == STATE_CURRENT_ATTRIB) 10418a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul append_index(str, state[2]); 10428a22e24faef918a0f6d05ef6e6417a65cb3eaeb1Brian Paul break; 104300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian default: 104400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_problem(NULL, "Invalid state in _mesa_program_state_string"); 104500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian break; 104600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 104700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 104800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return _mesa_strdup(str); 104900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 105000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 105100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 105200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 105300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Loop over all the parameters in a parameter list. If the parameter 105400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * is a GL state reference, look up the current value of that state 105500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * variable and put it into the parameter's Value[4] array. 105664244dfd39b6e63a62a91ea2fb2743bd88a22476Brian Paul * Other parameter types never change or are explicitly set by the user 105764244dfd39b6e63a62a91ea2fb2743bd88a22476Brian Paul * with glUniform() or glProgramParameter(), etc. 105864244dfd39b6e63a62a91ea2fb2743bd88a22476Brian Paul * This would be called at glBegin time. 105900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 106000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 1061f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_load_state_parameters(struct gl_context *ctx, 106200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian struct gl_program_parameter_list *paramList) 106300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 106400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i; 106500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 106600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (!paramList) 1067b3efd35f4bdd62cf36b6f59be602fa8781db9b89Alan Hourihane return; 106800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 106900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < paramList->NumParameters; i++) { 107000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) { 1071c117d0efd28887069607f405be99fbc09fcb4cabNicolai Haehnle _mesa_fetch_state(ctx, 10726f851e6642a640deda34790c14d178acac1c552eBrian Paul paramList->Parameters[i].StateIndexes, 1073bf8d06c518a8e17e485b18ba03be3e1b45cc7327Brian Paul ¶mList->ParameterValues[i][0].f); 107400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 107500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 107600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 107700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 1078a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1079a7e1b4456a08d84c976bd260d018ca88f35867e4Brian/** 1080a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * Copy the 16 elements of a matrix into four consecutive program 1081a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * registers starting at 'pos'. 1082a7e1b4456a08d84c976bd260d018ca88f35867e4Brian */ 1083a7e1b4456a08d84c976bd260d018ca88f35867e4Brianstatic void 1084a7e1b4456a08d84c976bd260d018ca88f35867e4Brianload_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16]) 1085a7e1b4456a08d84c976bd260d018ca88f35867e4Brian{ 1086a7e1b4456a08d84c976bd260d018ca88f35867e4Brian GLuint i; 1087a7e1b4456a08d84c976bd260d018ca88f35867e4Brian for (i = 0; i < 4; i++) { 1088a7e1b4456a08d84c976bd260d018ca88f35867e4Brian registers[pos + i][0] = mat[0 + i]; 1089a7e1b4456a08d84c976bd260d018ca88f35867e4Brian registers[pos + i][1] = mat[4 + i]; 1090a7e1b4456a08d84c976bd260d018ca88f35867e4Brian registers[pos + i][2] = mat[8 + i]; 1091a7e1b4456a08d84c976bd260d018ca88f35867e4Brian registers[pos + i][3] = mat[12 + i]; 1092a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1093a7e1b4456a08d84c976bd260d018ca88f35867e4Brian} 1094a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1095a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1096a7e1b4456a08d84c976bd260d018ca88f35867e4Brian/** 1097a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * As above, but transpose the matrix. 1098a7e1b4456a08d84c976bd260d018ca88f35867e4Brian */ 1099a7e1b4456a08d84c976bd260d018ca88f35867e4Brianstatic void 1100a7e1b4456a08d84c976bd260d018ca88f35867e4Brianload_transpose_matrix(GLfloat registers[][4], GLuint pos, 1101a7e1b4456a08d84c976bd260d018ca88f35867e4Brian const GLfloat mat[16]) 1102a7e1b4456a08d84c976bd260d018ca88f35867e4Brian{ 1103e197de56cdb86835f1437688a9161cd909792d80Brian Paul memcpy(registers[pos], mat, 16 * sizeof(GLfloat)); 1104a7e1b4456a08d84c976bd260d018ca88f35867e4Brian} 1105a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1106a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1107a7e1b4456a08d84c976bd260d018ca88f35867e4Brian/** 1108a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * Load current vertex program's parameter registers with tracked 1109a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * matrices (if NV program). This only needs to be done per 1110a7e1b4456a08d84c976bd260d018ca88f35867e4Brian * glBegin/glEnd, not per-vertex. 1111a7e1b4456a08d84c976bd260d018ca88f35867e4Brian */ 1112a7e1b4456a08d84c976bd260d018ca88f35867e4Brianvoid 1113f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_load_tracked_matrices(struct gl_context *ctx) 1114a7e1b4456a08d84c976bd260d018ca88f35867e4Brian{ 1115a7e1b4456a08d84c976bd260d018ca88f35867e4Brian GLuint i; 1116a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1117a7e1b4456a08d84c976bd260d018ca88f35867e4Brian for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) { 1118a7e1b4456a08d84c976bd260d018ca88f35867e4Brian /* point 'mat' at source matrix */ 1119a7e1b4456a08d84c976bd260d018ca88f35867e4Brian GLmatrix *mat; 1120a7e1b4456a08d84c976bd260d018ca88f35867e4Brian if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) { 1121a7e1b4456a08d84c976bd260d018ca88f35867e4Brian mat = ctx->ModelviewMatrixStack.Top; 1122a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1123a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) { 1124a7e1b4456a08d84c976bd260d018ca88f35867e4Brian mat = ctx->ProjectionMatrixStack.Top; 1125a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1126a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) { 112760527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul GLuint unit = MIN2(ctx->Texture.CurrentUnit, 112860527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul Elements(ctx->TextureMatrixStack) - 1); 112960527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul mat = ctx->TextureMatrixStack[unit].Top; 1130a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1131a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) { 1132a7e1b4456a08d84c976bd260d018ca88f35867e4Brian /* XXX verify the combined matrix is up to date */ 1133a7e1b4456a08d84c976bd260d018ca88f35867e4Brian mat = &ctx->_ModelProjectMatrix; 1134a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1135a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV && 1136a7e1b4456a08d84c976bd260d018ca88f35867e4Brian ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) { 1137a7e1b4456a08d84c976bd260d018ca88f35867e4Brian GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV; 113860527ff32a23c34f23ae0b22df7130bf56b3dfa5Brian Paul ASSERT(n < Elements(ctx->ProgramMatrixStack)); 1139a7e1b4456a08d84c976bd260d018ca88f35867e4Brian mat = ctx->ProgramMatrixStack[n].Top; 1140a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1141a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else { 1142a7e1b4456a08d84c976bd260d018ca88f35867e4Brian /* no matrix is tracked, but we leave the register values as-is */ 1143a7e1b4456a08d84c976bd260d018ca88f35867e4Brian assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE); 1144a7e1b4456a08d84c976bd260d018ca88f35867e4Brian continue; 1145a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1146a7e1b4456a08d84c976bd260d018ca88f35867e4Brian 1147a7e1b4456a08d84c976bd260d018ca88f35867e4Brian /* load the matrix values into sequential registers */ 1148a7e1b4456a08d84c976bd260d018ca88f35867e4Brian if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) { 1149a7e1b4456a08d84c976bd260d018ca88f35867e4Brian load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m); 1150a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1151a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) { 1152a7e1b4456a08d84c976bd260d018ca88f35867e4Brian _math_matrix_analyse(mat); /* update the inverse */ 1153a7e1b4456a08d84c976bd260d018ca88f35867e4Brian ASSERT(!_math_matrix_is_dirty(mat)); 1154a7e1b4456a08d84c976bd260d018ca88f35867e4Brian load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); 1155a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1156a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) { 1157a7e1b4456a08d84c976bd260d018ca88f35867e4Brian load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m); 1158a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1159a7e1b4456a08d84c976bd260d018ca88f35867e4Brian else { 1160a7e1b4456a08d84c976bd260d018ca88f35867e4Brian assert(ctx->VertexProgram.TrackMatrixTransform[i] 1161a7e1b4456a08d84c976bd260d018ca88f35867e4Brian == GL_INVERSE_TRANSPOSE_NV); 1162a7e1b4456a08d84c976bd260d018ca88f35867e4Brian _math_matrix_analyse(mat); /* update the inverse */ 1163a7e1b4456a08d84c976bd260d018ca88f35867e4Brian ASSERT(!_math_matrix_is_dirty(mat)); 1164a7e1b4456a08d84c976bd260d018ca88f35867e4Brian load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); 1165a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1166a7e1b4456a08d84c976bd260d018ca88f35867e4Brian } 1167a7e1b4456a08d84c976bd260d018ca88f35867e4Brian} 1168