1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 2004-2008  Brian Paul   All Rights Reserved.
5848b8605Smrg * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
6848b8605Smrg * Copyright © 2010 Intel Corporation
7848b8605Smrg *
8848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
9848b8605Smrg * copy of this software and associated documentation files (the "Software"),
10848b8605Smrg * to deal in the Software without restriction, including without limitation
11848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
13848b8605Smrg * Software is furnished to do so, subject to the following conditions:
14848b8605Smrg *
15848b8605Smrg * The above copyright notice and this permission notice shall be included
16848b8605Smrg * in all copies or substantial portions of the Software.
17848b8605Smrg *
18848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
25848b8605Smrg */
26848b8605Smrg
27848b8605Smrg/**
28848b8605Smrg * \file uniforms.c
29848b8605Smrg * Functions related to GLSL uniform variables.
30848b8605Smrg * \author Brian Paul
31848b8605Smrg */
32848b8605Smrg
33848b8605Smrg/**
34848b8605Smrg * XXX things to do:
35848b8605Smrg * 1. Check that the right error code is generated for all _mesa_error() calls.
36848b8605Smrg * 2. Insert FLUSH_VERTICES calls in various places
37848b8605Smrg */
38848b8605Smrg
39848b8605Smrg#include "main/glheader.h"
40848b8605Smrg#include "main/context.h"
41848b8605Smrg#include "main/shaderapi.h"
42848b8605Smrg#include "main/shaderobj.h"
43848b8605Smrg#include "main/uniforms.h"
44848b8605Smrg#include "main/enums.h"
45b8e80941Smrg#include "compiler/glsl/ir_uniform.h"
46b8e80941Smrg#include "compiler/glsl_types.h"
47848b8605Smrg#include "program/program.h"
48b8e80941Smrg#include "util/bitscan.h"
49848b8605Smrg
50848b8605Smrg/**
51848b8605Smrg * Update the vertex/fragment program's TexturesUsed array.
52848b8605Smrg *
53848b8605Smrg * This needs to be called after glUniform(set sampler var) is called.
54848b8605Smrg * A call to glUniform(samplerVar, value) causes a sampler to point to a
55848b8605Smrg * particular texture unit.  We know the sampler's texture target
56848b8605Smrg * (1D/2D/3D/etc) from compile time but the sampler's texture unit is
57848b8605Smrg * set by glUniform() calls.
58848b8605Smrg *
59848b8605Smrg * So, scan the program->SamplerUnits[] and program->SamplerTargets[]
60848b8605Smrg * information to update the prog->TexturesUsed[] values.
61848b8605Smrg * Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
62848b8605Smrg * TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
63848b8605Smrg * We'll use that info for state validation before rendering.
64848b8605Smrg */
65b8e80941Smrgstatic inline void
66b8e80941Smrgupdate_single_shader_texture_used(struct gl_shader_program *shProg,
67b8e80941Smrg                                  struct gl_program *prog,
68b8e80941Smrg                                  GLuint unit, GLuint target)
69b8e80941Smrg{
70b8e80941Smrg   gl_shader_stage prog_stage =
71b8e80941Smrg      _mesa_program_enum_to_shader_stage(prog->Target);
72b8e80941Smrg
73b8e80941Smrg   assert(unit < ARRAY_SIZE(prog->TexturesUsed));
74b8e80941Smrg   assert(target < NUM_TEXTURE_TARGETS);
75b8e80941Smrg
76b8e80941Smrg   /* From section 7.10 (Samplers) of the OpenGL 4.5 spec:
77b8e80941Smrg    *
78b8e80941Smrg    * "It is not allowed to have variables of different sampler types pointing
79b8e80941Smrg    *  to the same texture image unit within a program object."
80b8e80941Smrg    */
81b8e80941Smrg   unsigned stages_mask = shProg->data->linked_stages;
82b8e80941Smrg   while (stages_mask) {
83b8e80941Smrg      const int stage = u_bit_scan(&stages_mask);
84b8e80941Smrg
85b8e80941Smrg      /* Skip validation if we are yet to update textures used in this
86b8e80941Smrg       * stage.
87b8e80941Smrg       */
88b8e80941Smrg      if (prog_stage < stage)
89b8e80941Smrg         break;
90b8e80941Smrg
91b8e80941Smrg      struct gl_program *glprog = shProg->_LinkedShaders[stage]->Program;
92b8e80941Smrg      if (glprog->TexturesUsed[unit] & ~(1 << target))
93b8e80941Smrg         shProg->SamplersValidated = GL_FALSE;
94b8e80941Smrg   }
95b8e80941Smrg
96b8e80941Smrg   prog->TexturesUsed[unit] |= (1 << target);
97b8e80941Smrg}
98b8e80941Smrg
99848b8605Smrgvoid
100848b8605Smrg_mesa_update_shader_textures_used(struct gl_shader_program *shProg,
101b8e80941Smrg                                  struct gl_program *prog)
102848b8605Smrg{
103b8e80941Smrg   GLbitfield mask = prog->SamplersUsed;
104b8e80941Smrg   gl_shader_stage prog_stage =
105b8e80941Smrg      _mesa_program_enum_to_shader_stage(prog->Target);
106b8e80941Smrg   MAYBE_UNUSED struct gl_linked_shader *shader =
107b8e80941Smrg      shProg->_LinkedShaders[prog_stage];
108848b8605Smrg   GLuint s;
109848b8605Smrg
110848b8605Smrg   assert(shader);
111848b8605Smrg
112848b8605Smrg   memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
113848b8605Smrg
114b8e80941Smrg   while (mask) {
115b8e80941Smrg      s = u_bit_scan(&mask);
116b8e80941Smrg
117b8e80941Smrg      update_single_shader_texture_used(shProg, prog,
118b8e80941Smrg                                        prog->SamplerUnits[s],
119b8e80941Smrg                                        prog->sh.SamplerTargets[s]);
120b8e80941Smrg   }
121b8e80941Smrg
122b8e80941Smrg   if (unlikely(prog->sh.HasBoundBindlessSampler)) {
123b8e80941Smrg      /* Loop over bindless samplers bound to texture units.
124b8e80941Smrg       */
125b8e80941Smrg      for (s = 0; s < prog->sh.NumBindlessSamplers; s++) {
126b8e80941Smrg         struct gl_bindless_sampler *sampler = &prog->sh.BindlessSamplers[s];
127b8e80941Smrg
128b8e80941Smrg         if (!sampler->bound)
129b8e80941Smrg            continue;
130b8e80941Smrg
131b8e80941Smrg         update_single_shader_texture_used(shProg, prog, sampler->unit,
132b8e80941Smrg                                           sampler->target);
133848b8605Smrg      }
134848b8605Smrg   }
135848b8605Smrg}
136848b8605Smrg
137848b8605Smrg/**
138848b8605Smrg * Connect a piece of driver storage with a part of a uniform
139848b8605Smrg *
140848b8605Smrg * \param uni            The uniform with which the storage will be associated
141848b8605Smrg * \param element_stride Byte-stride between array elements.
142848b8605Smrg *                       \sa gl_uniform_driver_storage::element_stride.
143848b8605Smrg * \param vector_stride  Byte-stride between vectors (in a matrix).
144848b8605Smrg *                       \sa gl_uniform_driver_storage::vector_stride.
145848b8605Smrg * \param format         Conversion from native format to driver format
146848b8605Smrg *                       required by the driver.
147848b8605Smrg * \param data           Location to dump the data.
148848b8605Smrg */
149848b8605Smrgvoid
150848b8605Smrg_mesa_uniform_attach_driver_storage(struct gl_uniform_storage *uni,
151848b8605Smrg				    unsigned element_stride,
152848b8605Smrg				    unsigned vector_stride,
153848b8605Smrg				    enum gl_uniform_driver_format format,
154848b8605Smrg				    void *data)
155848b8605Smrg{
156848b8605Smrg   uni->driver_storage =
157848b8605Smrg      realloc(uni->driver_storage,
158848b8605Smrg	      sizeof(struct gl_uniform_driver_storage)
159848b8605Smrg	      * (uni->num_driver_storage + 1));
160848b8605Smrg
161848b8605Smrg   uni->driver_storage[uni->num_driver_storage].element_stride = element_stride;
162848b8605Smrg   uni->driver_storage[uni->num_driver_storage].vector_stride = vector_stride;
163848b8605Smrg   uni->driver_storage[uni->num_driver_storage].format = format;
164848b8605Smrg   uni->driver_storage[uni->num_driver_storage].data = data;
165848b8605Smrg
166848b8605Smrg   uni->num_driver_storage++;
167848b8605Smrg}
168848b8605Smrg
169848b8605Smrg/**
170848b8605Smrg * Sever all connections with all pieces of driver storage for all uniforms
171848b8605Smrg *
172848b8605Smrg * \warning
173848b8605Smrg * This function does \b not release any of the \c data pointers
174848b8605Smrg * previously passed in to \c _mesa_uniform_attach_driver_stoarge.
175848b8605Smrg */
176848b8605Smrgvoid
177848b8605Smrg_mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni)
178848b8605Smrg{
179848b8605Smrg   free(uni->driver_storage);
180848b8605Smrg   uni->driver_storage = NULL;
181848b8605Smrg   uni->num_driver_storage = 0;
182848b8605Smrg}
183848b8605Smrg
184848b8605Smrgvoid GLAPIENTRY
185848b8605Smrg_mesa_Uniform1f(GLint location, GLfloat v0)
186848b8605Smrg{
187848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
188b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 1);
189848b8605Smrg}
190848b8605Smrg
191848b8605Smrgvoid GLAPIENTRY
192848b8605Smrg_mesa_Uniform2f(GLint location, GLfloat v0, GLfloat v1)
193848b8605Smrg{
194848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
195848b8605Smrg   GLfloat v[2];
196848b8605Smrg   v[0] = v0;
197848b8605Smrg   v[1] = v1;
198b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 2);
199848b8605Smrg}
200848b8605Smrg
201848b8605Smrgvoid GLAPIENTRY
202848b8605Smrg_mesa_Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
203848b8605Smrg{
204848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
205848b8605Smrg   GLfloat v[3];
206848b8605Smrg   v[0] = v0;
207848b8605Smrg   v[1] = v1;
208848b8605Smrg   v[2] = v2;
209b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 3);
210848b8605Smrg}
211848b8605Smrg
212848b8605Smrgvoid GLAPIENTRY
213848b8605Smrg_mesa_Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
214848b8605Smrg                   GLfloat v3)
215848b8605Smrg{
216848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
217848b8605Smrg   GLfloat v[4];
218848b8605Smrg   v[0] = v0;
219848b8605Smrg   v[1] = v1;
220848b8605Smrg   v[2] = v2;
221848b8605Smrg   v[3] = v3;
222b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 4);
223848b8605Smrg}
224848b8605Smrg
225848b8605Smrgvoid GLAPIENTRY
226848b8605Smrg_mesa_Uniform1i(GLint location, GLint v0)
227848b8605Smrg{
228848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
229b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 1);
230848b8605Smrg}
231848b8605Smrg
232848b8605Smrgvoid GLAPIENTRY
233848b8605Smrg_mesa_Uniform2i(GLint location, GLint v0, GLint v1)
234848b8605Smrg{
235848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
236848b8605Smrg   GLint v[2];
237848b8605Smrg   v[0] = v0;
238848b8605Smrg   v[1] = v1;
239b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 2);
240848b8605Smrg}
241848b8605Smrg
242848b8605Smrgvoid GLAPIENTRY
243848b8605Smrg_mesa_Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
244848b8605Smrg{
245848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
246848b8605Smrg   GLint v[3];
247848b8605Smrg   v[0] = v0;
248848b8605Smrg   v[1] = v1;
249848b8605Smrg   v[2] = v2;
250b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 3);
251848b8605Smrg}
252848b8605Smrg
253848b8605Smrgvoid GLAPIENTRY
254848b8605Smrg_mesa_Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
255848b8605Smrg{
256848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
257848b8605Smrg   GLint v[4];
258848b8605Smrg   v[0] = v0;
259848b8605Smrg   v[1] = v1;
260848b8605Smrg   v[2] = v2;
261848b8605Smrg   v[3] = v3;
262b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 4);
263848b8605Smrg}
264848b8605Smrg
265848b8605Smrgvoid GLAPIENTRY
266848b8605Smrg_mesa_Uniform1fv(GLint location, GLsizei count, const GLfloat * value)
267848b8605Smrg{
268848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
269b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 1);
270848b8605Smrg}
271848b8605Smrg
272848b8605Smrgvoid GLAPIENTRY
273848b8605Smrg_mesa_Uniform2fv(GLint location, GLsizei count, const GLfloat * value)
274848b8605Smrg{
275848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
276b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 2);
277848b8605Smrg}
278848b8605Smrg
279848b8605Smrgvoid GLAPIENTRY
280848b8605Smrg_mesa_Uniform3fv(GLint location, GLsizei count, const GLfloat * value)
281848b8605Smrg{
282848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
283b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 3);
284848b8605Smrg}
285848b8605Smrg
286848b8605Smrgvoid GLAPIENTRY
287848b8605Smrg_mesa_Uniform4fv(GLint location, GLsizei count, const GLfloat * value)
288848b8605Smrg{
289848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
290b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 4);
291848b8605Smrg}
292848b8605Smrg
293848b8605Smrgvoid GLAPIENTRY
294848b8605Smrg_mesa_Uniform1iv(GLint location, GLsizei count, const GLint * value)
295848b8605Smrg{
296848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
297b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 1);
298848b8605Smrg}
299848b8605Smrg
300848b8605Smrgvoid GLAPIENTRY
301848b8605Smrg_mesa_Uniform2iv(GLint location, GLsizei count, const GLint * value)
302848b8605Smrg{
303848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
304b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 2);
305848b8605Smrg}
306848b8605Smrg
307848b8605Smrgvoid GLAPIENTRY
308848b8605Smrg_mesa_Uniform3iv(GLint location, GLsizei count, const GLint * value)
309848b8605Smrg{
310848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
311b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 3);
312848b8605Smrg}
313848b8605Smrg
314848b8605Smrgvoid GLAPIENTRY
315848b8605Smrg_mesa_Uniform4iv(GLint location, GLsizei count, const GLint * value)
316848b8605Smrg{
317848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
318b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 4);
319b8e80941Smrg}
320b8e80941Smrg
321b8e80941Smrgvoid GLAPIENTRY
322b8e80941Smrg_mesa_UniformHandleui64ARB(GLint location, GLuint64 value)
323b8e80941Smrg{
324b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
325b8e80941Smrg   _mesa_uniform_handle(location, 1, &value, ctx, ctx->_Shader->ActiveProgram);
326b8e80941Smrg}
327b8e80941Smrg
328b8e80941Smrgvoid GLAPIENTRY
329b8e80941Smrg_mesa_UniformHandleui64vARB(GLint location, GLsizei count,
330b8e80941Smrg                            const GLuint64 *value)
331b8e80941Smrg{
332b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
333b8e80941Smrg   _mesa_uniform_handle(location, count, value, ctx,
334b8e80941Smrg                        ctx->_Shader->ActiveProgram);
335848b8605Smrg}
336848b8605Smrg
337b8e80941Smrg
338848b8605Smrg/** Same as above with direct state access **/
339848b8605Smrgvoid GLAPIENTRY
340848b8605Smrg_mesa_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
341848b8605Smrg{
342848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
343848b8605Smrg   struct gl_shader_program *shProg =
344848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
345848b8605Smrg            "glProgramUniform1f");
346b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_FLOAT, 1);
347848b8605Smrg}
348848b8605Smrg
349848b8605Smrgvoid GLAPIENTRY
350848b8605Smrg_mesa_ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
351848b8605Smrg{
352848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
353848b8605Smrg   GLfloat v[2];
354848b8605Smrg   struct gl_shader_program *shProg;
355848b8605Smrg   v[0] = v0;
356848b8605Smrg   v[1] = v1;
357848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2f");
358b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 2);
359848b8605Smrg}
360848b8605Smrg
361848b8605Smrgvoid GLAPIENTRY
362848b8605Smrg_mesa_ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
363848b8605Smrg                       GLfloat v2)
364848b8605Smrg{
365848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
366848b8605Smrg   GLfloat v[3];
367848b8605Smrg   struct gl_shader_program *shProg;
368848b8605Smrg   v[0] = v0;
369848b8605Smrg   v[1] = v1;
370848b8605Smrg   v[2] = v2;
371848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3f");
372b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 3);
373848b8605Smrg}
374848b8605Smrg
375848b8605Smrgvoid GLAPIENTRY
376848b8605Smrg_mesa_ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
377848b8605Smrg                       GLfloat v2, GLfloat v3)
378848b8605Smrg{
379848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
380848b8605Smrg   GLfloat v[4];
381848b8605Smrg   struct gl_shader_program *shProg;
382848b8605Smrg   v[0] = v0;
383848b8605Smrg   v[1] = v1;
384848b8605Smrg   v[2] = v2;
385848b8605Smrg   v[3] = v3;
386848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4f");
387b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 4);
388848b8605Smrg}
389848b8605Smrg
390848b8605Smrgvoid GLAPIENTRY
391848b8605Smrg_mesa_ProgramUniform1i(GLuint program, GLint location, GLint v0)
392848b8605Smrg{
393848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
394848b8605Smrg   struct gl_shader_program *shProg =
395848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
396848b8605Smrg            "glProgramUniform1i");
397b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_INT, 1);
398848b8605Smrg}
399848b8605Smrg
400848b8605Smrgvoid GLAPIENTRY
401848b8605Smrg_mesa_ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
402848b8605Smrg{
403848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
404848b8605Smrg   GLint v[2];
405848b8605Smrg   struct gl_shader_program *shProg;
406848b8605Smrg   v[0] = v0;
407848b8605Smrg   v[1] = v1;
408848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2i");
409b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 2);
410848b8605Smrg}
411848b8605Smrg
412848b8605Smrgvoid GLAPIENTRY
413848b8605Smrg_mesa_ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1,
414848b8605Smrg                       GLint v2)
415848b8605Smrg{
416848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
417848b8605Smrg   GLint v[3];
418848b8605Smrg   struct gl_shader_program *shProg;
419848b8605Smrg   v[0] = v0;
420848b8605Smrg   v[1] = v1;
421848b8605Smrg   v[2] = v2;
422848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3i");
423b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 3);
424848b8605Smrg}
425848b8605Smrg
426848b8605Smrgvoid GLAPIENTRY
427848b8605Smrg_mesa_ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1,
428848b8605Smrg                       GLint v2, GLint v3)
429848b8605Smrg{
430848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
431848b8605Smrg   GLint v[4];
432848b8605Smrg   struct gl_shader_program *shProg;
433848b8605Smrg   v[0] = v0;
434848b8605Smrg   v[1] = v1;
435848b8605Smrg   v[2] = v2;
436848b8605Smrg   v[3] = v3;
437848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4i");
438b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 4);
439848b8605Smrg}
440848b8605Smrg
441848b8605Smrgvoid GLAPIENTRY
442848b8605Smrg_mesa_ProgramUniform1fv(GLuint program, GLint location, GLsizei count,
443848b8605Smrg                        const GLfloat * value)
444848b8605Smrg{
445848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
446848b8605Smrg   struct gl_shader_program *shProg =
447848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
448848b8605Smrg            "glProgramUniform1fv");
449b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 1);
450848b8605Smrg}
451848b8605Smrg
452848b8605Smrgvoid GLAPIENTRY
453848b8605Smrg_mesa_ProgramUniform2fv(GLuint program, GLint location, GLsizei count,
454848b8605Smrg                        const GLfloat * value)
455848b8605Smrg{
456848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
457848b8605Smrg   struct gl_shader_program *shProg =
458848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
459848b8605Smrg            "glProgramUniform2fv");
460b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 2);
461848b8605Smrg}
462848b8605Smrg
463848b8605Smrgvoid GLAPIENTRY
464848b8605Smrg_mesa_ProgramUniform3fv(GLuint program, GLint location, GLsizei count,
465848b8605Smrg                        const GLfloat * value)
466848b8605Smrg{
467848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
468848b8605Smrg   struct gl_shader_program *shProg =
469848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
470848b8605Smrg            "glProgramUniform3fv");
471b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 3);
472848b8605Smrg}
473848b8605Smrg
474848b8605Smrgvoid GLAPIENTRY
475848b8605Smrg_mesa_ProgramUniform4fv(GLuint program, GLint location, GLsizei count,
476848b8605Smrg                        const GLfloat * value)
477848b8605Smrg{
478848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
479848b8605Smrg   struct gl_shader_program *shProg =
480848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
481848b8605Smrg            "glProgramUniform4fv");
482b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 4);
483848b8605Smrg}
484848b8605Smrg
485848b8605Smrgvoid GLAPIENTRY
486848b8605Smrg_mesa_ProgramUniform1iv(GLuint program, GLint location, GLsizei count,
487848b8605Smrg                        const GLint * value)
488848b8605Smrg{
489848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
490848b8605Smrg   struct gl_shader_program *shProg =
491848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
492848b8605Smrg            "glProgramUniform1iv");
493b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 1);
494848b8605Smrg}
495848b8605Smrg
496848b8605Smrgvoid GLAPIENTRY
497848b8605Smrg_mesa_ProgramUniform2iv(GLuint program, GLint location, GLsizei count,
498848b8605Smrg                        const GLint * value)
499848b8605Smrg{
500848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
501848b8605Smrg   struct gl_shader_program *shProg =
502848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
503848b8605Smrg            "glProgramUniform2iv");
504b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 2);
505848b8605Smrg}
506848b8605Smrg
507848b8605Smrgvoid GLAPIENTRY
508848b8605Smrg_mesa_ProgramUniform3iv(GLuint program, GLint location, GLsizei count,
509848b8605Smrg                        const GLint * value)
510848b8605Smrg{
511848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
512848b8605Smrg   struct gl_shader_program *shProg =
513848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
514848b8605Smrg            "glProgramUniform3iv");
515b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 3);
516848b8605Smrg}
517848b8605Smrg
518848b8605Smrgvoid GLAPIENTRY
519848b8605Smrg_mesa_ProgramUniform4iv(GLuint program, GLint location, GLsizei count,
520848b8605Smrg                        const GLint * value)
521848b8605Smrg{
522848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
523848b8605Smrg   struct gl_shader_program *shProg =
524848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
525848b8605Smrg            "glProgramUniform4iv");
526b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 4);
527b8e80941Smrg}
528b8e80941Smrg
529b8e80941Smrgvoid GLAPIENTRY
530b8e80941Smrg_mesa_ProgramUniformHandleui64ARB(GLuint program, GLint location,
531b8e80941Smrg                                  GLuint64 value)
532b8e80941Smrg{
533b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
534b8e80941Smrg   struct gl_shader_program *shProg =
535b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
536b8e80941Smrg            "glProgramUniformHandleui64ARB");
537b8e80941Smrg   _mesa_uniform_handle(location, 1, &value, ctx, shProg);
538b8e80941Smrg}
539b8e80941Smrg
540b8e80941Smrgvoid GLAPIENTRY
541b8e80941Smrg_mesa_ProgramUniformHandleui64vARB(GLuint program, GLint location,
542b8e80941Smrg                                   GLsizei count, const GLuint64 *values)
543b8e80941Smrg{
544b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
545b8e80941Smrg   struct gl_shader_program *shProg =
546b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
547b8e80941Smrg            "glProgramUniformHandleui64vARB");
548b8e80941Smrg   _mesa_uniform_handle(location, count, values, ctx, shProg);
549848b8605Smrg}
550848b8605Smrg
551848b8605Smrg
552848b8605Smrg/** OpenGL 3.0 GLuint-valued functions **/
553848b8605Smrgvoid GLAPIENTRY
554848b8605Smrg_mesa_Uniform1ui(GLint location, GLuint v0)
555848b8605Smrg{
556848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
557b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 1);
558848b8605Smrg}
559848b8605Smrg
560848b8605Smrgvoid GLAPIENTRY
561848b8605Smrg_mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1)
562848b8605Smrg{
563848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
564848b8605Smrg   GLuint v[2];
565848b8605Smrg   v[0] = v0;
566848b8605Smrg   v[1] = v1;
567b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 2);
568848b8605Smrg}
569848b8605Smrg
570848b8605Smrgvoid GLAPIENTRY
571848b8605Smrg_mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
572848b8605Smrg{
573848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
574848b8605Smrg   GLuint v[3];
575848b8605Smrg   v[0] = v0;
576848b8605Smrg   v[1] = v1;
577848b8605Smrg   v[2] = v2;
578b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 3);
579848b8605Smrg}
580848b8605Smrg
581848b8605Smrgvoid GLAPIENTRY
582848b8605Smrg_mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
583848b8605Smrg{
584848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
585848b8605Smrg   GLuint v[4];
586848b8605Smrg   v[0] = v0;
587848b8605Smrg   v[1] = v1;
588848b8605Smrg   v[2] = v2;
589848b8605Smrg   v[3] = v3;
590b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 4);
591848b8605Smrg}
592848b8605Smrg
593848b8605Smrgvoid GLAPIENTRY
594848b8605Smrg_mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
595848b8605Smrg{
596848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
597b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 1);
598848b8605Smrg}
599848b8605Smrg
600848b8605Smrgvoid GLAPIENTRY
601848b8605Smrg_mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
602848b8605Smrg{
603848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
604b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 2);
605848b8605Smrg}
606848b8605Smrg
607848b8605Smrgvoid GLAPIENTRY
608848b8605Smrg_mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
609848b8605Smrg{
610848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
611b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 3);
612848b8605Smrg}
613848b8605Smrg
614848b8605Smrgvoid GLAPIENTRY
615848b8605Smrg_mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
616848b8605Smrg{
617848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
618b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 4);
619848b8605Smrg}
620848b8605Smrg
621848b8605Smrg
622848b8605Smrg
623848b8605Smrgvoid GLAPIENTRY
624848b8605Smrg_mesa_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
625848b8605Smrg                          const GLfloat * value)
626848b8605Smrg{
627848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
628b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
629b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 2, GLSL_TYPE_FLOAT);
630848b8605Smrg}
631848b8605Smrg
632848b8605Smrgvoid GLAPIENTRY
633848b8605Smrg_mesa_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
634848b8605Smrg                          const GLfloat * value)
635848b8605Smrg{
636848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
637b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
638b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 3, GLSL_TYPE_FLOAT);
639848b8605Smrg}
640848b8605Smrg
641848b8605Smrgvoid GLAPIENTRY
642848b8605Smrg_mesa_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
643848b8605Smrg                          const GLfloat * value)
644848b8605Smrg{
645848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
646b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
647b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 4, GLSL_TYPE_FLOAT);
648848b8605Smrg}
649848b8605Smrg
650848b8605Smrg/** Same as above with direct state access **/
651848b8605Smrg
652848b8605Smrgvoid GLAPIENTRY
653848b8605Smrg_mesa_ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
654848b8605Smrg{
655848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
656848b8605Smrg   struct gl_shader_program *shProg =
657848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
658848b8605Smrg            "glProgramUniform1ui");
659b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_UINT, 1);
660848b8605Smrg}
661848b8605Smrg
662848b8605Smrgvoid GLAPIENTRY
663848b8605Smrg_mesa_ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
664848b8605Smrg{
665848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
666848b8605Smrg   GLuint v[2];
667848b8605Smrg   struct gl_shader_program *shProg;
668848b8605Smrg   v[0] = v0;
669848b8605Smrg   v[1] = v1;
670848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
671848b8605Smrg                                            "glProgramUniform2ui");
672b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 2);
673848b8605Smrg}
674848b8605Smrg
675848b8605Smrgvoid GLAPIENTRY
676848b8605Smrg_mesa_ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1,
677848b8605Smrg                        GLuint v2)
678848b8605Smrg{
679848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
680848b8605Smrg   GLuint v[3];
681848b8605Smrg   struct gl_shader_program *shProg;
682848b8605Smrg   v[0] = v0;
683848b8605Smrg   v[1] = v1;
684848b8605Smrg   v[2] = v2;
685848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
686848b8605Smrg                                            "glProgramUniform3ui");
687b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 3);
688848b8605Smrg}
689848b8605Smrg
690848b8605Smrgvoid GLAPIENTRY
691848b8605Smrg_mesa_ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1,
692848b8605Smrg                        GLuint v2, GLuint v3)
693848b8605Smrg{
694848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
695848b8605Smrg   GLuint v[4];
696848b8605Smrg   struct gl_shader_program *shProg;
697848b8605Smrg   v[0] = v0;
698848b8605Smrg   v[1] = v1;
699848b8605Smrg   v[2] = v2;
700848b8605Smrg   v[3] = v3;
701848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4ui");
702b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 4);
703848b8605Smrg}
704848b8605Smrg
705848b8605Smrgvoid GLAPIENTRY
706848b8605Smrg_mesa_ProgramUniform1uiv(GLuint program, GLint location, GLsizei count,
707848b8605Smrg                         const GLuint *value)
708848b8605Smrg{
709848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
710848b8605Smrg   struct gl_shader_program *shProg =
711848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
712848b8605Smrg            "glProgramUniform1uiv");
713b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 1);
714848b8605Smrg}
715848b8605Smrg
716848b8605Smrgvoid GLAPIENTRY
717848b8605Smrg_mesa_ProgramUniform2uiv(GLuint program, GLint location, GLsizei count,
718848b8605Smrg                         const GLuint *value)
719848b8605Smrg{
720848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
721848b8605Smrg   struct gl_shader_program *shProg =
722848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
723848b8605Smrg            "glProgramUniform2uiv");
724b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 2);
725848b8605Smrg}
726848b8605Smrg
727848b8605Smrgvoid GLAPIENTRY
728848b8605Smrg_mesa_ProgramUniform3uiv(GLuint program, GLint location, GLsizei count,
729848b8605Smrg                         const GLuint *value)
730848b8605Smrg{
731848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
732848b8605Smrg   struct gl_shader_program *shProg =
733848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
734848b8605Smrg            "glProgramUniform3uiv");
735b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 3);
736848b8605Smrg}
737848b8605Smrg
738848b8605Smrgvoid GLAPIENTRY
739848b8605Smrg_mesa_ProgramUniform4uiv(GLuint program, GLint location, GLsizei count,
740848b8605Smrg                         const GLuint *value)
741848b8605Smrg{
742848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
743848b8605Smrg   struct gl_shader_program *shProg =
744848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
745848b8605Smrg            "glProgramUniform4uiv");
746b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 4);
747848b8605Smrg}
748848b8605Smrg
749848b8605Smrg
750848b8605Smrg
751848b8605Smrgvoid GLAPIENTRY
752848b8605Smrg_mesa_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
753848b8605Smrg                              GLboolean transpose, const GLfloat * value)
754848b8605Smrg{
755848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
756848b8605Smrg   struct gl_shader_program *shProg =
757848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
758848b8605Smrg            "glProgramUniformMatrix2fv");
759b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 2, GLSL_TYPE_FLOAT);
760848b8605Smrg}
761848b8605Smrg
762848b8605Smrgvoid GLAPIENTRY
763848b8605Smrg_mesa_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
764848b8605Smrg                              GLboolean transpose, const GLfloat * value)
765848b8605Smrg{
766848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
767848b8605Smrg   struct gl_shader_program *shProg =
768848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
769848b8605Smrg            "glProgramUniformMatrix3fv");
770b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 3, GLSL_TYPE_FLOAT);
771848b8605Smrg}
772848b8605Smrg
773848b8605Smrgvoid GLAPIENTRY
774848b8605Smrg_mesa_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
775848b8605Smrg                              GLboolean transpose, const GLfloat * value)
776848b8605Smrg{
777848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
778848b8605Smrg   struct gl_shader_program *shProg =
779848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
780848b8605Smrg            "glProgramUniformMatrix4fv");
781b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 4, GLSL_TYPE_FLOAT);
782848b8605Smrg}
783848b8605Smrg
784848b8605Smrg
785848b8605Smrg/**
786848b8605Smrg * Non-square UniformMatrix are OpenGL 2.1
787848b8605Smrg */
788848b8605Smrgvoid GLAPIENTRY
789848b8605Smrg_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
790848b8605Smrg                         const GLfloat *value)
791848b8605Smrg{
792848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
793b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
794b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 3, GLSL_TYPE_FLOAT);
795848b8605Smrg}
796848b8605Smrg
797848b8605Smrgvoid GLAPIENTRY
798848b8605Smrg_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
799848b8605Smrg                         const GLfloat *value)
800848b8605Smrg{
801848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
802b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
803b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 2, GLSL_TYPE_FLOAT);
804848b8605Smrg}
805848b8605Smrg
806848b8605Smrgvoid GLAPIENTRY
807848b8605Smrg_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
808848b8605Smrg                         const GLfloat *value)
809848b8605Smrg{
810848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
811b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
812b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 4, GLSL_TYPE_FLOAT);
813848b8605Smrg}
814848b8605Smrg
815848b8605Smrgvoid GLAPIENTRY
816848b8605Smrg_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
817848b8605Smrg                         const GLfloat *value)
818848b8605Smrg{
819848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
820b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
821b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 2, GLSL_TYPE_FLOAT);
822848b8605Smrg}
823848b8605Smrg
824848b8605Smrgvoid GLAPIENTRY
825848b8605Smrg_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
826848b8605Smrg                         const GLfloat *value)
827848b8605Smrg{
828848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
829b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
830b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 4, GLSL_TYPE_FLOAT);
831848b8605Smrg}
832848b8605Smrg
833848b8605Smrgvoid GLAPIENTRY
834848b8605Smrg_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
835848b8605Smrg                         const GLfloat *value)
836848b8605Smrg{
837848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
838b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
839b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 3, GLSL_TYPE_FLOAT);
840848b8605Smrg}
841848b8605Smrg
842848b8605Smrg/** Same as above with direct state access **/
843848b8605Smrg
844848b8605Smrgvoid GLAPIENTRY
845848b8605Smrg_mesa_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
846848b8605Smrg                                GLboolean transpose, const GLfloat * value)
847848b8605Smrg{
848848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
849848b8605Smrg   struct gl_shader_program *shProg =
850848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
851848b8605Smrg            "glProgramUniformMatrix2x3fv");
852b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 3, GLSL_TYPE_FLOAT);
853848b8605Smrg}
854848b8605Smrg
855848b8605Smrgvoid GLAPIENTRY
856848b8605Smrg_mesa_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
857848b8605Smrg                                GLboolean transpose, const GLfloat * value)
858848b8605Smrg{
859848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
860848b8605Smrg   struct gl_shader_program *shProg =
861848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
862848b8605Smrg            "glProgramUniformMatrix3x2fv");
863b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 2, GLSL_TYPE_FLOAT);
864848b8605Smrg}
865848b8605Smrg
866848b8605Smrgvoid GLAPIENTRY
867848b8605Smrg_mesa_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
868848b8605Smrg                                GLboolean transpose, const GLfloat * value)
869848b8605Smrg{
870848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
871848b8605Smrg   struct gl_shader_program *shProg =
872848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
873848b8605Smrg            "glProgramUniformMatrix2x4fv");
874b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 4, GLSL_TYPE_FLOAT);
875848b8605Smrg}
876848b8605Smrg
877848b8605Smrgvoid GLAPIENTRY
878848b8605Smrg_mesa_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
879848b8605Smrg                                GLboolean transpose, const GLfloat * value)
880848b8605Smrg{
881848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
882848b8605Smrg   struct gl_shader_program *shProg =
883848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
884848b8605Smrg            "glProgramUniformMatrix4x2fv");
885b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 2, GLSL_TYPE_FLOAT);
886848b8605Smrg}
887848b8605Smrg
888848b8605Smrgvoid GLAPIENTRY
889848b8605Smrg_mesa_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
890848b8605Smrg                                GLboolean transpose, const GLfloat * value)
891848b8605Smrg{
892848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
893848b8605Smrg   struct gl_shader_program *shProg =
894848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
895848b8605Smrg            "glProgramUniformMatrix3x4fv");
896b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 4, GLSL_TYPE_FLOAT);
897848b8605Smrg}
898848b8605Smrg
899848b8605Smrgvoid GLAPIENTRY
900848b8605Smrg_mesa_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
901848b8605Smrg                                GLboolean transpose, const GLfloat * value)
902848b8605Smrg{
903848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
904848b8605Smrg   struct gl_shader_program *shProg =
905848b8605Smrg      _mesa_lookup_shader_program_err(ctx, program,
906848b8605Smrg            "glProgramUniformMatrix4x3fv");
907b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 3, GLSL_TYPE_FLOAT);
908848b8605Smrg}
909848b8605Smrg
910848b8605Smrg
911848b8605Smrgvoid GLAPIENTRY
912848b8605Smrg_mesa_GetnUniformfvARB(GLuint program, GLint location,
913848b8605Smrg                       GLsizei bufSize, GLfloat *params)
914848b8605Smrg{
915848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
916848b8605Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_FLOAT, params);
917848b8605Smrg}
918848b8605Smrg
919848b8605Smrgvoid GLAPIENTRY
920848b8605Smrg_mesa_GetUniformfv(GLuint program, GLint location, GLfloat *params)
921848b8605Smrg{
922848b8605Smrg   _mesa_GetnUniformfvARB(program, location, INT_MAX, params);
923848b8605Smrg}
924848b8605Smrg
925848b8605Smrg
926848b8605Smrgvoid GLAPIENTRY
927848b8605Smrg_mesa_GetnUniformivARB(GLuint program, GLint location,
928848b8605Smrg                       GLsizei bufSize, GLint *params)
929848b8605Smrg{
930848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
931848b8605Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT, params);
932848b8605Smrg}
933848b8605Smrg
934848b8605Smrgvoid GLAPIENTRY
935848b8605Smrg_mesa_GetUniformiv(GLuint program, GLint location, GLint *params)
936848b8605Smrg{
937848b8605Smrg   _mesa_GetnUniformivARB(program, location, INT_MAX, params);
938848b8605Smrg}
939848b8605Smrg
940848b8605Smrg
941848b8605Smrg/* GL3 */
942848b8605Smrgvoid GLAPIENTRY
943848b8605Smrg_mesa_GetnUniformuivARB(GLuint program, GLint location,
944848b8605Smrg                        GLsizei bufSize, GLuint *params)
945848b8605Smrg{
946848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
947848b8605Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT, params);
948848b8605Smrg}
949848b8605Smrg
950848b8605Smrgvoid GLAPIENTRY
951848b8605Smrg_mesa_GetUniformuiv(GLuint program, GLint location, GLuint *params)
952848b8605Smrg{
953848b8605Smrg   _mesa_GetnUniformuivARB(program, location, INT_MAX, params);
954848b8605Smrg}
955848b8605Smrg
956848b8605Smrg
957848b8605Smrg/* GL4 */
958848b8605Smrgvoid GLAPIENTRY
959848b8605Smrg_mesa_GetnUniformdvARB(GLuint program, GLint location,
960848b8605Smrg                       GLsizei bufSize, GLdouble *params)
961848b8605Smrg{
962848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
963848b8605Smrg
964848b8605Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_DOUBLE, params);
965848b8605Smrg}
966848b8605Smrg
967848b8605Smrgvoid GLAPIENTRY
968848b8605Smrg_mesa_GetUniformdv(GLuint program, GLint location, GLdouble *params)
969848b8605Smrg{
970848b8605Smrg   _mesa_GetnUniformdvARB(program, location, INT_MAX, params);
971848b8605Smrg}
972848b8605Smrg
973b8e80941Smrgvoid GLAPIENTRY
974b8e80941Smrg_mesa_GetnUniformi64vARB(GLuint program, GLint location,
975b8e80941Smrg                         GLsizei bufSize, GLint64 *params)
976b8e80941Smrg{
977b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
978b8e80941Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT64, params);
979b8e80941Smrg}
980b8e80941Smrgvoid GLAPIENTRY
981b8e80941Smrg_mesa_GetUniformi64vARB(GLuint program, GLint location, GLint64 *params)
982b8e80941Smrg{
983b8e80941Smrg   _mesa_GetnUniformi64vARB(program, location, INT_MAX, params);
984b8e80941Smrg}
985b8e80941Smrg
986b8e80941Smrgvoid GLAPIENTRY
987b8e80941Smrg_mesa_GetnUniformui64vARB(GLuint program, GLint location,
988b8e80941Smrg                         GLsizei bufSize, GLuint64 *params)
989b8e80941Smrg{
990b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
991b8e80941Smrg   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT64, params);
992b8e80941Smrg}
993b8e80941Smrg
994b8e80941Smrgvoid GLAPIENTRY
995b8e80941Smrg_mesa_GetUniformui64vARB(GLuint program, GLint location, GLuint64 *params)
996b8e80941Smrg{
997b8e80941Smrg   _mesa_GetnUniformui64vARB(program, location, INT_MAX, params);
998b8e80941Smrg}
999b8e80941Smrg
1000848b8605Smrg
1001848b8605SmrgGLint GLAPIENTRY
1002848b8605Smrg_mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name)
1003848b8605Smrg{
1004848b8605Smrg   struct gl_shader_program *shProg;
1005848b8605Smrg
1006848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1007848b8605Smrg
1008848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, programObj,
1009848b8605Smrg					    "glGetUniformLocation");
1010848b8605Smrg   if (!shProg)
1011848b8605Smrg      return -1;
1012848b8605Smrg
1013848b8605Smrg   /* Page 80 (page 94 of the PDF) of the OpenGL 2.1 spec says:
1014848b8605Smrg    *
1015848b8605Smrg    *     "If program has not been successfully linked, the error
1016848b8605Smrg    *     INVALID_OPERATION is generated."
1017848b8605Smrg    */
1018b8e80941Smrg   if (shProg->data->LinkStatus == LINKING_FAILURE) {
1019848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION,
1020848b8605Smrg		  "glGetUniformLocation(program not linked)");
1021848b8605Smrg      return -1;
1022848b8605Smrg   }
1023848b8605Smrg
1024b8e80941Smrg   return _mesa_program_resource_location(shProg, GL_UNIFORM, name);
1025b8e80941Smrg}
1026848b8605Smrg
1027b8e80941SmrgGLint GLAPIENTRY
1028b8e80941Smrg_mesa_GetUniformLocation_no_error(GLuint programObj, const GLcharARB *name)
1029b8e80941Smrg{
1030b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1031b8e80941Smrg
1032b8e80941Smrg   struct gl_shader_program *shProg =
1033b8e80941Smrg      _mesa_lookup_shader_program(ctx, programObj);
1034848b8605Smrg
1035b8e80941Smrg   return _mesa_program_resource_location(shProg, GL_UNIFORM, name);
1036848b8605Smrg}
1037848b8605Smrg
1038848b8605SmrgGLuint GLAPIENTRY
1039848b8605Smrg_mesa_GetUniformBlockIndex(GLuint program,
1040848b8605Smrg			   const GLchar *uniformBlockName)
1041848b8605Smrg{
1042848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1043848b8605Smrg   struct gl_shader_program *shProg;
1044848b8605Smrg
1045848b8605Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1046848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformBlockIndex");
1047848b8605Smrg      return GL_INVALID_INDEX;
1048848b8605Smrg   }
1049848b8605Smrg
1050848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1051848b8605Smrg					    "glGetUniformBlockIndex");
1052848b8605Smrg   if (!shProg)
1053848b8605Smrg      return GL_INVALID_INDEX;
1054848b8605Smrg
1055b8e80941Smrg   struct gl_program_resource *res =
1056b8e80941Smrg      _mesa_program_resource_find_name(shProg, GL_UNIFORM_BLOCK,
1057b8e80941Smrg                                       uniformBlockName, NULL);
1058b8e80941Smrg   if (!res)
1059b8e80941Smrg      return GL_INVALID_INDEX;
1060848b8605Smrg
1061b8e80941Smrg   return _mesa_program_resource_index(shProg, res);
1062848b8605Smrg}
1063848b8605Smrg
1064848b8605Smrgvoid GLAPIENTRY
1065848b8605Smrg_mesa_GetUniformIndices(GLuint program,
1066848b8605Smrg			GLsizei uniformCount,
1067848b8605Smrg			const GLchar * const *uniformNames,
1068848b8605Smrg			GLuint *uniformIndices)
1069848b8605Smrg{
1070848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1071848b8605Smrg   GLsizei i;
1072848b8605Smrg   struct gl_shader_program *shProg;
1073848b8605Smrg
1074848b8605Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1075848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformIndices");
1076848b8605Smrg      return;
1077848b8605Smrg   }
1078848b8605Smrg
1079848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1080848b8605Smrg					    "glGetUniformIndices");
1081848b8605Smrg   if (!shProg)
1082848b8605Smrg      return;
1083848b8605Smrg
1084848b8605Smrg   if (uniformCount < 0) {
1085848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1086848b8605Smrg		  "glGetUniformIndices(uniformCount < 0)");
1087848b8605Smrg      return;
1088848b8605Smrg   }
1089848b8605Smrg
1090848b8605Smrg   for (i = 0; i < uniformCount; i++) {
1091b8e80941Smrg      struct gl_program_resource *res =
1092b8e80941Smrg         _mesa_program_resource_find_name(shProg, GL_UNIFORM, uniformNames[i],
1093b8e80941Smrg                                          NULL);
1094b8e80941Smrg      uniformIndices[i] = _mesa_program_resource_index(shProg, res);
1095b8e80941Smrg   }
1096b8e80941Smrg}
1097b8e80941Smrg
1098b8e80941Smrgstatic void
1099b8e80941Smrguniform_block_binding(struct gl_context *ctx, struct gl_shader_program *shProg,
1100b8e80941Smrg                      GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1101b8e80941Smrg{
1102b8e80941Smrg   if (shProg->data->UniformBlocks[uniformBlockIndex].Binding !=
1103b8e80941Smrg       uniformBlockBinding) {
1104b8e80941Smrg
1105b8e80941Smrg      FLUSH_VERTICES(ctx, 0);
1106b8e80941Smrg      ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
1107b8e80941Smrg
1108b8e80941Smrg      shProg->data->UniformBlocks[uniformBlockIndex].Binding =
1109b8e80941Smrg         uniformBlockBinding;
1110848b8605Smrg   }
1111848b8605Smrg}
1112848b8605Smrg
1113b8e80941Smrgvoid GLAPIENTRY
1114b8e80941Smrg_mesa_UniformBlockBinding_no_error(GLuint program, GLuint uniformBlockIndex,
1115b8e80941Smrg                                   GLuint uniformBlockBinding)
1116b8e80941Smrg{
1117b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1118b8e80941Smrg
1119b8e80941Smrg   struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program);
1120b8e80941Smrg   uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding);
1121b8e80941Smrg}
1122b8e80941Smrg
1123848b8605Smrgvoid GLAPIENTRY
1124848b8605Smrg_mesa_UniformBlockBinding(GLuint program,
1125848b8605Smrg			  GLuint uniformBlockIndex,
1126848b8605Smrg			  GLuint uniformBlockBinding)
1127848b8605Smrg{
1128848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1129848b8605Smrg   struct gl_shader_program *shProg;
1130848b8605Smrg
1131848b8605Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1132848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformBlockBinding");
1133848b8605Smrg      return;
1134848b8605Smrg   }
1135848b8605Smrg
1136848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1137848b8605Smrg					    "glUniformBlockBinding");
1138848b8605Smrg   if (!shProg)
1139848b8605Smrg      return;
1140848b8605Smrg
1141b8e80941Smrg   if (uniformBlockIndex >= shProg->data->NumUniformBlocks) {
1142848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1143848b8605Smrg		  "glUniformBlockBinding(block index %u >= %u)",
1144b8e80941Smrg                  uniformBlockIndex, shProg->data->NumUniformBlocks);
1145848b8605Smrg      return;
1146848b8605Smrg   }
1147848b8605Smrg
1148848b8605Smrg   if (uniformBlockBinding >= ctx->Const.MaxUniformBufferBindings) {
1149848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1150848b8605Smrg		  "glUniformBlockBinding(block binding %u >= %u)",
1151848b8605Smrg		  uniformBlockBinding, ctx->Const.MaxUniformBufferBindings);
1152848b8605Smrg      return;
1153848b8605Smrg   }
1154848b8605Smrg
1155b8e80941Smrg   uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding);
1156b8e80941Smrg}
1157b8e80941Smrg
1158b8e80941Smrgstatic void
1159b8e80941Smrgshader_storage_block_binding(struct gl_context *ctx,
1160b8e80941Smrg                             struct gl_shader_program *shProg,
1161b8e80941Smrg                             GLuint shaderStorageBlockIndex,
1162b8e80941Smrg                             GLuint shaderStorageBlockBinding)
1163b8e80941Smrg{
1164b8e80941Smrg   if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding !=
1165b8e80941Smrg       shaderStorageBlockBinding) {
1166848b8605Smrg
1167848b8605Smrg      FLUSH_VERTICES(ctx, 0);
1168b8e80941Smrg      ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
1169848b8605Smrg
1170b8e80941Smrg      shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
1171b8e80941Smrg         shaderStorageBlockBinding;
1172b8e80941Smrg   }
1173b8e80941Smrg}
1174848b8605Smrg
1175b8e80941Smrgvoid GLAPIENTRY
1176b8e80941Smrg_mesa_ShaderStorageBlockBinding_no_error(GLuint program,
1177b8e80941Smrg                                         GLuint shaderStorageBlockIndex,
1178b8e80941Smrg                                         GLuint shaderStorageBlockBinding)
1179b8e80941Smrg{
1180b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1181848b8605Smrg
1182b8e80941Smrg   struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program);
1183b8e80941Smrg   shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex,
1184b8e80941Smrg                                shaderStorageBlockBinding);
1185848b8605Smrg}
1186848b8605Smrg
1187848b8605Smrgvoid GLAPIENTRY
1188b8e80941Smrg_mesa_ShaderStorageBlockBinding(GLuint program,
1189b8e80941Smrg			        GLuint shaderStorageBlockIndex,
1190b8e80941Smrg			        GLuint shaderStorageBlockBinding)
1191848b8605Smrg{
1192848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1193848b8605Smrg   struct gl_shader_program *shProg;
1194848b8605Smrg
1195b8e80941Smrg   if (!ctx->Extensions.ARB_shader_storage_buffer_object) {
1196b8e80941Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderStorageBlockBinding");
1197848b8605Smrg      return;
1198848b8605Smrg   }
1199848b8605Smrg
1200848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1201b8e80941Smrg					    "glShaderStorageBlockBinding");
1202848b8605Smrg   if (!shProg)
1203848b8605Smrg      return;
1204848b8605Smrg
1205b8e80941Smrg   if (shaderStorageBlockIndex >= shProg->data->NumShaderStorageBlocks) {
1206b8e80941Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1207b8e80941Smrg		  "glShaderStorageBlockBinding(block index %u >= %u)",
1208b8e80941Smrg                  shaderStorageBlockIndex,
1209b8e80941Smrg                  shProg->data->NumShaderStorageBlocks);
1210b8e80941Smrg      return;
1211b8e80941Smrg   }
1212b8e80941Smrg
1213b8e80941Smrg   if (shaderStorageBlockBinding >= ctx->Const.MaxShaderStorageBufferBindings) {
1214848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1215b8e80941Smrg		  "glShaderStorageBlockBinding(block binding %u >= %u)",
1216b8e80941Smrg		  shaderStorageBlockBinding,
1217b8e80941Smrg                  ctx->Const.MaxShaderStorageBufferBindings);
1218848b8605Smrg      return;
1219848b8605Smrg   }
1220848b8605Smrg
1221b8e80941Smrg   shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex,
1222b8e80941Smrg                                shaderStorageBlockBinding);
1223b8e80941Smrg}
1224b8e80941Smrg
1225b8e80941Smrg/**
1226b8e80941Smrg * Generic program resource property query.
1227b8e80941Smrg */
1228b8e80941Smrgstatic void
1229b8e80941Smrgmesa_bufferiv(struct gl_shader_program *shProg, GLenum type,
1230b8e80941Smrg              GLuint index, GLenum pname, GLint *params, const char *caller)
1231b8e80941Smrg{
1232b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1233b8e80941Smrg   struct gl_program_resource *res =
1234b8e80941Smrg      _mesa_program_resource_find_index(shProg, type, index);
1235b8e80941Smrg
1236b8e80941Smrg   if (!res) {
1237b8e80941Smrg      _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufferindex %d)", caller, index);
1238b8e80941Smrg      return;
1239b8e80941Smrg   }
1240848b8605Smrg
1241848b8605Smrg   switch (pname) {
1242848b8605Smrg   case GL_UNIFORM_BLOCK_BINDING:
1243b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1244b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_BINDING,
1245b8e80941Smrg                                  params, caller);
1246848b8605Smrg      return;
1247848b8605Smrg   case GL_UNIFORM_BLOCK_DATA_SIZE:
1248b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE:
1249b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_DATA_SIZE,
1250b8e80941Smrg                                  params, caller);
1251848b8605Smrg      return;
1252848b8605Smrg   case GL_UNIFORM_BLOCK_NAME_LENGTH:
1253b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index, GL_NAME_LENGTH,
1254b8e80941Smrg                                  params, caller);
1255848b8605Smrg      return;
1256b8e80941Smrg   case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
1257b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS:
1258b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index, GL_NUM_ACTIVE_VARIABLES,
1259b8e80941Smrg                                  params, caller);
1260b8e80941Smrg      return;
1261b8e80941Smrg   case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
1262b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES:
1263b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index, GL_ACTIVE_VARIABLES,
1264b8e80941Smrg                                  params, caller);
1265b8e80941Smrg      return;
1266b8e80941Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1267b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER:
1268b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1269b8e80941Smrg                                  GL_REFERENCED_BY_VERTEX_SHADER, params,
1270b8e80941Smrg                                  caller);
1271848b8605Smrg      return;
1272848b8605Smrg
1273b8e80941Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER:
1274b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER:
1275b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1276b8e80941Smrg                                  GL_REFERENCED_BY_TESS_CONTROL_SHADER, params,
1277b8e80941Smrg                                  caller);
1278848b8605Smrg      return;
1279848b8605Smrg
1280b8e80941Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER:
1281b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER:
1282b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1283b8e80941Smrg                                  GL_REFERENCED_BY_TESS_EVALUATION_SHADER, params,
1284b8e80941Smrg                                  caller);
1285848b8605Smrg      return;
1286848b8605Smrg
1287848b8605Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER:
1288b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER:
1289b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1290b8e80941Smrg                                  GL_REFERENCED_BY_GEOMETRY_SHADER, params,
1291b8e80941Smrg                                  caller);
1292848b8605Smrg      return;
1293848b8605Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1294b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER:
1295b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1296b8e80941Smrg                                  GL_REFERENCED_BY_FRAGMENT_SHADER, params,
1297b8e80941Smrg                                  caller);
1298b8e80941Smrg      return;
1299b8e80941Smrg   case GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER:
1300b8e80941Smrg   case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER:
1301b8e80941Smrg      _mesa_program_resource_prop(shProg, res, index,
1302b8e80941Smrg                                  GL_REFERENCED_BY_COMPUTE_SHADER, params,
1303b8e80941Smrg                                  caller);
1304848b8605Smrg      return;
1305848b8605Smrg   default:
1306848b8605Smrg      _mesa_error(ctx, GL_INVALID_ENUM,
1307b8e80941Smrg                  "%s(pname 0x%x (%s))", caller, pname,
1308b8e80941Smrg                  _mesa_enum_to_string(pname));
1309b8e80941Smrg      return;
1310b8e80941Smrg   }
1311b8e80941Smrg}
1312b8e80941Smrg
1313b8e80941Smrg
1314b8e80941Smrgvoid GLAPIENTRY
1315b8e80941Smrg_mesa_GetActiveUniformBlockiv(GLuint program,
1316b8e80941Smrg			      GLuint uniformBlockIndex,
1317b8e80941Smrg			      GLenum pname,
1318b8e80941Smrg			      GLint *params)
1319b8e80941Smrg{
1320b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1321b8e80941Smrg   struct gl_shader_program *shProg;
1322b8e80941Smrg
1323b8e80941Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1324b8e80941Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1325848b8605Smrg      return;
1326848b8605Smrg   }
1327b8e80941Smrg
1328b8e80941Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1329b8e80941Smrg					    "glGetActiveUniformBlockiv");
1330b8e80941Smrg   if (!shProg)
1331b8e80941Smrg      return;
1332b8e80941Smrg
1333b8e80941Smrg   mesa_bufferiv(shProg, GL_UNIFORM_BLOCK, uniformBlockIndex, pname, params,
1334b8e80941Smrg                 "glGetActiveUniformBlockiv");
1335848b8605Smrg}
1336848b8605Smrg
1337848b8605Smrgvoid GLAPIENTRY
1338848b8605Smrg_mesa_GetActiveUniformBlockName(GLuint program,
1339848b8605Smrg				GLuint uniformBlockIndex,
1340848b8605Smrg				GLsizei bufSize,
1341848b8605Smrg				GLsizei *length,
1342848b8605Smrg				GLchar *uniformBlockName)
1343848b8605Smrg{
1344848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1345848b8605Smrg   struct gl_shader_program *shProg;
1346848b8605Smrg
1347848b8605Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1348848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1349848b8605Smrg      return;
1350848b8605Smrg   }
1351848b8605Smrg
1352848b8605Smrg   if (bufSize < 0) {
1353848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1354848b8605Smrg		  "glGetActiveUniformBlockName(bufSize %d < 0)",
1355848b8605Smrg		  bufSize);
1356848b8605Smrg      return;
1357848b8605Smrg   }
1358848b8605Smrg
1359848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1360848b8605Smrg					    "glGetActiveUniformBlockiv");
1361848b8605Smrg   if (!shProg)
1362848b8605Smrg      return;
1363848b8605Smrg
1364b8e80941Smrg   if (uniformBlockName)
1365b8e80941Smrg      _mesa_get_program_resource_name(shProg, GL_UNIFORM_BLOCK,
1366b8e80941Smrg                                      uniformBlockIndex, bufSize, length,
1367b8e80941Smrg                                      uniformBlockName,
1368b8e80941Smrg                                      "glGetActiveUniformBlockName");
1369848b8605Smrg}
1370848b8605Smrg
1371848b8605Smrgvoid GLAPIENTRY
1372848b8605Smrg_mesa_GetActiveUniformName(GLuint program, GLuint uniformIndex,
1373848b8605Smrg			   GLsizei bufSize, GLsizei *length,
1374848b8605Smrg			   GLchar *uniformName)
1375848b8605Smrg{
1376848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1377848b8605Smrg   struct gl_shader_program *shProg;
1378848b8605Smrg
1379848b8605Smrg   if (!ctx->Extensions.ARB_uniform_buffer_object) {
1380b8e80941Smrg      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformName");
1381848b8605Smrg      return;
1382848b8605Smrg   }
1383848b8605Smrg
1384848b8605Smrg   if (bufSize < 0) {
1385848b8605Smrg      _mesa_error(ctx, GL_INVALID_VALUE,
1386848b8605Smrg		  "glGetActiveUniformName(bufSize %d < 0)",
1387848b8605Smrg		  bufSize);
1388848b8605Smrg      return;
1389848b8605Smrg   }
1390848b8605Smrg
1391848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniformName");
1392848b8605Smrg
1393848b8605Smrg   if (!shProg)
1394848b8605Smrg      return;
1395848b8605Smrg
1396b8e80941Smrg   _mesa_get_program_resource_name(shProg, GL_UNIFORM, uniformIndex, bufSize,
1397b8e80941Smrg                                   length, uniformName, "glGetActiveUniformName");
1398848b8605Smrg}
1399848b8605Smrg
1400848b8605Smrgvoid GLAPIENTRY
1401848b8605Smrg_mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
1402848b8605Smrg                                     GLenum pname, GLint *params)
1403848b8605Smrg{
1404848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1405848b8605Smrg   struct gl_shader_program *shProg;
1406848b8605Smrg
1407848b8605Smrg   if (!ctx->Extensions.ARB_shader_atomic_counters) {
1408848b8605Smrg      _mesa_error(ctx, GL_INVALID_OPERATION,
1409848b8605Smrg                  "glGetActiveAtomicCounterBufferiv");
1410848b8605Smrg      return;
1411848b8605Smrg   }
1412848b8605Smrg
1413848b8605Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program,
1414848b8605Smrg                                            "glGetActiveAtomicCounterBufferiv");
1415848b8605Smrg   if (!shProg)
1416848b8605Smrg      return;
1417848b8605Smrg
1418b8e80941Smrg   mesa_bufferiv(shProg, GL_ATOMIC_COUNTER_BUFFER, bufferIndex, pname, params,
1419b8e80941Smrg                 "glGetActiveAtomicCounterBufferiv");
1420b8e80941Smrg}
1421848b8605Smrg
1422b8e80941Smrgvoid GLAPIENTRY
1423b8e80941Smrg_mesa_Uniform1d(GLint location, GLdouble v0)
1424b8e80941Smrg{
1425b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1426b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 1);
1427b8e80941Smrg}
1428848b8605Smrg
1429b8e80941Smrgvoid GLAPIENTRY
1430b8e80941Smrg_mesa_Uniform2d(GLint location, GLdouble v0, GLdouble v1)
1431b8e80941Smrg{
1432b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1433b8e80941Smrg   GLdouble v[2];
1434b8e80941Smrg   v[0] = v0;
1435b8e80941Smrg   v[1] = v1;
1436b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 2);
1437b8e80941Smrg}
1438b8e80941Smrg
1439b8e80941Smrgvoid GLAPIENTRY
1440b8e80941Smrg_mesa_Uniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
1441b8e80941Smrg{
1442b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1443b8e80941Smrg   GLdouble v[3];
1444b8e80941Smrg   v[0] = v0;
1445b8e80941Smrg   v[1] = v1;
1446b8e80941Smrg   v[2] = v2;
1447b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 3);
1448b8e80941Smrg}
1449b8e80941Smrg
1450b8e80941Smrgvoid GLAPIENTRY
1451b8e80941Smrg_mesa_Uniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2,
1452b8e80941Smrg                GLdouble v3)
1453b8e80941Smrg{
1454b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1455b8e80941Smrg   GLdouble v[4];
1456b8e80941Smrg   v[0] = v0;
1457b8e80941Smrg   v[1] = v1;
1458b8e80941Smrg   v[2] = v2;
1459b8e80941Smrg   v[3] = v3;
1460b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 4);
1461b8e80941Smrg}
1462b8e80941Smrg
1463b8e80941Smrgvoid GLAPIENTRY
1464b8e80941Smrg_mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
1465b8e80941Smrg{
1466b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1467b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 1);
1468b8e80941Smrg}
1469b8e80941Smrg
1470b8e80941Smrgvoid GLAPIENTRY
1471b8e80941Smrg_mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
1472b8e80941Smrg{
1473b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1474b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 2);
1475b8e80941Smrg}
1476b8e80941Smrg
1477b8e80941Smrgvoid GLAPIENTRY
1478b8e80941Smrg_mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
1479b8e80941Smrg{
1480b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1481b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 3);
1482b8e80941Smrg}
1483b8e80941Smrg
1484b8e80941Smrgvoid GLAPIENTRY
1485b8e80941Smrg_mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
1486b8e80941Smrg{
1487b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1488b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 4);
1489b8e80941Smrg}
1490b8e80941Smrg
1491b8e80941Smrgvoid GLAPIENTRY
1492b8e80941Smrg_mesa_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
1493b8e80941Smrg                       const GLdouble * value)
1494b8e80941Smrg{
1495b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1496b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1497b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 2, GLSL_TYPE_DOUBLE);
1498b8e80941Smrg}
1499b8e80941Smrg
1500b8e80941Smrgvoid GLAPIENTRY
1501b8e80941Smrg_mesa_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
1502b8e80941Smrg                       const GLdouble * value)
1503b8e80941Smrg{
1504b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1505b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1506b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 3, GLSL_TYPE_DOUBLE);
1507b8e80941Smrg}
1508b8e80941Smrg
1509b8e80941Smrgvoid GLAPIENTRY
1510b8e80941Smrg_mesa_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
1511b8e80941Smrg                       const GLdouble * value)
1512b8e80941Smrg{
1513b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1514b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1515b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 4, GLSL_TYPE_DOUBLE);
1516b8e80941Smrg}
1517b8e80941Smrg
1518b8e80941Smrgvoid GLAPIENTRY
1519b8e80941Smrg_mesa_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
1520b8e80941Smrg                         const GLdouble *value)
1521b8e80941Smrg{
1522b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1523b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1524b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 3, GLSL_TYPE_DOUBLE);
1525b8e80941Smrg}
1526b8e80941Smrg
1527b8e80941Smrgvoid GLAPIENTRY
1528b8e80941Smrg_mesa_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
1529b8e80941Smrg                         const GLdouble *value)
1530b8e80941Smrg{
1531b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1532b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1533b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 2, GLSL_TYPE_DOUBLE);
1534b8e80941Smrg}
1535b8e80941Smrg
1536b8e80941Smrgvoid GLAPIENTRY
1537b8e80941Smrg_mesa_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
1538b8e80941Smrg                         const GLdouble *value)
1539b8e80941Smrg{
1540b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1541b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1542b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 2, 4, GLSL_TYPE_DOUBLE);
1543b8e80941Smrg}
1544b8e80941Smrg
1545b8e80941Smrgvoid GLAPIENTRY
1546b8e80941Smrg_mesa_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
1547b8e80941Smrg                         const GLdouble *value)
1548b8e80941Smrg{
1549b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1550b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1551b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 2, GLSL_TYPE_DOUBLE);
1552b8e80941Smrg}
1553b8e80941Smrg
1554b8e80941Smrgvoid GLAPIENTRY
1555b8e80941Smrg_mesa_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
1556b8e80941Smrg                         const GLdouble *value)
1557b8e80941Smrg{
1558b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1559b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1560b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 3, 4, GLSL_TYPE_DOUBLE);
1561b8e80941Smrg}
1562b8e80941Smrg
1563b8e80941Smrgvoid GLAPIENTRY
1564b8e80941Smrg_mesa_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
1565b8e80941Smrg                         const GLdouble *value)
1566b8e80941Smrg{
1567b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1568b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1569b8e80941Smrg                        ctx, ctx->_Shader->ActiveProgram, 4, 3, GLSL_TYPE_DOUBLE);
1570b8e80941Smrg}
1571b8e80941Smrg
1572b8e80941Smrgvoid GLAPIENTRY
1573b8e80941Smrg_mesa_ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
1574b8e80941Smrg{
1575b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1576b8e80941Smrg   struct gl_shader_program *shProg =
1577b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1578b8e80941Smrg            "glProgramUniform1d");
1579b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_DOUBLE, 1);
1580b8e80941Smrg}
1581b8e80941Smrg
1582b8e80941Smrgvoid GLAPIENTRY
1583b8e80941Smrg_mesa_ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
1584b8e80941Smrg{
1585b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1586b8e80941Smrg   GLdouble v[2];
1587b8e80941Smrg   struct gl_shader_program *shProg;
1588b8e80941Smrg   v[0] = v0;
1589b8e80941Smrg   v[1] = v1;
1590b8e80941Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2d");
1591b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 2);
1592b8e80941Smrg}
1593b8e80941Smrg
1594b8e80941Smrgvoid GLAPIENTRY
1595b8e80941Smrg_mesa_ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1596b8e80941Smrg                       GLdouble v2)
1597b8e80941Smrg{
1598b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1599b8e80941Smrg   GLdouble v[3];
1600b8e80941Smrg   struct gl_shader_program *shProg;
1601b8e80941Smrg   v[0] = v0;
1602b8e80941Smrg   v[1] = v1;
1603b8e80941Smrg   v[2] = v2;
1604b8e80941Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3d");
1605b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 3);
1606b8e80941Smrg}
1607b8e80941Smrg
1608b8e80941Smrgvoid GLAPIENTRY
1609b8e80941Smrg_mesa_ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1610b8e80941Smrg                       GLdouble v2, GLdouble v3)
1611b8e80941Smrg{
1612b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1613b8e80941Smrg   GLdouble v[4];
1614b8e80941Smrg   struct gl_shader_program *shProg;
1615b8e80941Smrg   v[0] = v0;
1616b8e80941Smrg   v[1] = v1;
1617b8e80941Smrg   v[2] = v2;
1618b8e80941Smrg   v[3] = v3;
1619b8e80941Smrg   shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4d");
1620b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 4);
1621b8e80941Smrg}
1622b8e80941Smrg
1623b8e80941Smrgvoid GLAPIENTRY
1624b8e80941Smrg_mesa_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
1625b8e80941Smrg                        const GLdouble * value)
1626b8e80941Smrg{
1627b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1628b8e80941Smrg   struct gl_shader_program *shProg =
1629b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1630b8e80941Smrg            "glProgramUniform1dv");
1631b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 1);
1632b8e80941Smrg}
1633b8e80941Smrg
1634b8e80941Smrgvoid GLAPIENTRY
1635b8e80941Smrg_mesa_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
1636b8e80941Smrg                        const GLdouble * value)
1637b8e80941Smrg{
1638b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1639b8e80941Smrg   struct gl_shader_program *shProg =
1640b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1641b8e80941Smrg            "glProgramUniform2dv");
1642b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 2);
1643b8e80941Smrg}
1644b8e80941Smrg
1645b8e80941Smrgvoid GLAPIENTRY
1646b8e80941Smrg_mesa_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
1647b8e80941Smrg                        const GLdouble * value)
1648b8e80941Smrg{
1649b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1650b8e80941Smrg   struct gl_shader_program *shProg =
1651b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1652b8e80941Smrg            "glProgramUniform3dv");
1653b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 3);
1654b8e80941Smrg}
1655b8e80941Smrg
1656b8e80941Smrgvoid GLAPIENTRY
1657b8e80941Smrg_mesa_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
1658b8e80941Smrg                        const GLdouble * value)
1659b8e80941Smrg{
1660b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1661b8e80941Smrg   struct gl_shader_program *shProg =
1662b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1663b8e80941Smrg            "glProgramUniform4dv");
1664b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 4);
1665b8e80941Smrg}
1666b8e80941Smrg
1667b8e80941Smrgvoid GLAPIENTRY
1668b8e80941Smrg_mesa_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
1669b8e80941Smrg                              GLboolean transpose, const GLdouble * value)
1670b8e80941Smrg{
1671b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1672b8e80941Smrg   struct gl_shader_program *shProg =
1673b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1674b8e80941Smrg            "glProgramUniformMatrix2dv");
1675b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1676b8e80941Smrg                        ctx, shProg, 2, 2, GLSL_TYPE_DOUBLE);
1677b8e80941Smrg}
1678b8e80941Smrg
1679b8e80941Smrgvoid GLAPIENTRY
1680b8e80941Smrg_mesa_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
1681b8e80941Smrg                              GLboolean transpose, const GLdouble * value)
1682b8e80941Smrg{
1683b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1684b8e80941Smrg   struct gl_shader_program *shProg =
1685b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1686b8e80941Smrg            "glProgramUniformMatrix3dv");
1687b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1688b8e80941Smrg                        ctx, shProg, 3, 3, GLSL_TYPE_DOUBLE);
1689b8e80941Smrg}
1690b8e80941Smrg
1691b8e80941Smrgvoid GLAPIENTRY
1692b8e80941Smrg_mesa_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
1693b8e80941Smrg                              GLboolean transpose, const GLdouble * value)
1694b8e80941Smrg{
1695b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1696b8e80941Smrg   struct gl_shader_program *shProg =
1697b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1698b8e80941Smrg            "glProgramUniformMatrix4dv");
1699b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1700b8e80941Smrg                        ctx, shProg, 4, 4, GLSL_TYPE_DOUBLE);
1701b8e80941Smrg}
1702b8e80941Smrg
1703b8e80941Smrgvoid GLAPIENTRY
1704b8e80941Smrg_mesa_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
1705b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1706b8e80941Smrg{
1707b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1708b8e80941Smrg   struct gl_shader_program *shProg =
1709b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1710b8e80941Smrg            "glProgramUniformMatrix2x3dv");
1711b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1712b8e80941Smrg                        ctx, shProg, 2, 3, GLSL_TYPE_DOUBLE);
1713b8e80941Smrg}
1714b8e80941Smrg
1715b8e80941Smrgvoid GLAPIENTRY
1716b8e80941Smrg_mesa_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
1717b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1718b8e80941Smrg{
1719b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1720b8e80941Smrg   struct gl_shader_program *shProg =
1721b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1722b8e80941Smrg            "glProgramUniformMatrix3x2dv");
1723b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1724b8e80941Smrg                        ctx, shProg, 3, 2, GLSL_TYPE_DOUBLE);
1725b8e80941Smrg}
1726b8e80941Smrg
1727b8e80941Smrgvoid GLAPIENTRY
1728b8e80941Smrg_mesa_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
1729b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1730b8e80941Smrg{
1731b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1732b8e80941Smrg   struct gl_shader_program *shProg =
1733b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1734b8e80941Smrg            "glProgramUniformMatrix2x4dv");
1735b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1736b8e80941Smrg                        ctx, shProg, 2, 4, GLSL_TYPE_DOUBLE);
1737b8e80941Smrg}
1738b8e80941Smrg
1739b8e80941Smrgvoid GLAPIENTRY
1740b8e80941Smrg_mesa_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
1741b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1742b8e80941Smrg{
1743b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1744b8e80941Smrg   struct gl_shader_program *shProg =
1745b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1746b8e80941Smrg            "glProgramUniformMatrix4x2dv");
1747b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1748b8e80941Smrg                        ctx, shProg, 4, 2, GLSL_TYPE_DOUBLE);
1749b8e80941Smrg}
1750b8e80941Smrg
1751b8e80941Smrgvoid GLAPIENTRY
1752b8e80941Smrg_mesa_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
1753b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1754b8e80941Smrg{
1755b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1756b8e80941Smrg   struct gl_shader_program *shProg =
1757b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1758b8e80941Smrg            "glProgramUniformMatrix3x4dv");
1759b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1760b8e80941Smrg                        ctx, shProg, 3, 4, GLSL_TYPE_DOUBLE);
1761b8e80941Smrg}
1762b8e80941Smrg
1763b8e80941Smrgvoid GLAPIENTRY
1764b8e80941Smrg_mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
1765b8e80941Smrg                                GLboolean transpose, const GLdouble * value)
1766b8e80941Smrg{
1767b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1768b8e80941Smrg   struct gl_shader_program *shProg =
1769b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1770b8e80941Smrg            "glProgramUniformMatrix4x3dv");
1771b8e80941Smrg   _mesa_uniform_matrix(location, count, transpose, value,
1772b8e80941Smrg                        ctx, shProg, 4, 3, GLSL_TYPE_DOUBLE);
1773b8e80941Smrg}
1774b8e80941Smrg
1775b8e80941Smrgvoid GLAPIENTRY
1776b8e80941Smrg_mesa_Uniform1i64ARB(GLint location, GLint64 v0)
1777b8e80941Smrg{
1778b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1779b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 1);
1780b8e80941Smrg}
1781b8e80941Smrg
1782b8e80941Smrgvoid GLAPIENTRY
1783b8e80941Smrg_mesa_Uniform2i64ARB(GLint location, GLint64 v0, GLint64 v1)
1784b8e80941Smrg{
1785b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1786b8e80941Smrg   int64_t v[2];
1787b8e80941Smrg   v[0] = v0;
1788b8e80941Smrg   v[1] = v1;
1789b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 2);
1790b8e80941Smrg}
1791b8e80941Smrg
1792b8e80941Smrgvoid GLAPIENTRY
1793b8e80941Smrg_mesa_Uniform3i64ARB(GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
1794b8e80941Smrg{
1795b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1796b8e80941Smrg   int64_t v[3];
1797b8e80941Smrg   v[0] = v0;
1798b8e80941Smrg   v[1] = v1;
1799b8e80941Smrg   v[2] = v2;
1800b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 3);
1801b8e80941Smrg}
1802b8e80941Smrg
1803b8e80941Smrgvoid GLAPIENTRY
1804b8e80941Smrg_mesa_Uniform4i64ARB(GLint location,  GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
1805b8e80941Smrg{
1806b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1807b8e80941Smrg   int64_t v[4];
1808b8e80941Smrg   v[0] = v0;
1809b8e80941Smrg   v[1] = v1;
1810b8e80941Smrg   v[2] = v2;
1811b8e80941Smrg   v[3] = v3;
1812b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 4);
1813b8e80941Smrg}
1814b8e80941Smrg
1815b8e80941Smrgvoid GLAPIENTRY
1816b8e80941Smrg_mesa_Uniform1i64vARB(GLint location, GLsizei count, const GLint64 *value)
1817b8e80941Smrg{
1818b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1819b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 1);
1820b8e80941Smrg}
1821b8e80941Smrg
1822b8e80941Smrgvoid GLAPIENTRY
1823b8e80941Smrg_mesa_Uniform2i64vARB(GLint location,  GLsizei count, const GLint64 *value)
1824b8e80941Smrg{
1825b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1826b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 2);
1827b8e80941Smrg}
1828b8e80941Smrg
1829b8e80941Smrgvoid GLAPIENTRY
1830b8e80941Smrg_mesa_Uniform3i64vARB(GLint location,  GLsizei count, const GLint64 *value)
1831b8e80941Smrg{
1832b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1833b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 3);
1834b8e80941Smrg}
1835b8e80941Smrg
1836b8e80941Smrgvoid GLAPIENTRY
1837b8e80941Smrg_mesa_Uniform4i64vARB(GLint location,  GLsizei count, const GLint64 *value)
1838b8e80941Smrg{
1839b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1840b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 4);
1841b8e80941Smrg}
1842b8e80941Smrg
1843b8e80941Smrgvoid GLAPIENTRY
1844b8e80941Smrg_mesa_Uniform1ui64ARB(GLint location,  GLuint64 v0)
1845b8e80941Smrg{
1846b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1847b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 1);
1848b8e80941Smrg}
1849b8e80941Smrg
1850b8e80941Smrgvoid GLAPIENTRY
1851b8e80941Smrg_mesa_Uniform2ui64ARB(GLint location,  GLuint64 v0, GLuint64 v1)
1852b8e80941Smrg{
1853b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1854b8e80941Smrg   uint64_t v[2];
1855b8e80941Smrg   v[0] = v0;
1856b8e80941Smrg   v[1] = v1;
1857b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 2);
1858b8e80941Smrg}
1859b8e80941Smrg
1860b8e80941Smrgvoid GLAPIENTRY
1861b8e80941Smrg_mesa_Uniform3ui64ARB(GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
1862b8e80941Smrg{
1863b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1864b8e80941Smrg   uint64_t v[3];
1865b8e80941Smrg   v[0] = v0;
1866b8e80941Smrg   v[1] = v1;
1867b8e80941Smrg   v[2] = v2;
1868b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 3);
1869b8e80941Smrg}
1870b8e80941Smrg
1871b8e80941Smrgvoid GLAPIENTRY
1872b8e80941Smrg_mesa_Uniform4ui64ARB(GLint location,  GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
1873b8e80941Smrg{
1874b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1875b8e80941Smrg   uint64_t v[4];
1876b8e80941Smrg   v[0] = v0;
1877b8e80941Smrg   v[1] = v1;
1878b8e80941Smrg   v[2] = v2;
1879b8e80941Smrg   v[3] = v3;
1880b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 4);
1881b8e80941Smrg}
1882b8e80941Smrg
1883b8e80941Smrgvoid GLAPIENTRY
1884b8e80941Smrg_mesa_Uniform1ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
1885b8e80941Smrg{
1886b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1887b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 1);
1888b8e80941Smrg}
1889b8e80941Smrg
1890b8e80941Smrgvoid GLAPIENTRY
1891b8e80941Smrg_mesa_Uniform2ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
1892b8e80941Smrg{
1893b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1894b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 2);
1895b8e80941Smrg}
1896b8e80941Smrg
1897b8e80941Smrgvoid GLAPIENTRY
1898b8e80941Smrg_mesa_Uniform3ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
1899b8e80941Smrg{
1900b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1901b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 3);
1902b8e80941Smrg}
1903b8e80941Smrg
1904b8e80941Smrgvoid GLAPIENTRY
1905b8e80941Smrg_mesa_Uniform4ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
1906b8e80941Smrg{
1907b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1908b8e80941Smrg   _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 4);
1909b8e80941Smrg}
1910b8e80941Smrg
1911b8e80941Smrg/* DSA entrypoints */
1912b8e80941Smrgvoid GLAPIENTRY
1913b8e80941Smrg_mesa_ProgramUniform1i64ARB(GLuint program, GLint location, GLint64 v0)
1914b8e80941Smrg{
1915b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1916b8e80941Smrg   struct gl_shader_program *shProg =
1917b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1918b8e80941Smrg            "glProgramUniform1i64ARB");
1919b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_INT64, 1);
1920b8e80941Smrg}
1921b8e80941Smrg
1922b8e80941Smrgvoid GLAPIENTRY
1923b8e80941Smrg_mesa_ProgramUniform2i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1)
1924b8e80941Smrg{
1925b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1926b8e80941Smrg   struct gl_shader_program *shProg =
1927b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1928b8e80941Smrg                                      "glProgramUniform2i64ARB");
1929b8e80941Smrg   int64_t v[2];
1930b8e80941Smrg   v[0] = v0;
1931b8e80941Smrg   v[1] = v1;
1932b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 2);
1933b8e80941Smrg}
1934b8e80941Smrg
1935b8e80941Smrgvoid GLAPIENTRY
1936b8e80941Smrg_mesa_ProgramUniform3i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
1937b8e80941Smrg{
1938b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1939b8e80941Smrg   struct gl_shader_program *shProg =
1940b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1941b8e80941Smrg                                      "glProgramUniform3i64ARB");
1942b8e80941Smrg   int64_t v[3];
1943b8e80941Smrg   v[0] = v0;
1944b8e80941Smrg   v[1] = v1;
1945b8e80941Smrg   v[2] = v2;
1946b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 3);
1947b8e80941Smrg}
1948b8e80941Smrg
1949b8e80941Smrgvoid GLAPIENTRY
1950b8e80941Smrg_mesa_ProgramUniform4i64ARB(GLuint program, GLint location,  GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
1951b8e80941Smrg{
1952b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1953b8e80941Smrg   struct gl_shader_program *shProg =
1954b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1955b8e80941Smrg                                      "glProgramUniform4i64ARB");
1956b8e80941Smrg   int64_t v[4];
1957b8e80941Smrg   v[0] = v0;
1958b8e80941Smrg   v[1] = v1;
1959b8e80941Smrg   v[2] = v2;
1960b8e80941Smrg   v[3] = v3;
1961b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 4);
1962b8e80941Smrg}
1963b8e80941Smrg
1964b8e80941Smrgvoid GLAPIENTRY
1965b8e80941Smrg_mesa_ProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
1966b8e80941Smrg{
1967b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1968b8e80941Smrg   struct gl_shader_program *shProg =
1969b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1970b8e80941Smrg                                      "glProgramUniform1i64vARB");
1971b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 1);
1972b8e80941Smrg}
1973b8e80941Smrg
1974b8e80941Smrgvoid GLAPIENTRY
1975b8e80941Smrg_mesa_ProgramUniform2i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
1976b8e80941Smrg{
1977b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1978b8e80941Smrg   struct gl_shader_program *shProg =
1979b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1980b8e80941Smrg                                      "glProgramUniform2i64vARB");
1981b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 2);
1982b8e80941Smrg}
1983b8e80941Smrg
1984b8e80941Smrgvoid GLAPIENTRY
1985b8e80941Smrg_mesa_ProgramUniform3i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
1986b8e80941Smrg{
1987b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1988b8e80941Smrg   struct gl_shader_program *shProg =
1989b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
1990b8e80941Smrg                                      "glProgramUniform3i64vARB");
1991b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 3);
1992b8e80941Smrg}
1993b8e80941Smrg
1994b8e80941Smrgvoid GLAPIENTRY
1995b8e80941Smrg_mesa_ProgramUniform4i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
1996b8e80941Smrg{
1997b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1998b8e80941Smrg   struct gl_shader_program *shProg =
1999b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2000b8e80941Smrg                                      "glProgramUniform4i64vARB");
2001b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 4);
2002b8e80941Smrg}
2003b8e80941Smrg
2004b8e80941Smrgvoid GLAPIENTRY
2005b8e80941Smrg_mesa_ProgramUniform1ui64ARB(GLuint program, GLint location,  GLuint64 v0)
2006b8e80941Smrg{
2007b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2008b8e80941Smrg   struct gl_shader_program *shProg =
2009b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2010b8e80941Smrg                                      "glProgramUniform1ui64ARB");
2011b8e80941Smrg   _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_UINT64, 1);
2012b8e80941Smrg}
2013b8e80941Smrg
2014b8e80941Smrgvoid GLAPIENTRY
2015b8e80941Smrg_mesa_ProgramUniform2ui64ARB(GLuint program, GLint location,  GLuint64 v0, GLuint64 v1)
2016b8e80941Smrg{
2017b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2018b8e80941Smrg   struct gl_shader_program *shProg =
2019b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2020b8e80941Smrg                                      "glProgramUniform2ui64ARB");
2021b8e80941Smrg   uint64_t v[2];
2022b8e80941Smrg   v[0] = v0;
2023b8e80941Smrg   v[1] = v1;
2024b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 2);
2025b8e80941Smrg}
2026b8e80941Smrg
2027b8e80941Smrgvoid GLAPIENTRY
2028b8e80941Smrg_mesa_ProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
2029b8e80941Smrg{
2030b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2031b8e80941Smrg   struct gl_shader_program *shProg =
2032b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2033b8e80941Smrg                                      "glProgramUniform3ui64ARB");
2034b8e80941Smrg   uint64_t v[3];
2035b8e80941Smrg   v[0] = v0;
2036b8e80941Smrg   v[1] = v1;
2037b8e80941Smrg   v[2] = v2;
2038b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 3);
2039b8e80941Smrg}
2040b8e80941Smrg
2041b8e80941Smrgvoid GLAPIENTRY
2042b8e80941Smrg_mesa_ProgramUniform4ui64ARB(GLuint program, GLint location,  GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
2043b8e80941Smrg{
2044b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2045b8e80941Smrg   struct gl_shader_program *shProg =
2046b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2047b8e80941Smrg                                      "glProgramUniform4ui64ARB");
2048b8e80941Smrg   uint64_t v[4];
2049b8e80941Smrg   v[0] = v0;
2050b8e80941Smrg   v[1] = v1;
2051b8e80941Smrg   v[2] = v2;
2052b8e80941Smrg   v[3] = v3;
2053b8e80941Smrg   _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 4);
2054b8e80941Smrg}
2055b8e80941Smrg
2056b8e80941Smrgvoid GLAPIENTRY
2057b8e80941Smrg_mesa_ProgramUniform1ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
2058b8e80941Smrg{
2059b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2060b8e80941Smrg   struct gl_shader_program *shProg =
2061b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2062b8e80941Smrg                                      "glProgramUniform1ui64vARB");
2063b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 1);
2064b8e80941Smrg}
2065b8e80941Smrg
2066b8e80941Smrgvoid GLAPIENTRY
2067b8e80941Smrg_mesa_ProgramUniform2ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
2068b8e80941Smrg{
2069b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2070b8e80941Smrg   struct gl_shader_program *shProg =
2071b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2072b8e80941Smrg                                      "glProgramUniform2ui64vARB");
2073b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 2);
2074b8e80941Smrg}
2075b8e80941Smrg
2076b8e80941Smrgvoid GLAPIENTRY
2077b8e80941Smrg_mesa_ProgramUniform3ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
2078b8e80941Smrg{
2079b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2080b8e80941Smrg   struct gl_shader_program *shProg =
2081b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2082b8e80941Smrg                                      "glProgramUniform3ui64vARB");
2083b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 3);
2084b8e80941Smrg}
2085b8e80941Smrg
2086b8e80941Smrgvoid GLAPIENTRY
2087b8e80941Smrg_mesa_ProgramUniform4ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
2088b8e80941Smrg{
2089b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
2090b8e80941Smrg   struct gl_shader_program *shProg =
2091b8e80941Smrg      _mesa_lookup_shader_program_err(ctx, program,
2092b8e80941Smrg                                      "glProgramUniform4ui64vARB");
2093b8e80941Smrg   _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 4);
2094848b8605Smrg}
2095