1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file prog_statevars.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Program state variable management. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Brian Paul 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_statevars.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_parameter.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use the list of tokens in the state[] array to find global GL state 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and return it in <value>. Usually, four values are returned in <value> 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but matrix queries may return as many as 16 values. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used for ARB vertex/fragment programs. 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The program parser will produce the state[] values. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[], 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *value) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[0]) { 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATERIAL: 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] is either 0=front or 1=back side */ 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = (GLuint) state[1]; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_material *mat = &ctx->Light.Material; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(face == 0 || face == 1); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we rely on tokens numbered so that _BACK_ == _FRONT_+ 1 */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(MAT_ATTRIB_FRONT_AMBIENT + 1 == MAT_ATTRIB_BACK_AMBIENT); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX we could get rid of this switch entirely with a little 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work in arbprogparse.c's parse_state_single_item(). 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] is the material attribute */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[2]) { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_AMBIENT: 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_AMBIENT + face]); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DIFFUSE: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_DIFFUSE + face]); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPECULAR: 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_SPECULAR + face]); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_EMISSION: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_EMISSION + face]); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SHININESS: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = mat->Attrib[MAT_ATTRIB_FRONT_SHININESS + face][0]; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = 0.0F; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = 0.0F; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 1.0F; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid material state in fetch_state"); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT: 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] is the light number */ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[1]; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] is the light attribute */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[2]) { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_AMBIENT: 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln].Ambient); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DIFFUSE: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln].Diffuse); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPECULAR: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln].Specular); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POSITION: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln].EyePosition); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ATTENUATION: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Light.Light[ln].ConstantAttenuation; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Light.Light[ln].LinearAttenuation; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Light.Light[ln].QuadraticAttenuation; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Light[ln].SpotExponent; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPOT_DIRECTION: 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V(value, ctx->Light.Light[ln].SpotDirection); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Light[ln]._CosCutoff; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPOT_CUTOFF: 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Light.Light[ln].SpotCutoff; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_HALF_VECTOR: 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const GLfloat eye_z[] = {0, 0, 1}; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[3]; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compute infinite half angle vector: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * halfVector = normalize(normalize(lightPos) + (0, 0, 1)) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * light.EyePosition.w should be 0 for infinite lights. 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V(p, ctx->Light.Light[ln].EyePosition); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV(p); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_3V(value, p, eye_z); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV(value); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 1.0; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid light state in fetch_state"); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_AMBIENT: 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Model.Ambient); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_SCENECOLOR: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state[1] == 0) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* front */ 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i] = ctx->Light.Model.Ambient[i] 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT][i] 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION][i]; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3]; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* back */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i] = ctx->Light.Model.Ambient[i] 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_AMBIENT][i] 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_EMISSION][i]; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3]; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTPROD: 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[1]; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = (GLuint) state[2]; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(face == 0 || face == 1); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[3]) { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_AMBIENT: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i] = ctx->Light.Light[ln].Ambient[i] * 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i]; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* [3] = material alpha */ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3]; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DIFFUSE: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i] = ctx->Light.Light[ln].Diffuse[i] * 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][i]; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* [3] = material alpha */ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3]; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPECULAR: 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 3; i++) { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i] = ctx->Light.Light[ln].Specular[i] * 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i]; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* [3] = material alpha */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3]; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid lightprod state in fetch_state"); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN: 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] is the texture unit */ 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint unit = (GLuint) state[1]; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] is the texgen attribute */ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[2]) { 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_S: 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenS.EyePlane); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_T: 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenT.EyePlane); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_R: 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenR.EyePlane); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_Q: 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenQ.EyePlane); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_S: 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenS.ObjectPlane); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_T: 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenT.ObjectPlane); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_R: 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenR.ObjectPlane); 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_Q: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].GenQ.ObjectPlane); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid texgen state in fetch_state"); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXENV_COLOR: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] is the texture unit */ 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint unit = (GLuint) state[1]; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx->Color._ClampFragmentColor) 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].EnvColor); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Texture.Unit[unit].EnvColorUnclamped); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_COLOR: 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx->Color._ClampFragmentColor) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Fog.Color); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Fog.ColorUnclamped); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS: 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Fog.Density; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Fog.Start; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Fog.End; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = (ctx->Fog.End == ctx->Fog.Start) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start)); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CLIPPLANE: 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint plane = (GLuint) state[1]; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Transform.EyeUserPlane[plane]); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE: 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Point.Size; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Point.MinSize; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Point.MaxSize; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Point.Threshold; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_ATTENUATION: 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Point.Params[0]; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Point.Params[1]; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Point.Params[2]; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 1.0F; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MODELVIEW_MATRIX: 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROJECTION_MATRIX: 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MVP_MATRIX: 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXTURE_MATRIX: 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROGRAM_MATRIX: 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[0] = modelview, projection, texture, etc. */ 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] = which texture matrix or program matrix */ 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] = first row to fetch */ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[3] = last row to fetch */ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[4] = transpose, inverse or invtrans */ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLmatrix *matrix; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index mat = state[0]; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint index = (GLuint) state[1]; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint firstRow = (GLuint) state[2]; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint lastRow = (GLuint) state[3]; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index modifier = state[4]; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *m; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint row, i; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(firstRow >= 0); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(firstRow < 4); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(lastRow >= 0); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(lastRow < 4); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mat == STATE_MODELVIEW_MATRIX) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix = ctx->ModelviewMatrixStack.Top; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (mat == STATE_PROJECTION_MATRIX) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix = ctx->ProjectionMatrixStack.Top; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (mat == STATE_MVP_MATRIX) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix = &ctx->_ModelProjectMatrix; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (mat == STATE_TEXTURE_MATRIX) { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(index < Elements(ctx->TextureMatrixStack)); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix = ctx->TextureMatrixStack[index].Top; 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (mat == STATE_PROGRAM_MATRIX) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(index < Elements(ctx->ProgramMatrixStack)); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org matrix = ctx->ProgramMatrixStack[index].Top; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad matrix name in _mesa_fetch_state()"); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == STATE_MATRIX_INVERSE || 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modifier == STATE_MATRIX_INVTRANS) { 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Be sure inverse is up to date: 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _math_matrix_analyse( (GLmatrix*) matrix ); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = matrix->inv; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = matrix->m; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == STATE_MATRIX_TRANSPOSE || 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modifier == STATE_MATRIX_INVTRANS) { 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, row = firstRow; row <= lastRow; row++) { 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row * 4 + 0]; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row * 4 + 1]; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row * 4 + 2]; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row * 4 + 3]; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0, row = firstRow; row <= lastRow; row++) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row + 0]; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row + 4]; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row + 8]; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[i++] = m[row + 12]; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DEPTH_RANGE: 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Viewport.Near; /* near */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Viewport.Far; /* far */ 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 1.0; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FRAGMENT_PROGRAM: 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] = {STATE_ENV, STATE_LOCAL} */ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] = parameter index */ 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx = (int) state[2]; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[1]) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ENV: 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->FragmentProgram.Parameters[idx]); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LOCAL: 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_VERTEX_PROGRAM: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] = {STATE_ENV, STATE_LOCAL} */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] = parameter index */ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx = (int) state[2]; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[1]) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ENV: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->VertexProgram.Parameters[idx]); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LOCAL: 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_INTERNAL: 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[1]) { 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CURRENT_ATTRIB: 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint idx = (GLuint) state[2]; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Current.Attrib[idx]); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED: 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint idx = (GLuint) state[2]; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ctx->Light._ClampVertexColor && 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (idx == VERT_ATTRIB_COLOR0 || 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org idx == VERT_ATTRIB_COLOR1)) { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = CLAMP(ctx->Current.Attrib[idx][0], 0.0f, 1.0f); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = CLAMP(ctx->Current.Attrib[idx][1], 0.0f, 1.0f); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = CLAMP(ctx->Current.Attrib[idx][2], 0.0f, 1.0f); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = CLAMP(ctx->Current.Attrib[idx][3], 0.0f, 1.0f); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Current.Attrib[idx]); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(value, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ModelViewInvScale, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ModelViewInvScale, 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ModelViewInvScale, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXRECT_SCALE: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Value = { 1/texWidth, 1/texHeight, 0, 1 }. 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Used to convert unnormalized texcoords to normalized texcoords. 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int unit = (int) state[2]; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_object *texObj 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = ctx->Texture.Unit[unit]._Current; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texObj) { 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage = texObj->Image[0][0]; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSIGN_4V(value, 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLfloat) (1.0 / texImage->Width), 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLfloat) (1.0 / texImage->Height), 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0.0f, 1.0f); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS_OPTIMIZED: 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog) 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * might be more expensive than EX2 on some hw, plus it needs 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * another constant (e) anyway. Linear fog can now be done with a 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * single MAD. 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * linear: fogcoord * -1/(end-start) + end/(end-start) 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exp: 2^-(density/ln(2) * fogcoord) 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = (ctx->Fog.End == ctx->Fog.Start) 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start)); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Fog.End * -value[0]; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = (GLfloat)(ctx->Fog.Density * M_LOG2E); /* M_LOG2E == 1/ln(2) */ 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE_CLAMPED: 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this includes implementation dependent limits, to avoid 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * another potentially necessary clamp. 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: for sprites, point smooth (point AA) is ignored 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and we'll clamp to MinPointSizeAA and MaxPointSize, because we 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * expect drivers will want to say their minimum for AA size is 0.0 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but for non-AA it's 1.0 (because normal points with size below 1.0 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * need to get rounded up to 1.0, hence never disappear). GL does 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not specify max clamp size for sprites, other than it needs to be 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * at least as large as max AA size, hence use non-AA size there. 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat minImplSize; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat maxImplSize; 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Point.PointSprite) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minImplSize = ctx->Const.MinPointSizeAA; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxImplSize = ctx->Const.MaxPointSize; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minImplSize = ctx->Const.MinPointSizeAA; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxImplSize = ctx->Const.MaxPointSizeAA; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minImplSize = ctx->Const.MinPointSize; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxImplSize = ctx->Const.MaxPointSize; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Point.Size; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Point.MinSize >= minImplSize ? ctx->Point.MinSize : minImplSize; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Point.MaxSize <= maxImplSize ? ctx->Point.MaxSize : maxImplSize; 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Point.Threshold; 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_SPOT_DIR_NORMALIZED: 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* here, state[2] is the light number */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pre-normalize spot dir */ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[2]; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V(value, ctx->Light.Light[ln]._NormSpotDirection); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Light.Light[ln]._CosCutoff; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION: 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[2]; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln]._Position); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION_NORMALIZED: 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[2]; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(value, ctx->Light.Light[ln]._Position); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV( value ); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_HALF_VECTOR: 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint ln = (GLuint) state[2]; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat p[3]; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Compute infinite half angle vector: 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * halfVector = normalize(normalize(lightPos) + (0, 0, 1)) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * light.EyePosition.w should be 0 for infinite lights. 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V(p, ctx->Light.Light[ln]._Position); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV(p); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ADD_3V(value, p, ctx->_EyeZDir); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV(value); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 1.0; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_SCALE: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Pixel.RedScale; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Pixel.GreenScale; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Pixel.BlueScale; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Pixel.AlphaScale; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_BIAS: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = ctx->Pixel.RedBias; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = ctx->Pixel.GreenBias; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = ctx->Pixel.BlueBias; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = ctx->Pixel.AlphaBias; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_SIZE: 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = (GLfloat) (ctx->DrawBuffer->Width - 1); 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = 0.0F; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 0.0F; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_WPOS_Y_TRANSFORM: 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* A driver may negate this conditional by using ZW swizzle 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * instead of XY (based on e.g. some other state). */ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_user_fbo(ctx->DrawBuffer)) { 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Identity (XY) followed by flipping Y upside down (ZW). */ 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = 1.0F; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = 0.0F; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = -1.0F; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = (GLfloat) ctx->DrawBuffer->Height; 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Flipping Y upside down (XY) followed by identity (ZW). */ 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = -1.0F; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = (GLfloat) ctx->DrawBuffer->Height; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = 1.0F; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 0.0F; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_0: 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int unit = (int) state[2]; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = rotMat22[0]; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = rotMat22[2]; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = 0.0; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 0.0; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_1: 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int unit = (int) state[2]; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[0] = rotMat22[1]; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[1] = rotMat22[3]; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[2] = 0.0; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value[3] = 0.0; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: make sure new tokens added here are also handled in the 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_program_state_flags() switch, below. 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unknown state indexes are silently ignored here. 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Drivers may do something special. 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid state in _mesa_fetch_state"); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return a bitmask of the Mesa state flags (_NEW_* values) which would 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * indicate that the given context state may have changed. 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The bitmask is used during validation to determine if we need to update 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex/fragment program parameters (like "state.material.color") when 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * some GL state has changed. 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLbitfield 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]) 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[0]) { 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATERIAL: 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTPROD: 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_SCENECOLOR: 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* these can be effected by glColor when colormaterial mode is used */ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_LIGHT | _NEW_CURRENT_ATTRIB; 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT: 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_AMBIENT: 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_LIGHT; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN: 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TEXTURE; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXENV_COLOR: 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TEXTURE | _NEW_BUFFERS | _NEW_FRAG_CLAMP; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_COLOR: 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_FOG | _NEW_BUFFERS | _NEW_FRAG_CLAMP; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS: 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_FOG; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CLIPPLANE: 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TRANSFORM; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE: 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_ATTENUATION: 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_POINT; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MODELVIEW_MATRIX: 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_MODELVIEW; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROJECTION_MATRIX: 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_PROJECTION; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MVP_MATRIX: 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_MODELVIEW | _NEW_PROJECTION; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXTURE_MATRIX: 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TEXTURE_MATRIX; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROGRAM_MATRIX: 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TRACK_MATRIX; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DEPTH_RANGE: 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_VIEWPORT; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FRAGMENT_PROGRAM: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_VERTEX_PROGRAM: 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_PROGRAM; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_MODELVIEW; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_INTERNAL: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[1]) { 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CURRENT_ATTRIB: 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_CURRENT_ATTRIB; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_CURRENT_ATTRIB | _NEW_LIGHT | _NEW_BUFFERS; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_MODELVIEW; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXRECT_SCALE: 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_0: 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_1: 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_TEXTURE; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS_OPTIMIZED: 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_FOG; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE_CLAMPED: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_POINT | _NEW_MULTISAMPLE; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_SPOT_DIR_NORMALIZED: 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION: 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION_NORMALIZED: 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_HALF_VECTOR: 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_LIGHT; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_SCALE: 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_BIAS: 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_PIXEL; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_SIZE: 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_WPOS_Y_TRANSFORM: 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _NEW_BUFFERS; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unknown state indexes are silently ignored and 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * no flag set, since it is handled by the driver. 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "unexpected state[0] in make_state_flags()"); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgappend(char *dst, const char *src) 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*dst) 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst++; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*src) 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst++ = *src++; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dst = 0; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert token 'k' to a string, append it onto 'dst' string. 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgappend_token(char *dst, gl_state_index k) 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (k) { 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATERIAL: 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "material"); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT: 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "light"); 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_AMBIENT: 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lightmodel.ambient"); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_SCENECOLOR: 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTPROD: 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lightprod"); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN: 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "texgen"); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_COLOR: 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "fog.color"); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS: 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "fog.params"); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CLIPPLANE: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "clip"); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE: 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "point.size"); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_ATTENUATION: 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "point.attenuation"); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MODELVIEW_MATRIX: 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "matrix.modelview"); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROJECTION_MATRIX: 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "matrix.projection"); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MVP_MATRIX: 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "matrix.mvp"); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXTURE_MATRIX: 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "matrix.texture"); 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROGRAM_MATRIX: 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "matrix.program"); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATRIX_INVERSE: 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".inverse"); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATRIX_TRANSPOSE: 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".transpose"); 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATRIX_INVTRANS: 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".invtrans"); 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_AMBIENT: 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".ambient"); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DIFFUSE: 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".diffuse"); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPECULAR: 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".specular"); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_EMISSION: 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".emission"); 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SHININESS: 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lshininess"); 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_HALF_VECTOR: 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".half"); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POSITION: 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".position"); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ATTENUATION: 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".attenuation"); 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPOT_DIRECTION: 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".spot.direction"); 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_SPOT_CUTOFF: 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".spot.cutoff"); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_S: 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".eye.s"); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_T: 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".eye.t"); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_R: 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".eye.r"); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_EYE_Q: 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".eye.q"); 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_S: 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".object.s"); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_T: 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".object.t"); 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_R: 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".object.r"); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN_OBJECT_Q: 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".object.q"); 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXENV_COLOR: 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "texenv"); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DEPTH_RANGE: 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "depth.range"); 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_VERTEX_PROGRAM: 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FRAGMENT_PROGRAM: 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ENV: 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "env"); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LOCAL: 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "local"); 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BEGIN internal state vars */ 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_INTERNAL: 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, ".internal."); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CURRENT_ATTRIB: 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "current"); 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "normalScale"); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXRECT_SCALE: 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "texrectScale"); 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS_OPTIMIZED: 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "fogParamsOptimized"); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE_CLAMPED: 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "pointSizeClamped"); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_SPOT_DIR_NORMALIZED: 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lightSpotDirNormalized"); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION: 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lightPosition"); 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_POSITION_NORMALIZED: 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "light.position.normalized"); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT_HALF_VECTOR: 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "lightHalfVector"); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_SCALE: 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "PTscale"); 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PT_BIAS: 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "PTbias"); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_SIZE: 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "FbSize"); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FB_WPOS_Y_TRANSFORM: 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "FbWposYTransform"); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_0: 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "rotMatrixRow0"); 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_ROT_MATRIX_1: 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "rotMatrixRow1"); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* probably STATE_INTERNAL_DRIVER+i (driver private state) */ 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "driverState"); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgappend_face(char *dst, GLint face) 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (face == 0) 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "front."); 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, "back."); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgappend_index(char *dst, GLint index) 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char s[20]; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprintf(s, "[%d]", index); 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(dst, s); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make a string from the given state vector. 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, return "state.matrix.texture[2].inverse". 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use free() to deallocate the string. 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchar * 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]) 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char str[1000] = ""; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char tmp[30]; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, "state."); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[0]); 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (state[0]) { 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MATERIAL: 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_face(str, state[1]); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[2]); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHT: 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[1]); /* light number [i]. */ 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[2]); /* coefficients */ 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_AMBIENT: 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, "lightmodel.ambient"); 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTMODEL_SCENECOLOR: 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state[1] == 0) { 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, "lightmodel.front.scenecolor"); 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, "lightmodel.back.scenecolor"); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_LIGHTPROD: 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[1]); /* light number [i]. */ 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_face(str, state[2]); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[3]); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXGEN: 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[1]); /* tex unit [i] */ 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[2]); /* plane coef */ 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXENV_COLOR: 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[1]); /* tex unit [i] */ 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, "color"); 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_CLIPPLANE: 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[1]); /* plane [i] */ 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, ".plane"); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MODELVIEW_MATRIX: 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROJECTION_MATRIX: 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_MVP_MATRIX: 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_TEXTURE_MATRIX: 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_PROGRAM_MATRIX: 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[0] = modelview, projection, texture, etc. */ 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] = which texture matrix or program matrix */ 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] = first row to fetch */ 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[3] = last row to fetch */ 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[4] = transpose, inverse or invtrans */ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index mat = state[0]; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint index = (GLuint) state[1]; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint firstRow = (GLuint) state[2]; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint lastRow = (GLuint) state[3]; 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_state_index modifier = state[4]; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index || 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat == STATE_TEXTURE_MATRIX || 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat == STATE_PROGRAM_MATRIX) 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, index); 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier) 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, modifier); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (firstRow == lastRow) 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprintf(tmp, ".row[%d]", firstRow); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprintf(tmp, ".row[%d..%d]", firstRow, lastRow); 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append(str, tmp); 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_SIZE: 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_POINT_ATTENUATION: 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_PARAMS: 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FOG_COLOR: 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_DEPTH_RANGE: 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_FRAGMENT_PROGRAM: 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_VERTEX_PROGRAM: 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[1] = {STATE_ENV, STATE_LOCAL} */ 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* state[2] = parameter index */ 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[1]); 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[2]); 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_NORMAL_SCALE: 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case STATE_INTERNAL: 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_token(str, state[1]); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state[1] == STATE_CURRENT_ATTRIB) 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org append_index(str, state[2]); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "Invalid state in _mesa_program_state_string"); 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_strdup(str); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Loop over all the parameters in a parameter list. If the parameter 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is a GL state reference, look up the current value of that state 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * variable and put it into the parameter's Value[4] array. 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Other parameter types never change or are explicitly set by the user 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with glUniform() or glProgramParameter(), etc. 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This would be called at glBegin time. 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_load_state_parameters(struct gl_context *ctx, 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program_parameter_list *paramList) 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!paramList) 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < paramList->NumParameters; i++) { 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) { 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_fetch_state(ctx, 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org paramList->Parameters[i].StateIndexes, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ¶mList->ParameterValues[i][0].f); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy the 16 elements of a matrix into four consecutive program 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * registers starting at 'pos'. 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgload_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16]) 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org registers[pos + i][0] = mat[0 + i]; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org registers[pos + i][1] = mat[4 + i]; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org registers[pos + i][2] = mat[8 + i]; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org registers[pos + i][3] = mat[12 + i]; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As above, but transpose the matrix. 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgload_transpose_matrix(GLfloat registers[][4], GLuint pos, 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat mat[16]) 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(registers[pos], mat, 16 * sizeof(GLfloat)); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Load current vertex program's parameter registers with tracked 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * matrices (if NV program). This only needs to be done per 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glBegin/glEnd, not per-vertex. 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_load_tracked_matrices(struct gl_context *ctx) 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) { 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* point 'mat' at source matrix */ 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLmatrix *mat; 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) { 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat = ctx->ModelviewMatrixStack.Top; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) { 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat = ctx->ProjectionMatrixStack.Top; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) { 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit = MIN2(ctx->Texture.CurrentUnit, 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Elements(ctx->TextureMatrixStack) - 1); 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat = ctx->TextureMatrixStack[unit].Top; 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) { 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX verify the combined matrix is up to date */ 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat = &ctx->_ModelProjectMatrix; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV && 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) { 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(n < Elements(ctx->ProgramMatrixStack)); 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mat = ctx->ProgramMatrixStack[n].Top; 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no matrix is tracked, but we leave the register values as-is */ 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* load the matrix values into sequential registers */ 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) { 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m); 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) { 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _math_matrix_analyse(mat); /* update the inverse */ 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(!_math_matrix_is_dirty(mat)); 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) { 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ctx->VertexProgram.TrackMatrixTransform[i] 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org == GL_INVERSE_TRANSPOSE_NV); 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _math_matrix_analyse(mat); /* update the inverse */ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(!_math_matrix_is_dirty(mat)); 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv); 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1168