169861ae49724dd49ae3ba82398239ad892753de7Brian Paul/*
269861ae49724dd49ae3ba82398239ad892753de7Brian Paul * Mesa 3-D graphics library
369861ae49724dd49ae3ba82398239ad892753de7Brian Paul *
469861ae49724dd49ae3ba82398239ad892753de7Brian Paul * Copyright (C) 2010  VMware, Inc.  All Rights Reserved.
569861ae49724dd49ae3ba82398239ad892753de7Brian Paul *
669861ae49724dd49ae3ba82398239ad892753de7Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
769861ae49724dd49ae3ba82398239ad892753de7Brian Paul * copy of this software and associated documentation files (the "Software"),
869861ae49724dd49ae3ba82398239ad892753de7Brian Paul * to deal in the Software without restriction, including without limitation
969861ae49724dd49ae3ba82398239ad892753de7Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1069861ae49724dd49ae3ba82398239ad892753de7Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
1169861ae49724dd49ae3ba82398239ad892753de7Brian Paul * Software is furnished to do so, subject to the following conditions:
1269861ae49724dd49ae3ba82398239ad892753de7Brian Paul *
1369861ae49724dd49ae3ba82398239ad892753de7Brian Paul * The above copyright notice and this permission notice shall be included
1469861ae49724dd49ae3ba82398239ad892753de7Brian Paul * in all copies or substantial portions of the Software.
1569861ae49724dd49ae3ba82398239ad892753de7Brian Paul *
1669861ae49724dd49ae3ba82398239ad892753de7Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1769861ae49724dd49ae3ba82398239ad892753de7Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1869861ae49724dd49ae3ba82398239ad892753de7Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1969861ae49724dd49ae3ba82398239ad892753de7Brian Paul * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
2069861ae49724dd49ae3ba82398239ad892753de7Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
2169861ae49724dd49ae3ba82398239ad892753de7Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2269861ae49724dd49ae3ba82398239ad892753de7Brian Paul */
2369861ae49724dd49ae3ba82398239ad892753de7Brian Paul
2469861ae49724dd49ae3ba82398239ad892753de7Brian Paul
2569861ae49724dd49ae3ba82398239ad892753de7Brian Paul#ifndef UNIFORMS_H
2669861ae49724dd49ae3ba82398239ad892753de7Brian Paul#define UNIFORMS_H
2769861ae49724dd49ae3ba82398239ad892753de7Brian Paul
281978247f85fd9e4c78ce346543c50910be40da0fVinson Lee#include "glheader.h"
29daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt#include "program/prog_parameter.h"
30719909698c67c287a393d2380278e7b7495ae018Ian Romanick#include "../glsl/glsl_types.h"
3170650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick#include "../glsl/ir_uniform.h"
321978247f85fd9e4c78ce346543c50910be40da0fVinson Lee
3363e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
3463e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonsecaextern "C" {
3563e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
3663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
3763e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
381978247f85fd9e4c78ce346543c50910be40da0fVinson Leestruct gl_program;
391978247f85fd9e4c78ce346543c50910be40da0fVinson Leestruct _glapi_table;
4069861ae49724dd49ae3ba82398239ad892753de7Brian Paul
41a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
42a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1fARB(GLint, GLfloat);
43a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
44a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
45a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2fARB(GLint, GLfloat, GLfloat);
46a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
47a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
48a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3fARB(GLint, GLfloat, GLfloat, GLfloat);
49a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
50a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
51a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4fARB(GLint, GLfloat, GLfloat, GLfloat, GLfloat);
52a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
53a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
54a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1iARB(GLint, GLint);
55a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
56a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
57a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2iARB(GLint, GLint, GLint);
58a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
59a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
60a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3iARB(GLint, GLint, GLint, GLint);
61a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
62a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
63a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4iARB(GLint, GLint, GLint, GLint, GLint);
64a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
65a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
66a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1fvARB(GLint, GLsizei, const GLfloat *);
67a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
68a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
69a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2fvARB(GLint, GLsizei, const GLfloat *);
70a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
71a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
72a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3fvARB(GLint, GLsizei, const GLfloat *);
73a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
74a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
75a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4fvARB(GLint, GLsizei, const GLfloat *);
76a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
77a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
78a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1ivARB(GLint, GLsizei, const GLint *);
79a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
80a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
81a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2ivARB(GLint, GLsizei, const GLint *);
82a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
83a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
84a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3ivARB(GLint, GLsizei, const GLint *);
85a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
86a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
87a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4ivARB(GLint, GLsizei, const GLint *);
88a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
89a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
90a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1ui(GLint location, GLuint v0);
91a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
92a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
93a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1);
94a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
95a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
96a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
97a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
98a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
99a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
100a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
101a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
102a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value);
103a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
104a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
105a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value);
106a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
107a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
108a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value);
109a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
110a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
111a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value);
112a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
113a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
114a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
115a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix2fvARB(GLint, GLsizei, GLboolean, const GLfloat *);
116a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
117a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
118a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix3fvARB(GLint, GLsizei, GLboolean, const GLfloat *);
119a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
120a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
121a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix4fvARB(GLint, GLsizei, GLboolean, const GLfloat *);
122a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
123a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
124a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
125a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
126a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
127a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
128a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
129a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
130a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
131a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
132a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
133a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
134a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
135a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
136a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
137a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
138a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
139a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
140a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
141a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
142a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
143a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
144a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
145a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                         const GLfloat *value);
146a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
147a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
148a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
149a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_GetActiveUniformARB(GLhandleARB, GLuint, GLsizei, GLsizei *,
150a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul                          GLint *, GLenum *, GLcharARB *);
151a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
152a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
1539f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt_mesa_GetActiveUniformsiv(GLuint program,
1549f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt			  GLsizei uniformCount,
1559f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt			  const GLuint *uniformIndices,
1569f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt			  GLenum pname,
1579f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt			  GLint *params);
1589f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholt
1599f1a4a6340824786142be9bc14f0c3418f14a69fEric Anholtextern void GLAPIENTRY
160a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_GetUniformfvARB(GLhandleARB, GLint, GLfloat *);
161a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
162a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void GLAPIENTRY
1636b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnUniformfvARB(GLhandleARB, GLint, GLsizei, GLfloat *);
1646b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
1656b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paulextern void GLAPIENTRY
166a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_GetUniformivARB(GLhandleARB, GLint, GLint *);
167a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
1689c61ca90eaf466211281eba6cacb243d4ed8db5bBrian Paulextern void GLAPIENTRY
1696b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnUniformivARB(GLhandleARB, GLint, GLsizei, GLint *);
1706b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
1716b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paulextern void GLAPIENTRY
1726b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetUniformuiv(GLhandleARB, GLint, GLuint *);
1736b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
1746b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paulextern void GLAPIENTRY
1756b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnUniformuivARB(GLhandleARB, GLint, GLsizei, GLuint *);
1766b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
1776b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paulextern void GLAPIENTRY
1786b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetUniformdv(GLhandleARB, GLint, GLdouble *);
1796b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul
1806b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paulextern void GLAPIENTRY
1816b329b9274b18c50f4177eef7ee087d50ebc1525Brian Paul_mesa_GetnUniformdvARB(GLhandleARB, GLint, GLsizei, GLdouble *);
1829c61ca90eaf466211281eba6cacb243d4ed8db5bBrian Paul
183a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern GLint GLAPIENTRY
184a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul_mesa_GetUniformLocationARB(GLhandleARB, const GLcharARB *);
185a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
186abcdbdf9cce3c7520ee999fac3099d609960847dEric Anholtunsigned
187f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_uniform_location(struct gl_context *ctx, struct gl_shader_program *shProg,
188abcdbdf9cce3c7520ee999fac3099d609960847dEric Anholt			   const GLchar *name, unsigned *offset);
1892f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt
1902f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtvoid
191f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shader_program,
1922f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt	      GLint location, GLsizei count,
1932f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt              const GLvoid *values, GLenum type);
1942f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt
1952f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholtvoid
196f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
197207a016ecaabbccf865a5b8e026b95a4276adc15Brian Paul		     GLuint cols, GLuint rows,
1982f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt                     GLint location, GLsizei count,
1992f5bf20e44d509fa3afbe2cfbb9bb65347daea6aEric Anholt                     GLboolean transpose, const GLfloat *values);
200a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
2014ad41af616fed7ad0b6980f7181c9db9b95a6732Ian Romanickvoid
2024ad41af616fed7ad0b6980f7181c9db9b95a6732Ian Romanick_mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
203719909698c67c287a393d2380278e7b7495ae018Ian Romanick		  GLsizei bufSize, enum glsl_base_type returnType,
204719909698c67c287a393d2380278e7b7495ae018Ian Romanick		  GLvoid *paramsOut);
2054ad41af616fed7ad0b6980f7181c9db9b95a6732Ian Romanick
20669861ae49724dd49ae3ba82398239ad892753de7Brian Paulextern void
20770650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick_mesa_uniform_attach_driver_storage(struct gl_uniform_storage *,
20870650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick				    unsigned element_stride,
20970650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick				    unsigned vector_stride,
21070650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick				    enum gl_uniform_driver_format format,
21170650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick				    void *data);
21270650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick
21370650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanickextern void
21470650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick_mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni);
21570650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanick
21670650d08fa3f4db2aea41e4ed47b271c3a3e7385Ian Romanickextern void
2179516182e80d5a21ab402c9b2cbe9e6c46e5bb1d8Ian Romanick_mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
2189516182e80d5a21ab402c9b2cbe9e6c46e5bb1d8Ian Romanick					   unsigned array_index,
2199516182e80d5a21ab402c9b2cbe9e6c46e5bb1d8Ian Romanick					   unsigned count);
2209516182e80d5a21ab402c9b2cbe9e6c46e5bb1d8Ian Romanick
2219516182e80d5a21ab402c9b2cbe9e6c46e5bb1d8Ian Romanickextern void
2226a992c3288b6f7a5d94172c9ad1908e71e58233eIan Romanick_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
2236a992c3288b6f7a5d94172c9ad1908e71e58233eIan Romanick				  struct gl_program *prog);
22469861ae49724dd49ae3ba82398239ad892753de7Brian Paul
225195ee502c3196607e3a74075aefade9770a08a67Ian Romanickextern bool
226195ee502c3196607e3a74075aefade9770a08a67Ian Romanick_mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
227195ee502c3196607e3a74075aefade9770a08a67Ian Romanick				 char *errMsg, size_t errMsgLength);
22869861ae49724dd49ae3ba82398239ad892753de7Brian Paul
229a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paulextern void
2304cdbf27fac2537fe1c5216afd5c10bde224eb57bIan Romanick_mesa_init_shader_uniform_dispatch(const struct gl_context *ctx,
2314cdbf27fac2537fe1c5216afd5c10bde224eb57bIan Romanick                                   struct _glapi_table *exec);
232a37b2219d6e3f299379c6434d65f300660d12c3eBrian Paul
233a541ff3fb99f43f9f664daf275e315af2836977eIan Romanickextern const struct gl_program_parameter *
234a541ff3fb99f43f9f664daf275e315af2836977eIan Romanickget_uniform_parameter(struct gl_shader_program *shProg, GLint index);
235a541ff3fb99f43f9f664daf275e315af2836977eIan Romanick
236daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholtstruct gl_builtin_uniform_element {
237daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   const char *field;
238daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   int tokens[STATE_LENGTH];
239daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   int swizzle;
240daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt};
241daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt
242daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholtstruct gl_builtin_uniform_desc {
243daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   const char *name;
244daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   struct gl_builtin_uniform_element *elements;
245daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt   unsigned int num_elements;
246daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt};
247daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt
248daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholtextern const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[];
249daacaac3c8b91c87ab2cfc2d9f821474552b8181Eric Anholt
250637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick/**
251637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * \name GLSL uniform arrays and structs require special handling.
252637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *
253637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * The GL_ARB_shader_objects spec says that if you use
254637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * glGetUniformLocation to get the location of an array, you CANNOT
255637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * access other elements of the array by adding an offset to the
256637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * returned location.  For example, you must call
257637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * glGetUniformLocation("foo[16]") if you want to set the 16th element
258637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * of the array with glUniform().
259637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *
260637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * HOWEVER, some other OpenGL drivers allow accessing array elements
261637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * by adding an offset to the returned array location.  And some apps
262637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * seem to depend on that behaviour.
263637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *
264637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * Mesa's gl_uniform_list doesn't directly support this since each
265637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * entry in the list describes one uniform variable, not one uniform
266637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * element.  We could insert dummy entries in the list for each array
267637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * element after [0] but that causes complications elsewhere.
268637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *
269637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * We solve this problem by encoding two values in the location that's
270637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * returned by glGetUniformLocation():
271637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *  a) index into gl_uniform_list::Uniforms[] for the uniform
272637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *  b) an array/field offset (0 for simple types)
273637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick *
274637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * These two values are encoded in the high and low halves of a GLint.
275637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * By putting the uniform number in the high part and the offset in the
276637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * low part, we can support the unofficial ability to index into arrays
277637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * by adding offsets to the location value.
278637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick */
279637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick/*@{*/
280637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick/**
281637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * Combine the uniform's base location and the offset
282637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick */
283637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanickstatic inline GLint
284637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick_mesa_uniform_merge_location_offset(unsigned base_location, unsigned offset)
285637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick{
286637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick   return (base_location << 16) | offset;
287637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick}
288637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick
289637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick/**
290637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick * Separate the uniform base location and parameter offset
291637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick */
292637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanickstatic inline void
293637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick_mesa_uniform_split_location_offset(GLint location, unsigned *base_location,
294637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick				    unsigned *offset)
295637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick{
296637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick   *offset = location & 0xffff;
297637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick   *base_location = location >> 16;
298637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick}
299637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick/*@}*/
300637a7eb9e981d7dbe3bdb0c39712a9183ea19e9cIan Romanick
30163e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
30263e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#ifdef __cplusplus
30363e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca}
30463e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca#endif
30563e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
30663e7a4c6e5bf51d8090046ebc5adcb4207448565José Fonseca
30769861ae49724dd49ae3ba82398239ad892753de7Brian Paul#endif /* UNIFORMS_H */
308