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                           &paramList->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