100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/* 200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Mesa 3-D graphics library 30f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul * Version: 7.3 400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 50f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Permission is hereby granted, free of charge, to any person obtaining a 800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * copy of this software and associated documentation files (the "Software"), 900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * to deal in the Software without restriction, including without limitation 1000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and/or sell copies of the Software, and to permit persons to whom the 1200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Software is furnished to do so, subject to the following conditions: 1300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The above copyright notice and this permission notice shall be included 1500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * in all copies or substantial portions of the Software. 1600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 2400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 2500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 2600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \file prog_parameter.c 2700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Program parameter lists and functions. 2800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \author Brian Paul 2900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 3000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#ifndef PROG_PARAMETER_H 3200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#define PROG_PARAMETER_H 3300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 342d5087bf74f2d0e58037847058a123fe9d142038Brian Paul#include "main/mtypes.h" 35b7978af6936d186112727cb9858fe7740eef1a7cBrian#include "prog_statevars.h" 3600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus 3963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonsecaextern "C" { 4063e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif 4163e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca 4263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca 4300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 440f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul * Program parameter flags 450f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul */ 460f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul/*@{*/ 47f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul#define PROG_PARAM_BIT_CENTROID 0x1 /**< for varying vars (GLSL 1.20) */ 48f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul#define PROG_PARAM_BIT_INVARIANT 0x2 /**< for varying vars (GLSL 1.20) */ 49f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul#define PROG_PARAM_BIT_FLAT 0x4 /**< for varying vars (GLSL 1.30) */ 50f490ec9797a396da9d182f1ad4393f1c5c2df440Brian Paul#define PROG_PARAM_BIT_LINEAR 0x8 /**< for varying vars (GLSL 1.30) */ 514a9f1eed2ba02f2ae2bf92d16f89d10f09b2a21eBrian Paul#define PROG_PARAM_BIT_CYL_WRAP 0x10 /**< XXX gallium debug */ 520f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul/*@}*/ 530f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul 548488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul 556d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain/** 566d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain * Actual data for constant values of parameters. 576d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain */ 588488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paultypedef union gl_constant_value 598488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul{ 608488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul GLfloat f; 617708b25e2b5e05f262c19dde5d7f3612a7e7e166Eric Anholt GLint b; 628488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul GLint i; 638488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul GLuint u; 646d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain} gl_constant_value; 650f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul 668488112d20d49d3dc7fefef19c6e550e4b71661cBrian Paul 670f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul/** 689805e7674424182b17ca355da2cb3b14fab8a41cBrian * Program parameter. 690f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul * Used by shaders/programs for uniforms, constants, varying vars, etc. 7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstruct gl_program_parameter 7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 7300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian const char *Name; /**< Null-terminated string */ 74b4026d9be828bd0b6f60158456edf24994efb053Brian Paul gl_register_file Type; /**< PROGRAM_NAMED_PARAM, CONSTANT or STATE_VAR */ 75c93e883b205a679aa80f6228459890f9118ad909Brian GLenum DataType; /**< GL_FLOAT, GL_FLOAT_VEC2, etc */ 767d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle /** 777d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle * Number of components (1..4), or more. 787d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle * If the number of components is greater than 4, 797d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle * this parameter is part of a larger uniform like a GLSL matrix or array. 807d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle * The next program parameter's Size will be Size-4 of this parameter. 817d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle */ 827d2699aedc084d9cb9c2bd2f8bdb5f038271ac1eNicolai Hähnle GLuint Size; 83ea2231ff5e4ced36bdb65ccdd02a1008fb8bfce7Eric Anholt GLboolean Initialized; /**< debug: Has the ParameterValue[] been set? */ 840f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul GLbitfield Flags; /**< Bitmask of PROG_PARAM_*_BIT */ 8500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian /** 8600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * A sequence of STATE_* tokens and integers to identify GL state. 8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 88aa9d22a1c0f3256497088985c290d4046e089456Brian gl_state_index StateIndexes[STATE_LENGTH]; 8900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}; 9000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 939805e7674424182b17ca355da2cb3b14fab8a41cBrian * List of gl_program_parameter instances. 9400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 9500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstruct gl_program_parameter_list 9600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 9700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint Size; /**< allocated size of Parameters, ParameterValues */ 9800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint NumParameters; /**< number of parameters in arrays */ 9900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian struct gl_program_parameter *Parameters; /**< Array [Size] */ 1006d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain gl_constant_value (*ParameterValues)[4]; /**< Array [Size] of constant[4] */ 10100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes 10200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian might invalidate ParameterValues[] */ 10300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian}; 10400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 10500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 10600cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern struct gl_program_parameter_list * 10700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_new_parameter_list(void); 10800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 109480567d5c451511a72744b0c849960c2b712e093Ian Romanickextern struct gl_program_parameter_list * 110480567d5c451511a72744b0c849960c2b712e093Ian Romanick_mesa_new_parameter_list_sized(unsigned size); 111480567d5c451511a72744b0c849960c2b712e093Ian Romanick 11200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern void 11300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_free_parameter_list(struct gl_program_parameter_list *paramList); 11400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 11500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern struct gl_program_parameter_list * 11600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_clone_parameter_list(const struct gl_program_parameter_list *list); 11700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 1186ca948a303e1af7ae66ea7082af741f6880887f2Brian Paulextern struct gl_program_parameter_list * 1196ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul_mesa_combine_parameter_lists(const struct gl_program_parameter_list *a, 1206ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul const struct gl_program_parameter_list *b); 1216ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul 1229520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint 1236ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul_mesa_num_parameters(const struct gl_program_parameter_list *list) 1246ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul{ 1256ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul return list ? list->NumParameters : 0; 1266ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul} 1276ca948a303e1af7ae66ea7082af741f6880887f2Brian Paul 12800cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 12900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_parameter(struct gl_program_parameter_list *paramList, 130b4026d9be828bd0b6f60158456edf24994efb053Brian Paul gl_register_file type, const char *name, 1316d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain GLuint size, GLenum datatype, 1326d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const gl_constant_value *values, 1330f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul const gl_state_index state[STATE_LENGTH], 1340f228d7ab3b7c03328df369b8db50c469ac5dcd6Brian Paul GLbitfield flags); 13500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 13600cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 13700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_named_parameter(struct gl_program_parameter_list *paramList, 1386d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const char *name, const gl_constant_value values[4]); 13900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 14000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 14100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_named_constant(struct gl_program_parameter_list *paramList, 1426d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const char *name, const gl_constant_value values[4], 14300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint size); 14400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 14500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 146b191382c60bdcfeb7f424b23aa6ab63de81e2f08Bryan Cain_mesa_add_typed_unnamed_constant(struct gl_program_parameter_list *paramList, 147b191382c60bdcfeb7f424b23aa6ab63de81e2f08Bryan Cain const gl_constant_value values[4], GLuint size, 148b191382c60bdcfeb7f424b23aa6ab63de81e2f08Bryan Cain GLenum datatype, GLuint *swizzleOut); 149b191382c60bdcfeb7f424b23aa6ab63de81e2f08Bryan Cain 150b191382c60bdcfeb7f424b23aa6ab63de81e2f08Bryan Cainextern GLint 15100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_unnamed_constant(struct gl_program_parameter_list *paramList, 1526d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const gl_constant_value values[4], GLuint size, 15300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint *swizzleOut); 15400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 15500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 15600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_varying(struct gl_program_parameter_list *paramList, 157038aba1f082d696a49db7c818766c5886f4efa83Brian Paul const char *name, GLuint size, GLenum datatype, 158038aba1f082d696a49db7c818766c5886f4efa83Brian Paul GLbitfield flags); 15900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 16000cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 1613209c3ed0d82c158eed1020759aacf51ba1c1ad5Brian_mesa_add_attribute(struct gl_program_parameter_list *paramList, 162ffbc66bf614c5a2b9bc3a68a6fa7d027405a55b9Brian Paul const char *name, GLint size, GLenum datatype, GLint attrib); 1633209c3ed0d82c158eed1020759aacf51ba1c1ad5Brian 1643209c3ed0d82c158eed1020759aacf51ba1c1ad5Brianextern GLint 16500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_add_state_reference(struct gl_program_parameter_list *paramList, 166aa9d22a1c0f3256497088985c290d4046e089456Brian const gl_state_index stateTokens[STATE_LENGTH]); 16700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 1686d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cainextern gl_constant_value * 16900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_lookup_parameter_value(const struct gl_program_parameter_list *paramList, 17000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLsizei nameLen, const char *name); 17100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 17200cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLint 17300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_lookup_parameter_index(const struct gl_program_parameter_list *paramList, 17400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLsizei nameLen, const char *name); 17500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 17600cdc0a472c55330cbc58317f01b07f8f90be5a5Brianextern GLboolean 1775b01c5e9d2c0283cc31981b6c85dc6392144b3dbBrian_mesa_lookup_parameter_constant(const struct gl_program_parameter_list *list, 1786d89abadbcd68bbe9e08f041412549f8dc1fc73cBryan Cain const gl_constant_value v[], GLuint vSize, 17900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLint *posOut, GLuint *swizzleOut); 18000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 1815b01c5e9d2c0283cc31981b6c85dc6392144b3dbBrianextern GLuint 182274ac7a801766a0ae766219ec6a40ed52e479d07Brian_mesa_num_parameters_of_type(const struct gl_program_parameter_list *list, 183b4026d9be828bd0b6f60158456edf24994efb053Brian Paul gl_register_file type); 184274ac7a801766a0ae766219ec6a40ed52e479d07Brian 18500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 18663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus 18763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca} 18863e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif 18963e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca 19000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#endif /* PROG_PARAMETER_H */ 191