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