-static const struct {
- const char *name;
- const char *field;
- int tokens[STATE_LENGTH];
- int swizzle;
- bool array_indexed;
-} statevars[] = {
- {"gl_DepthRange", "near",
- {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX, false},
- {"gl_DepthRange", "far",
- {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY, false},
- {"gl_DepthRange", "diff",
- {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ, false},
-
- {"gl_ClipPlane", NULL,
- {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW, true}
-,
- {"gl_Point", "size",
- {STATE_POINT_SIZE}, SWIZZLE_XXXX, false},
- {"gl_Point", "sizeMin",
- {STATE_POINT_SIZE}, SWIZZLE_YYYY, false},
- {"gl_Point", "sizeMax",
- {STATE_POINT_SIZE}, SWIZZLE_ZZZZ, false},
- {"gl_Point", "fadeThresholdSize",
- {STATE_POINT_SIZE}, SWIZZLE_WWWW, false},
- {"gl_Point", "distanceConstantAttenuation",
- {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX, false},
- {"gl_Point", "distanceLinearAttenuation",
- {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY, false},
- {"gl_Point", "distanceQuadraticAttenuation",
- {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ, false},
-
- {"gl_FrontMaterial", "emission",
- {STATE_MATERIAL, 0, STATE_EMISSION}, SWIZZLE_XYZW, false},
- {"gl_FrontMaterial", "ambient",
- {STATE_MATERIAL, 0, STATE_AMBIENT}, SWIZZLE_XYZW, false},
- {"gl_FrontMaterial", "diffuse",
- {STATE_MATERIAL, 0, STATE_DIFFUSE}, SWIZZLE_XYZW, false},
- {"gl_FrontMaterial", "specular",
- {STATE_MATERIAL, 0, STATE_SPECULAR}, SWIZZLE_XYZW, false},
- {"gl_FrontMaterial", "shininess",
- {STATE_MATERIAL, 0, STATE_SHININESS}, SWIZZLE_XXXX, false},
-
- {"gl_BackMaterial", "emission",
- {STATE_MATERIAL, 1, STATE_EMISSION}, SWIZZLE_XYZW, false},
- {"gl_BackMaterial", "ambient",
- {STATE_MATERIAL, 1, STATE_AMBIENT}, SWIZZLE_XYZW, false},
- {"gl_BackMaterial", "diffuse",
- {STATE_MATERIAL, 1, STATE_DIFFUSE}, SWIZZLE_XYZW, false},
- {"gl_BackMaterial", "specular",
- {STATE_MATERIAL, 1, STATE_SPECULAR}, SWIZZLE_XYZW, false},
- {"gl_BackMaterial", "shininess",
- {STATE_MATERIAL, 1, STATE_SHININESS}, SWIZZLE_XXXX, false},
-
- {"gl_LightSource", "ambient",
- {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "diffuse",
- {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "specular",
- {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "position",
- {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "halfVector",
- {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "spotDirection",
- {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_XYZW, true},
- {"gl_LightSource", "spotCosCutoff",
- {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW, true},
- {"gl_LightSource", "spotCutoff",
- {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX, true},
- {"gl_LightSource", "spotExponent",
- {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW, true},
- {"gl_LightSource", "constantAttenuation",
- {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX, true},
- {"gl_LightSource", "linearAttenuation",
- {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY, true},
- {"gl_LightSource", "quadraticAttenuation",
- {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ, true},
-
- {"gl_LightModel", "ambient",
- {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW, false},
-
- {"gl_FrontLightModelProduct", "sceneColor",
- {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW, false},
- {"gl_BackLightModelProduct", "sceneColor",
- {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW, false},
-
- {"gl_FrontLightProduct", "ambient",
- {STATE_LIGHTPROD, 0, 0, STATE_AMBIENT}, SWIZZLE_XYZW, true},
- {"gl_FrontLightProduct", "diffuse",
- {STATE_LIGHTPROD, 0, 0, STATE_DIFFUSE}, SWIZZLE_XYZW, true},
- {"gl_FrontLightProduct", "specular",
- {STATE_LIGHTPROD, 0, 0, STATE_SPECULAR}, SWIZZLE_XYZW, true},
-
- {"gl_BackLightProduct", "ambient",
- {STATE_LIGHTPROD, 0, 1, STATE_AMBIENT}, SWIZZLE_XYZW, true},
- {"gl_BackLightProduct", "diffuse",
- {STATE_LIGHTPROD, 0, 1, STATE_DIFFUSE}, SWIZZLE_XYZW, true},
- {"gl_BackLightProduct", "specular",
- {STATE_LIGHTPROD, 0, 1, STATE_SPECULAR}, SWIZZLE_XYZW, true},
-
- {"gl_TextureEnvColor", NULL,
- {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW, true},
-
- {"gl_EyePlaneS", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW, true},
- {"gl_EyePlaneT", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW, true},
- {"gl_EyePlaneR", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW, true},
- {"gl_EyePlaneQ", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW, true},
-
- {"gl_ObjectPlaneS", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW, true},
- {"gl_ObjectPlaneT", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW, true},
- {"gl_ObjectPlaneR", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW, true},
- {"gl_ObjectPlaneQ", NULL,
- {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW, true},
-
- {"gl_Fog", "color",
- {STATE_FOG_COLOR}, SWIZZLE_XYZW, false},
- {"gl_Fog", "density",
- {STATE_FOG_PARAMS}, SWIZZLE_XXXX, false},
- {"gl_Fog", "start",
- {STATE_FOG_PARAMS}, SWIZZLE_YYYY, false},
- {"gl_Fog", "end",
- {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ, false},
- {"gl_Fog", "scale",
- {STATE_FOG_PARAMS}, SWIZZLE_WWWW, false},
-};
-
-static ir_to_mesa_src_reg
-get_builtin_uniform_reg(struct gl_program *prog,
- const char *name, int array_index, const char *field)
-{
- unsigned int i;
- ir_to_mesa_src_reg src_reg;
- int tokens[STATE_LENGTH];
-
- for (i = 0; i < Elements(statevars); i++) {
- if (strcmp(statevars[i].name, name) != 0)
- continue;
- if (!field && statevars[i].field) {
- assert(!"FINISHME: whole-structure state var dereference");
- }
- if (field && (!statevars[i].field || strcmp(statevars[i].field, field) != 0))
- continue;
- break;
- }
-
- if (i == Elements(statevars)) {
- printf("builtin uniform %s%s%s not found\n",
- name,
- field ? "." : "",
- field ? field : "");
- abort();
- }
-
- memcpy(&tokens, statevars[i].tokens, sizeof(tokens));
- if (statevars[i].array_indexed)
- tokens[1] = array_index;
-
- src_reg.file = PROGRAM_STATE_VAR;
- src_reg.index = _mesa_add_state_reference(prog->Parameters,
- (gl_state_index *)tokens);
- src_reg.swizzle = statevars[i].swizzle;
- src_reg.negate = 0;
- src_reg.reladdr = false;
-
- return src_reg;
-}
-
-static int
-add_matrix_ref(struct gl_program *prog, int *tokens)
-{
- int base_pos = -1;
- int i;
-
- /* Add a ref for each column. It looks like the reason we do
- * it this way is that _mesa_add_state_reference doesn't work
- * for things that aren't vec4s, so the tokens[2]/tokens[3]
- * range has to be equal.
- */
- for (i = 0; i < 4; i++) {
- tokens[2] = i;
- tokens[3] = i;
- int pos = _mesa_add_state_reference(prog->Parameters,
- (gl_state_index *)tokens);
- if (base_pos == -1)
- base_pos = pos;
- else
- assert(base_pos + i == pos);
- }
-
- return base_pos;
-}
-
-static variable_storage *
-get_builtin_matrix_ref(void *mem_ctx, struct gl_program *prog, ir_variable *var,
- ir_rvalue *array_index)
-{
- /*
- * NOTE: The ARB_vertex_program extension specified that matrices get
- * loaded in registers in row-major order. With GLSL, we want column-
- * major order. So, we need to transpose all matrices here...
- */
- static const struct {
- const char *name;
- int matrix;
- int modifier;
- } matrices[] = {
- { "gl_ModelViewMatrix", STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE },
- { "gl_ModelViewMatrixInverse", STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS },
- { "gl_ModelViewMatrixTranspose", STATE_MODELVIEW_MATRIX, 0 },
- { "gl_ModelViewMatrixInverseTranspose", STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE },
-
- { "gl_ProjectionMatrix", STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE },
- { "gl_ProjectionMatrixInverse", STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS },
- { "gl_ProjectionMatrixTranspose", STATE_PROJECTION_MATRIX, 0 },
- { "gl_ProjectionMatrixInverseTranspose", STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE },
-
- { "gl_ModelViewProjectionMatrix", STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE },
- { "gl_ModelViewProjectionMatrixInverse", STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS },
- { "gl_ModelViewProjectionMatrixTranspose", STATE_MVP_MATRIX, 0 },
- { "gl_ModelViewProjectionMatrixInverseTranspose", STATE_MVP_MATRIX, STATE_MATRIX_INVERSE },
-
- { "gl_TextureMatrix", STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE },
- { "gl_TextureMatrixInverse", STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS },
- { "gl_TextureMatrixTranspose", STATE_TEXTURE_MATRIX, 0 },
- { "gl_TextureMatrixInverseTranspose", STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE },
-
- { "gl_NormalMatrix", STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE },
-
- };
- unsigned int i;
- variable_storage *entry;
-
- /* C++ gets angry when we try to use an int as a gl_state_index, so we use
- * ints for gl_state_index. Make sure they're compatible.
- */
- assert(sizeof(gl_state_index) == sizeof(int));
-
- for (i = 0; i < Elements(matrices); i++) {
- if (strcmp(var->name, matrices[i].name) == 0) {
- int tokens[STATE_LENGTH];
- int base_pos = -1;
-
- tokens[0] = matrices[i].matrix;
- tokens[4] = matrices[i].modifier;
- if (matrices[i].matrix == STATE_TEXTURE_MATRIX) {
- ir_constant *index = array_index->constant_expression_value();
- if (index) {
- tokens[1] = index->value.i[0];
- base_pos = add_matrix_ref(prog, tokens);
- } else {
- for (i = 0; i < var->type->length; i++) {
- tokens[1] = i;
- int pos = add_matrix_ref(prog, tokens);
- if (base_pos == -1)
- base_pos = pos;
- else
- assert(base_pos + (int)i * 4 == pos);
- }
- }
- } else {
- tokens[1] = 0; /* unused array index */
- base_pos = add_matrix_ref(prog, tokens);
- }
-
- entry = new(mem_ctx) variable_storage(var,
- PROGRAM_STATE_VAR,
- base_pos);
-
- return entry;
- }
- }
-
- return NULL;
-}
-