mesa/glspirv: Add _mesa_spirv_link_shaders() function
[mesa.git] / src / mesa / main / uniforms.c
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved.
6 * Copyright © 2010 Intel Corporation
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27 /**
28 * \file uniforms.c
29 * Functions related to GLSL uniform variables.
30 * \author Brian Paul
31 */
32
33 /**
34 * XXX things to do:
35 * 1. Check that the right error code is generated for all _mesa_error() calls.
36 * 2. Insert FLUSH_VERTICES calls in various places
37 */
38
39 #include "main/glheader.h"
40 #include "main/context.h"
41 #include "main/dispatch.h"
42 #include "main/shaderapi.h"
43 #include "main/shaderobj.h"
44 #include "main/uniforms.h"
45 #include "main/enums.h"
46 #include "compiler/glsl/ir_uniform.h"
47 #include "compiler/glsl_types.h"
48 #include "program/program.h"
49 #include "util/bitscan.h"
50
51 /**
52 * Update the vertex/fragment program's TexturesUsed array.
53 *
54 * This needs to be called after glUniform(set sampler var) is called.
55 * A call to glUniform(samplerVar, value) causes a sampler to point to a
56 * particular texture unit. We know the sampler's texture target
57 * (1D/2D/3D/etc) from compile time but the sampler's texture unit is
58 * set by glUniform() calls.
59 *
60 * So, scan the program->SamplerUnits[] and program->SamplerTargets[]
61 * information to update the prog->TexturesUsed[] values.
62 * Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
63 * TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
64 * We'll use that info for state validation before rendering.
65 */
66 static inline void
67 update_single_shader_texture_used(struct gl_shader_program *shProg,
68 struct gl_program *prog,
69 GLuint unit, GLuint target)
70 {
71 gl_shader_stage prog_stage =
72 _mesa_program_enum_to_shader_stage(prog->Target);
73
74 assert(unit < ARRAY_SIZE(prog->TexturesUsed));
75 assert(target < NUM_TEXTURE_TARGETS);
76
77 /* From section 7.10 (Samplers) of the OpenGL 4.5 spec:
78 *
79 * "It is not allowed to have variables of different sampler types pointing
80 * to the same texture image unit within a program object."
81 */
82 unsigned stages_mask = shProg->data->linked_stages;
83 while (stages_mask) {
84 const int stage = u_bit_scan(&stages_mask);
85
86 /* Skip validation if we are yet to update textures used in this
87 * stage.
88 */
89 if (prog_stage < stage)
90 break;
91
92 struct gl_program *glprog = shProg->_LinkedShaders[stage]->Program;
93 if (glprog->TexturesUsed[unit] & ~(1 << target))
94 shProg->SamplersValidated = GL_FALSE;
95 }
96
97 prog->TexturesUsed[unit] |= (1 << target);
98 }
99
100 void
101 _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
102 struct gl_program *prog)
103 {
104 GLbitfield mask = prog->SamplersUsed;
105 gl_shader_stage prog_stage =
106 _mesa_program_enum_to_shader_stage(prog->Target);
107 MAYBE_UNUSED struct gl_linked_shader *shader =
108 shProg->_LinkedShaders[prog_stage];
109 GLuint s;
110
111 assert(shader);
112
113 memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
114
115 while (mask) {
116 s = u_bit_scan(&mask);
117
118 update_single_shader_texture_used(shProg, prog,
119 prog->SamplerUnits[s],
120 prog->sh.SamplerTargets[s]);
121 }
122
123 if (unlikely(prog->sh.HasBoundBindlessSampler)) {
124 /* Loop over bindless samplers bound to texture units.
125 */
126 for (s = 0; s < prog->sh.NumBindlessSamplers; s++) {
127 struct gl_bindless_sampler *sampler = &prog->sh.BindlessSamplers[s];
128
129 if (!sampler->bound)
130 continue;
131
132 update_single_shader_texture_used(shProg, prog, sampler->unit,
133 sampler->target);
134 }
135 }
136 }
137
138 /**
139 * Connect a piece of driver storage with a part of a uniform
140 *
141 * \param uni The uniform with which the storage will be associated
142 * \param element_stride Byte-stride between array elements.
143 * \sa gl_uniform_driver_storage::element_stride.
144 * \param vector_stride Byte-stride between vectors (in a matrix).
145 * \sa gl_uniform_driver_storage::vector_stride.
146 * \param format Conversion from native format to driver format
147 * required by the driver.
148 * \param data Location to dump the data.
149 */
150 void
151 _mesa_uniform_attach_driver_storage(struct gl_uniform_storage *uni,
152 unsigned element_stride,
153 unsigned vector_stride,
154 enum gl_uniform_driver_format format,
155 void *data)
156 {
157 uni->driver_storage =
158 realloc(uni->driver_storage,
159 sizeof(struct gl_uniform_driver_storage)
160 * (uni->num_driver_storage + 1));
161
162 uni->driver_storage[uni->num_driver_storage].element_stride = element_stride;
163 uni->driver_storage[uni->num_driver_storage].vector_stride = vector_stride;
164 uni->driver_storage[uni->num_driver_storage].format = format;
165 uni->driver_storage[uni->num_driver_storage].data = data;
166
167 uni->num_driver_storage++;
168 }
169
170 /**
171 * Sever all connections with all pieces of driver storage for all uniforms
172 *
173 * \warning
174 * This function does \b not release any of the \c data pointers
175 * previously passed in to \c _mesa_uniform_attach_driver_stoarge.
176 */
177 void
178 _mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni)
179 {
180 free(uni->driver_storage);
181 uni->driver_storage = NULL;
182 uni->num_driver_storage = 0;
183 }
184
185 void GLAPIENTRY
186 _mesa_Uniform1f(GLint location, GLfloat v0)
187 {
188 GET_CURRENT_CONTEXT(ctx);
189 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 1);
190 }
191
192 void GLAPIENTRY
193 _mesa_Uniform2f(GLint location, GLfloat v0, GLfloat v1)
194 {
195 GET_CURRENT_CONTEXT(ctx);
196 GLfloat v[2];
197 v[0] = v0;
198 v[1] = v1;
199 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 2);
200 }
201
202 void GLAPIENTRY
203 _mesa_Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
204 {
205 GET_CURRENT_CONTEXT(ctx);
206 GLfloat v[3];
207 v[0] = v0;
208 v[1] = v1;
209 v[2] = v2;
210 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 3);
211 }
212
213 void GLAPIENTRY
214 _mesa_Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
215 GLfloat v3)
216 {
217 GET_CURRENT_CONTEXT(ctx);
218 GLfloat v[4];
219 v[0] = v0;
220 v[1] = v1;
221 v[2] = v2;
222 v[3] = v3;
223 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 4);
224 }
225
226 void GLAPIENTRY
227 _mesa_Uniform1i(GLint location, GLint v0)
228 {
229 GET_CURRENT_CONTEXT(ctx);
230 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 1);
231 }
232
233 void GLAPIENTRY
234 _mesa_Uniform2i(GLint location, GLint v0, GLint v1)
235 {
236 GET_CURRENT_CONTEXT(ctx);
237 GLint v[2];
238 v[0] = v0;
239 v[1] = v1;
240 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 2);
241 }
242
243 void GLAPIENTRY
244 _mesa_Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
245 {
246 GET_CURRENT_CONTEXT(ctx);
247 GLint v[3];
248 v[0] = v0;
249 v[1] = v1;
250 v[2] = v2;
251 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 3);
252 }
253
254 void GLAPIENTRY
255 _mesa_Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
256 {
257 GET_CURRENT_CONTEXT(ctx);
258 GLint v[4];
259 v[0] = v0;
260 v[1] = v1;
261 v[2] = v2;
262 v[3] = v3;
263 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 4);
264 }
265
266 void GLAPIENTRY
267 _mesa_Uniform1fv(GLint location, GLsizei count, const GLfloat * value)
268 {
269 GET_CURRENT_CONTEXT(ctx);
270 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 1);
271 }
272
273 void GLAPIENTRY
274 _mesa_Uniform2fv(GLint location, GLsizei count, const GLfloat * value)
275 {
276 GET_CURRENT_CONTEXT(ctx);
277 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 2);
278 }
279
280 void GLAPIENTRY
281 _mesa_Uniform3fv(GLint location, GLsizei count, const GLfloat * value)
282 {
283 GET_CURRENT_CONTEXT(ctx);
284 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 3);
285 }
286
287 void GLAPIENTRY
288 _mesa_Uniform4fv(GLint location, GLsizei count, const GLfloat * value)
289 {
290 GET_CURRENT_CONTEXT(ctx);
291 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_FLOAT, 4);
292 }
293
294 void GLAPIENTRY
295 _mesa_Uniform1iv(GLint location, GLsizei count, const GLint * value)
296 {
297 GET_CURRENT_CONTEXT(ctx);
298 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 1);
299 }
300
301 void GLAPIENTRY
302 _mesa_Uniform2iv(GLint location, GLsizei count, const GLint * value)
303 {
304 GET_CURRENT_CONTEXT(ctx);
305 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 2);
306 }
307
308 void GLAPIENTRY
309 _mesa_Uniform3iv(GLint location, GLsizei count, const GLint * value)
310 {
311 GET_CURRENT_CONTEXT(ctx);
312 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 3);
313 }
314
315 void GLAPIENTRY
316 _mesa_Uniform4iv(GLint location, GLsizei count, const GLint * value)
317 {
318 GET_CURRENT_CONTEXT(ctx);
319 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT, 4);
320 }
321
322 void GLAPIENTRY
323 _mesa_UniformHandleui64ARB(GLint location, GLuint64 value)
324 {
325 GET_CURRENT_CONTEXT(ctx);
326 _mesa_uniform_handle(location, 1, &value, ctx, ctx->_Shader->ActiveProgram);
327 }
328
329 void GLAPIENTRY
330 _mesa_UniformHandleui64vARB(GLint location, GLsizei count,
331 const GLuint64 *value)
332 {
333 GET_CURRENT_CONTEXT(ctx);
334 _mesa_uniform_handle(location, count, value, ctx,
335 ctx->_Shader->ActiveProgram);
336 }
337
338
339 /** Same as above with direct state access **/
340 void GLAPIENTRY
341 _mesa_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
342 {
343 GET_CURRENT_CONTEXT(ctx);
344 struct gl_shader_program *shProg =
345 _mesa_lookup_shader_program_err(ctx, program,
346 "glProgramUniform1f");
347 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_FLOAT, 1);
348 }
349
350 void GLAPIENTRY
351 _mesa_ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
352 {
353 GET_CURRENT_CONTEXT(ctx);
354 GLfloat v[2];
355 struct gl_shader_program *shProg;
356 v[0] = v0;
357 v[1] = v1;
358 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2f");
359 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 2);
360 }
361
362 void GLAPIENTRY
363 _mesa_ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
364 GLfloat v2)
365 {
366 GET_CURRENT_CONTEXT(ctx);
367 GLfloat v[3];
368 struct gl_shader_program *shProg;
369 v[0] = v0;
370 v[1] = v1;
371 v[2] = v2;
372 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3f");
373 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 3);
374 }
375
376 void GLAPIENTRY
377 _mesa_ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
378 GLfloat v2, GLfloat v3)
379 {
380 GET_CURRENT_CONTEXT(ctx);
381 GLfloat v[4];
382 struct gl_shader_program *shProg;
383 v[0] = v0;
384 v[1] = v1;
385 v[2] = v2;
386 v[3] = v3;
387 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4f");
388 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_FLOAT, 4);
389 }
390
391 void GLAPIENTRY
392 _mesa_ProgramUniform1i(GLuint program, GLint location, GLint v0)
393 {
394 GET_CURRENT_CONTEXT(ctx);
395 struct gl_shader_program *shProg =
396 _mesa_lookup_shader_program_err(ctx, program,
397 "glProgramUniform1i");
398 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_INT, 1);
399 }
400
401 void GLAPIENTRY
402 _mesa_ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
403 {
404 GET_CURRENT_CONTEXT(ctx);
405 GLint v[2];
406 struct gl_shader_program *shProg;
407 v[0] = v0;
408 v[1] = v1;
409 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2i");
410 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 2);
411 }
412
413 void GLAPIENTRY
414 _mesa_ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1,
415 GLint v2)
416 {
417 GET_CURRENT_CONTEXT(ctx);
418 GLint v[3];
419 struct gl_shader_program *shProg;
420 v[0] = v0;
421 v[1] = v1;
422 v[2] = v2;
423 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3i");
424 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 3);
425 }
426
427 void GLAPIENTRY
428 _mesa_ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1,
429 GLint v2, GLint v3)
430 {
431 GET_CURRENT_CONTEXT(ctx);
432 GLint v[4];
433 struct gl_shader_program *shProg;
434 v[0] = v0;
435 v[1] = v1;
436 v[2] = v2;
437 v[3] = v3;
438 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4i");
439 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT, 4);
440 }
441
442 void GLAPIENTRY
443 _mesa_ProgramUniform1fv(GLuint program, GLint location, GLsizei count,
444 const GLfloat * value)
445 {
446 GET_CURRENT_CONTEXT(ctx);
447 struct gl_shader_program *shProg =
448 _mesa_lookup_shader_program_err(ctx, program,
449 "glProgramUniform1fv");
450 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 1);
451 }
452
453 void GLAPIENTRY
454 _mesa_ProgramUniform2fv(GLuint program, GLint location, GLsizei count,
455 const GLfloat * value)
456 {
457 GET_CURRENT_CONTEXT(ctx);
458 struct gl_shader_program *shProg =
459 _mesa_lookup_shader_program_err(ctx, program,
460 "glProgramUniform2fv");
461 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 2);
462 }
463
464 void GLAPIENTRY
465 _mesa_ProgramUniform3fv(GLuint program, GLint location, GLsizei count,
466 const GLfloat * value)
467 {
468 GET_CURRENT_CONTEXT(ctx);
469 struct gl_shader_program *shProg =
470 _mesa_lookup_shader_program_err(ctx, program,
471 "glProgramUniform3fv");
472 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 3);
473 }
474
475 void GLAPIENTRY
476 _mesa_ProgramUniform4fv(GLuint program, GLint location, GLsizei count,
477 const GLfloat * value)
478 {
479 GET_CURRENT_CONTEXT(ctx);
480 struct gl_shader_program *shProg =
481 _mesa_lookup_shader_program_err(ctx, program,
482 "glProgramUniform4fv");
483 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_FLOAT, 4);
484 }
485
486 void GLAPIENTRY
487 _mesa_ProgramUniform1iv(GLuint program, GLint location, GLsizei count,
488 const GLint * value)
489 {
490 GET_CURRENT_CONTEXT(ctx);
491 struct gl_shader_program *shProg =
492 _mesa_lookup_shader_program_err(ctx, program,
493 "glProgramUniform1iv");
494 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 1);
495 }
496
497 void GLAPIENTRY
498 _mesa_ProgramUniform2iv(GLuint program, GLint location, GLsizei count,
499 const GLint * value)
500 {
501 GET_CURRENT_CONTEXT(ctx);
502 struct gl_shader_program *shProg =
503 _mesa_lookup_shader_program_err(ctx, program,
504 "glProgramUniform2iv");
505 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 2);
506 }
507
508 void GLAPIENTRY
509 _mesa_ProgramUniform3iv(GLuint program, GLint location, GLsizei count,
510 const GLint * value)
511 {
512 GET_CURRENT_CONTEXT(ctx);
513 struct gl_shader_program *shProg =
514 _mesa_lookup_shader_program_err(ctx, program,
515 "glProgramUniform3iv");
516 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 3);
517 }
518
519 void GLAPIENTRY
520 _mesa_ProgramUniform4iv(GLuint program, GLint location, GLsizei count,
521 const GLint * value)
522 {
523 GET_CURRENT_CONTEXT(ctx);
524 struct gl_shader_program *shProg =
525 _mesa_lookup_shader_program_err(ctx, program,
526 "glProgramUniform4iv");
527 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT, 4);
528 }
529
530 void GLAPIENTRY
531 _mesa_ProgramUniformHandleui64ARB(GLuint program, GLint location,
532 GLuint64 value)
533 {
534 GET_CURRENT_CONTEXT(ctx);
535 struct gl_shader_program *shProg =
536 _mesa_lookup_shader_program_err(ctx, program,
537 "glProgramUniformHandleui64ARB");
538 _mesa_uniform_handle(location, 1, &value, ctx, shProg);
539 }
540
541 void GLAPIENTRY
542 _mesa_ProgramUniformHandleui64vARB(GLuint program, GLint location,
543 GLsizei count, const GLuint64 *values)
544 {
545 GET_CURRENT_CONTEXT(ctx);
546 struct gl_shader_program *shProg =
547 _mesa_lookup_shader_program_err(ctx, program,
548 "glProgramUniformHandleui64vARB");
549 _mesa_uniform_handle(location, count, values, ctx, shProg);
550 }
551
552
553 /** OpenGL 3.0 GLuint-valued functions **/
554 void GLAPIENTRY
555 _mesa_Uniform1ui(GLint location, GLuint v0)
556 {
557 GET_CURRENT_CONTEXT(ctx);
558 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 1);
559 }
560
561 void GLAPIENTRY
562 _mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1)
563 {
564 GET_CURRENT_CONTEXT(ctx);
565 GLuint v[2];
566 v[0] = v0;
567 v[1] = v1;
568 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 2);
569 }
570
571 void GLAPIENTRY
572 _mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
573 {
574 GET_CURRENT_CONTEXT(ctx);
575 GLuint v[3];
576 v[0] = v0;
577 v[1] = v1;
578 v[2] = v2;
579 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 3);
580 }
581
582 void GLAPIENTRY
583 _mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
584 {
585 GET_CURRENT_CONTEXT(ctx);
586 GLuint v[4];
587 v[0] = v0;
588 v[1] = v1;
589 v[2] = v2;
590 v[3] = v3;
591 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 4);
592 }
593
594 void GLAPIENTRY
595 _mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
596 {
597 GET_CURRENT_CONTEXT(ctx);
598 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 1);
599 }
600
601 void GLAPIENTRY
602 _mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
603 {
604 GET_CURRENT_CONTEXT(ctx);
605 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 2);
606 }
607
608 void GLAPIENTRY
609 _mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
610 {
611 GET_CURRENT_CONTEXT(ctx);
612 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 3);
613 }
614
615 void GLAPIENTRY
616 _mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
617 {
618 GET_CURRENT_CONTEXT(ctx);
619 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT, 4);
620 }
621
622
623
624 void GLAPIENTRY
625 _mesa_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
626 const GLfloat * value)
627 {
628 GET_CURRENT_CONTEXT(ctx);
629 _mesa_uniform_matrix(location, count, transpose, value,
630 ctx, ctx->_Shader->ActiveProgram, 2, 2, GLSL_TYPE_FLOAT);
631 }
632
633 void GLAPIENTRY
634 _mesa_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
635 const GLfloat * value)
636 {
637 GET_CURRENT_CONTEXT(ctx);
638 _mesa_uniform_matrix(location, count, transpose, value,
639 ctx, ctx->_Shader->ActiveProgram, 3, 3, GLSL_TYPE_FLOAT);
640 }
641
642 void GLAPIENTRY
643 _mesa_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
644 const GLfloat * value)
645 {
646 GET_CURRENT_CONTEXT(ctx);
647 _mesa_uniform_matrix(location, count, transpose, value,
648 ctx, ctx->_Shader->ActiveProgram, 4, 4, GLSL_TYPE_FLOAT);
649 }
650
651 /** Same as above with direct state access **/
652
653 void GLAPIENTRY
654 _mesa_ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
655 {
656 GET_CURRENT_CONTEXT(ctx);
657 struct gl_shader_program *shProg =
658 _mesa_lookup_shader_program_err(ctx, program,
659 "glProgramUniform1ui");
660 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_UINT, 1);
661 }
662
663 void GLAPIENTRY
664 _mesa_ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
665 {
666 GET_CURRENT_CONTEXT(ctx);
667 GLuint v[2];
668 struct gl_shader_program *shProg;
669 v[0] = v0;
670 v[1] = v1;
671 shProg = _mesa_lookup_shader_program_err(ctx, program,
672 "glProgramUniform2ui");
673 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 2);
674 }
675
676 void GLAPIENTRY
677 _mesa_ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1,
678 GLuint v2)
679 {
680 GET_CURRENT_CONTEXT(ctx);
681 GLuint v[3];
682 struct gl_shader_program *shProg;
683 v[0] = v0;
684 v[1] = v1;
685 v[2] = v2;
686 shProg = _mesa_lookup_shader_program_err(ctx, program,
687 "glProgramUniform3ui");
688 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 3);
689 }
690
691 void GLAPIENTRY
692 _mesa_ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1,
693 GLuint v2, GLuint v3)
694 {
695 GET_CURRENT_CONTEXT(ctx);
696 GLuint v[4];
697 struct gl_shader_program *shProg;
698 v[0] = v0;
699 v[1] = v1;
700 v[2] = v2;
701 v[3] = v3;
702 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4ui");
703 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT, 4);
704 }
705
706 void GLAPIENTRY
707 _mesa_ProgramUniform1uiv(GLuint program, GLint location, GLsizei count,
708 const GLuint *value)
709 {
710 GET_CURRENT_CONTEXT(ctx);
711 struct gl_shader_program *shProg =
712 _mesa_lookup_shader_program_err(ctx, program,
713 "glProgramUniform1uiv");
714 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 1);
715 }
716
717 void GLAPIENTRY
718 _mesa_ProgramUniform2uiv(GLuint program, GLint location, GLsizei count,
719 const GLuint *value)
720 {
721 GET_CURRENT_CONTEXT(ctx);
722 struct gl_shader_program *shProg =
723 _mesa_lookup_shader_program_err(ctx, program,
724 "glProgramUniform2uiv");
725 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 2);
726 }
727
728 void GLAPIENTRY
729 _mesa_ProgramUniform3uiv(GLuint program, GLint location, GLsizei count,
730 const GLuint *value)
731 {
732 GET_CURRENT_CONTEXT(ctx);
733 struct gl_shader_program *shProg =
734 _mesa_lookup_shader_program_err(ctx, program,
735 "glProgramUniform3uiv");
736 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 3);
737 }
738
739 void GLAPIENTRY
740 _mesa_ProgramUniform4uiv(GLuint program, GLint location, GLsizei count,
741 const GLuint *value)
742 {
743 GET_CURRENT_CONTEXT(ctx);
744 struct gl_shader_program *shProg =
745 _mesa_lookup_shader_program_err(ctx, program,
746 "glProgramUniform4uiv");
747 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT, 4);
748 }
749
750
751
752 void GLAPIENTRY
753 _mesa_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
754 GLboolean transpose, const GLfloat * value)
755 {
756 GET_CURRENT_CONTEXT(ctx);
757 struct gl_shader_program *shProg =
758 _mesa_lookup_shader_program_err(ctx, program,
759 "glProgramUniformMatrix2fv");
760 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 2, GLSL_TYPE_FLOAT);
761 }
762
763 void GLAPIENTRY
764 _mesa_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
765 GLboolean transpose, const GLfloat * value)
766 {
767 GET_CURRENT_CONTEXT(ctx);
768 struct gl_shader_program *shProg =
769 _mesa_lookup_shader_program_err(ctx, program,
770 "glProgramUniformMatrix3fv");
771 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 3, GLSL_TYPE_FLOAT);
772 }
773
774 void GLAPIENTRY
775 _mesa_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
776 GLboolean transpose, const GLfloat * value)
777 {
778 GET_CURRENT_CONTEXT(ctx);
779 struct gl_shader_program *shProg =
780 _mesa_lookup_shader_program_err(ctx, program,
781 "glProgramUniformMatrix4fv");
782 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 4, GLSL_TYPE_FLOAT);
783 }
784
785
786 /**
787 * Non-square UniformMatrix are OpenGL 2.1
788 */
789 void GLAPIENTRY
790 _mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
791 const GLfloat *value)
792 {
793 GET_CURRENT_CONTEXT(ctx);
794 _mesa_uniform_matrix(location, count, transpose, value,
795 ctx, ctx->_Shader->ActiveProgram, 2, 3, GLSL_TYPE_FLOAT);
796 }
797
798 void GLAPIENTRY
799 _mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
800 const GLfloat *value)
801 {
802 GET_CURRENT_CONTEXT(ctx);
803 _mesa_uniform_matrix(location, count, transpose, value,
804 ctx, ctx->_Shader->ActiveProgram, 3, 2, GLSL_TYPE_FLOAT);
805 }
806
807 void GLAPIENTRY
808 _mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
809 const GLfloat *value)
810 {
811 GET_CURRENT_CONTEXT(ctx);
812 _mesa_uniform_matrix(location, count, transpose, value,
813 ctx, ctx->_Shader->ActiveProgram, 2, 4, GLSL_TYPE_FLOAT);
814 }
815
816 void GLAPIENTRY
817 _mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
818 const GLfloat *value)
819 {
820 GET_CURRENT_CONTEXT(ctx);
821 _mesa_uniform_matrix(location, count, transpose, value,
822 ctx, ctx->_Shader->ActiveProgram, 4, 2, GLSL_TYPE_FLOAT);
823 }
824
825 void GLAPIENTRY
826 _mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
827 const GLfloat *value)
828 {
829 GET_CURRENT_CONTEXT(ctx);
830 _mesa_uniform_matrix(location, count, transpose, value,
831 ctx, ctx->_Shader->ActiveProgram, 3, 4, GLSL_TYPE_FLOAT);
832 }
833
834 void GLAPIENTRY
835 _mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
836 const GLfloat *value)
837 {
838 GET_CURRENT_CONTEXT(ctx);
839 _mesa_uniform_matrix(location, count, transpose, value,
840 ctx, ctx->_Shader->ActiveProgram, 4, 3, GLSL_TYPE_FLOAT);
841 }
842
843 /** Same as above with direct state access **/
844
845 void GLAPIENTRY
846 _mesa_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
847 GLboolean transpose, const GLfloat * value)
848 {
849 GET_CURRENT_CONTEXT(ctx);
850 struct gl_shader_program *shProg =
851 _mesa_lookup_shader_program_err(ctx, program,
852 "glProgramUniformMatrix2x3fv");
853 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 3, GLSL_TYPE_FLOAT);
854 }
855
856 void GLAPIENTRY
857 _mesa_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
858 GLboolean transpose, const GLfloat * value)
859 {
860 GET_CURRENT_CONTEXT(ctx);
861 struct gl_shader_program *shProg =
862 _mesa_lookup_shader_program_err(ctx, program,
863 "glProgramUniformMatrix3x2fv");
864 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 2, GLSL_TYPE_FLOAT);
865 }
866
867 void GLAPIENTRY
868 _mesa_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
869 GLboolean transpose, const GLfloat * value)
870 {
871 GET_CURRENT_CONTEXT(ctx);
872 struct gl_shader_program *shProg =
873 _mesa_lookup_shader_program_err(ctx, program,
874 "glProgramUniformMatrix2x4fv");
875 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 2, 4, GLSL_TYPE_FLOAT);
876 }
877
878 void GLAPIENTRY
879 _mesa_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
880 GLboolean transpose, const GLfloat * value)
881 {
882 GET_CURRENT_CONTEXT(ctx);
883 struct gl_shader_program *shProg =
884 _mesa_lookup_shader_program_err(ctx, program,
885 "glProgramUniformMatrix4x2fv");
886 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 2, GLSL_TYPE_FLOAT);
887 }
888
889 void GLAPIENTRY
890 _mesa_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
891 GLboolean transpose, const GLfloat * value)
892 {
893 GET_CURRENT_CONTEXT(ctx);
894 struct gl_shader_program *shProg =
895 _mesa_lookup_shader_program_err(ctx, program,
896 "glProgramUniformMatrix3x4fv");
897 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 3, 4, GLSL_TYPE_FLOAT);
898 }
899
900 void GLAPIENTRY
901 _mesa_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
902 GLboolean transpose, const GLfloat * value)
903 {
904 GET_CURRENT_CONTEXT(ctx);
905 struct gl_shader_program *shProg =
906 _mesa_lookup_shader_program_err(ctx, program,
907 "glProgramUniformMatrix4x3fv");
908 _mesa_uniform_matrix(location, count, transpose, value, ctx, shProg, 4, 3, GLSL_TYPE_FLOAT);
909 }
910
911
912 void GLAPIENTRY
913 _mesa_GetnUniformfvARB(GLuint program, GLint location,
914 GLsizei bufSize, GLfloat *params)
915 {
916 GET_CURRENT_CONTEXT(ctx);
917 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_FLOAT, params);
918 }
919
920 void GLAPIENTRY
921 _mesa_GetUniformfv(GLuint program, GLint location, GLfloat *params)
922 {
923 _mesa_GetnUniformfvARB(program, location, INT_MAX, params);
924 }
925
926
927 void GLAPIENTRY
928 _mesa_GetnUniformivARB(GLuint program, GLint location,
929 GLsizei bufSize, GLint *params)
930 {
931 GET_CURRENT_CONTEXT(ctx);
932 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT, params);
933 }
934
935 void GLAPIENTRY
936 _mesa_GetUniformiv(GLuint program, GLint location, GLint *params)
937 {
938 _mesa_GetnUniformivARB(program, location, INT_MAX, params);
939 }
940
941
942 /* GL3 */
943 void GLAPIENTRY
944 _mesa_GetnUniformuivARB(GLuint program, GLint location,
945 GLsizei bufSize, GLuint *params)
946 {
947 GET_CURRENT_CONTEXT(ctx);
948 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT, params);
949 }
950
951 void GLAPIENTRY
952 _mesa_GetUniformuiv(GLuint program, GLint location, GLuint *params)
953 {
954 _mesa_GetnUniformuivARB(program, location, INT_MAX, params);
955 }
956
957
958 /* GL4 */
959 void GLAPIENTRY
960 _mesa_GetnUniformdvARB(GLuint program, GLint location,
961 GLsizei bufSize, GLdouble *params)
962 {
963 GET_CURRENT_CONTEXT(ctx);
964
965 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_DOUBLE, params);
966 }
967
968 void GLAPIENTRY
969 _mesa_GetUniformdv(GLuint program, GLint location, GLdouble *params)
970 {
971 _mesa_GetnUniformdvARB(program, location, INT_MAX, params);
972 }
973
974 void GLAPIENTRY
975 _mesa_GetnUniformi64vARB(GLuint program, GLint location,
976 GLsizei bufSize, GLint64 *params)
977 {
978 GET_CURRENT_CONTEXT(ctx);
979 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT64, params);
980 }
981 void GLAPIENTRY
982 _mesa_GetUniformi64vARB(GLuint program, GLint location, GLint64 *params)
983 {
984 _mesa_GetnUniformi64vARB(program, location, INT_MAX, params);
985 }
986
987 void GLAPIENTRY
988 _mesa_GetnUniformui64vARB(GLuint program, GLint location,
989 GLsizei bufSize, GLuint64 *params)
990 {
991 GET_CURRENT_CONTEXT(ctx);
992 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT64, params);
993 }
994
995 void GLAPIENTRY
996 _mesa_GetUniformui64vARB(GLuint program, GLint location, GLuint64 *params)
997 {
998 _mesa_GetnUniformui64vARB(program, location, INT_MAX, params);
999 }
1000
1001
1002 GLint GLAPIENTRY
1003 _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name)
1004 {
1005 struct gl_shader_program *shProg;
1006
1007 GET_CURRENT_CONTEXT(ctx);
1008
1009 shProg = _mesa_lookup_shader_program_err(ctx, programObj,
1010 "glGetUniformLocation");
1011 if (!shProg)
1012 return -1;
1013
1014 /* Page 80 (page 94 of the PDF) of the OpenGL 2.1 spec says:
1015 *
1016 * "If program has not been successfully linked, the error
1017 * INVALID_OPERATION is generated."
1018 */
1019 if (shProg->data->LinkStatus == LINKING_FAILURE) {
1020 _mesa_error(ctx, GL_INVALID_OPERATION,
1021 "glGetUniformLocation(program not linked)");
1022 return -1;
1023 }
1024
1025 return _mesa_program_resource_location(shProg, GL_UNIFORM, name);
1026 }
1027
1028 GLint GLAPIENTRY
1029 _mesa_GetUniformLocation_no_error(GLuint programObj, const GLcharARB *name)
1030 {
1031 GET_CURRENT_CONTEXT(ctx);
1032
1033 struct gl_shader_program *shProg =
1034 _mesa_lookup_shader_program(ctx, programObj);
1035
1036 return _mesa_program_resource_location(shProg, GL_UNIFORM, name);
1037 }
1038
1039 GLuint GLAPIENTRY
1040 _mesa_GetUniformBlockIndex(GLuint program,
1041 const GLchar *uniformBlockName)
1042 {
1043 GET_CURRENT_CONTEXT(ctx);
1044 struct gl_shader_program *shProg;
1045
1046 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1047 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformBlockIndex");
1048 return GL_INVALID_INDEX;
1049 }
1050
1051 shProg = _mesa_lookup_shader_program_err(ctx, program,
1052 "glGetUniformBlockIndex");
1053 if (!shProg)
1054 return GL_INVALID_INDEX;
1055
1056 struct gl_program_resource *res =
1057 _mesa_program_resource_find_name(shProg, GL_UNIFORM_BLOCK,
1058 uniformBlockName, NULL);
1059 if (!res)
1060 return GL_INVALID_INDEX;
1061
1062 return _mesa_program_resource_index(shProg, res);
1063 }
1064
1065 void GLAPIENTRY
1066 _mesa_GetUniformIndices(GLuint program,
1067 GLsizei uniformCount,
1068 const GLchar * const *uniformNames,
1069 GLuint *uniformIndices)
1070 {
1071 GET_CURRENT_CONTEXT(ctx);
1072 GLsizei i;
1073 struct gl_shader_program *shProg;
1074
1075 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1076 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformIndices");
1077 return;
1078 }
1079
1080 shProg = _mesa_lookup_shader_program_err(ctx, program,
1081 "glGetUniformIndices");
1082 if (!shProg)
1083 return;
1084
1085 if (uniformCount < 0) {
1086 _mesa_error(ctx, GL_INVALID_VALUE,
1087 "glGetUniformIndices(uniformCount < 0)");
1088 return;
1089 }
1090
1091 for (i = 0; i < uniformCount; i++) {
1092 struct gl_program_resource *res =
1093 _mesa_program_resource_find_name(shProg, GL_UNIFORM, uniformNames[i],
1094 NULL);
1095 uniformIndices[i] = _mesa_program_resource_index(shProg, res);
1096 }
1097 }
1098
1099 static void
1100 uniform_block_binding(struct gl_context *ctx, struct gl_shader_program *shProg,
1101 GLuint uniformBlockIndex, GLuint uniformBlockBinding)
1102 {
1103 if (shProg->data->UniformBlocks[uniformBlockIndex].Binding !=
1104 uniformBlockBinding) {
1105
1106 FLUSH_VERTICES(ctx, 0);
1107 ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
1108
1109 shProg->data->UniformBlocks[uniformBlockIndex].Binding =
1110 uniformBlockBinding;
1111 }
1112 }
1113
1114 void GLAPIENTRY
1115 _mesa_UniformBlockBinding_no_error(GLuint program, GLuint uniformBlockIndex,
1116 GLuint uniformBlockBinding)
1117 {
1118 GET_CURRENT_CONTEXT(ctx);
1119
1120 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program);
1121 uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding);
1122 }
1123
1124 void GLAPIENTRY
1125 _mesa_UniformBlockBinding(GLuint program,
1126 GLuint uniformBlockIndex,
1127 GLuint uniformBlockBinding)
1128 {
1129 GET_CURRENT_CONTEXT(ctx);
1130 struct gl_shader_program *shProg;
1131
1132 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1133 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformBlockBinding");
1134 return;
1135 }
1136
1137 shProg = _mesa_lookup_shader_program_err(ctx, program,
1138 "glUniformBlockBinding");
1139 if (!shProg)
1140 return;
1141
1142 if (uniformBlockIndex >= shProg->data->NumUniformBlocks) {
1143 _mesa_error(ctx, GL_INVALID_VALUE,
1144 "glUniformBlockBinding(block index %u >= %u)",
1145 uniformBlockIndex, shProg->data->NumUniformBlocks);
1146 return;
1147 }
1148
1149 if (uniformBlockBinding >= ctx->Const.MaxUniformBufferBindings) {
1150 _mesa_error(ctx, GL_INVALID_VALUE,
1151 "glUniformBlockBinding(block binding %u >= %u)",
1152 uniformBlockBinding, ctx->Const.MaxUniformBufferBindings);
1153 return;
1154 }
1155
1156 uniform_block_binding(ctx, shProg, uniformBlockIndex, uniformBlockBinding);
1157 }
1158
1159 static void
1160 shader_storage_block_binding(struct gl_context *ctx,
1161 struct gl_shader_program *shProg,
1162 GLuint shaderStorageBlockIndex,
1163 GLuint shaderStorageBlockBinding)
1164 {
1165 if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding !=
1166 shaderStorageBlockBinding) {
1167
1168 FLUSH_VERTICES(ctx, 0);
1169 ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
1170
1171 shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
1172 shaderStorageBlockBinding;
1173 }
1174 }
1175
1176 void GLAPIENTRY
1177 _mesa_ShaderStorageBlockBinding_no_error(GLuint program,
1178 GLuint shaderStorageBlockIndex,
1179 GLuint shaderStorageBlockBinding)
1180 {
1181 GET_CURRENT_CONTEXT(ctx);
1182
1183 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program);
1184 shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex,
1185 shaderStorageBlockBinding);
1186 }
1187
1188 void GLAPIENTRY
1189 _mesa_ShaderStorageBlockBinding(GLuint program,
1190 GLuint shaderStorageBlockIndex,
1191 GLuint shaderStorageBlockBinding)
1192 {
1193 GET_CURRENT_CONTEXT(ctx);
1194 struct gl_shader_program *shProg;
1195
1196 if (!ctx->Extensions.ARB_shader_storage_buffer_object) {
1197 _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderStorageBlockBinding");
1198 return;
1199 }
1200
1201 shProg = _mesa_lookup_shader_program_err(ctx, program,
1202 "glShaderStorageBlockBinding");
1203 if (!shProg)
1204 return;
1205
1206 if (shaderStorageBlockIndex >= shProg->data->NumShaderStorageBlocks) {
1207 _mesa_error(ctx, GL_INVALID_VALUE,
1208 "glShaderStorageBlockBinding(block index %u >= %u)",
1209 shaderStorageBlockIndex,
1210 shProg->data->NumShaderStorageBlocks);
1211 return;
1212 }
1213
1214 if (shaderStorageBlockBinding >= ctx->Const.MaxShaderStorageBufferBindings) {
1215 _mesa_error(ctx, GL_INVALID_VALUE,
1216 "glShaderStorageBlockBinding(block binding %u >= %u)",
1217 shaderStorageBlockBinding,
1218 ctx->Const.MaxShaderStorageBufferBindings);
1219 return;
1220 }
1221
1222 shader_storage_block_binding(ctx, shProg, shaderStorageBlockIndex,
1223 shaderStorageBlockBinding);
1224 }
1225
1226 /**
1227 * Generic program resource property query.
1228 */
1229 static void
1230 mesa_bufferiv(struct gl_shader_program *shProg, GLenum type,
1231 GLuint index, GLenum pname, GLint *params, const char *caller)
1232 {
1233 GET_CURRENT_CONTEXT(ctx);
1234 struct gl_program_resource *res =
1235 _mesa_program_resource_find_index(shProg, type, index);
1236
1237 if (!res) {
1238 _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufferindex %d)", caller, index);
1239 return;
1240 }
1241
1242 switch (pname) {
1243 case GL_UNIFORM_BLOCK_BINDING:
1244 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1245 _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_BINDING,
1246 params, caller);
1247 return;
1248 case GL_UNIFORM_BLOCK_DATA_SIZE:
1249 case GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE:
1250 _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_DATA_SIZE,
1251 params, caller);
1252 return;
1253 case GL_UNIFORM_BLOCK_NAME_LENGTH:
1254 _mesa_program_resource_prop(shProg, res, index, GL_NAME_LENGTH,
1255 params, caller);
1256 return;
1257 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
1258 case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS:
1259 _mesa_program_resource_prop(shProg, res, index, GL_NUM_ACTIVE_VARIABLES,
1260 params, caller);
1261 return;
1262 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
1263 case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES:
1264 _mesa_program_resource_prop(shProg, res, index, GL_ACTIVE_VARIABLES,
1265 params, caller);
1266 return;
1267 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1268 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER:
1269 _mesa_program_resource_prop(shProg, res, index,
1270 GL_REFERENCED_BY_VERTEX_SHADER, params,
1271 caller);
1272 return;
1273
1274 case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER:
1275 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER:
1276 _mesa_program_resource_prop(shProg, res, index,
1277 GL_REFERENCED_BY_TESS_CONTROL_SHADER, params,
1278 caller);
1279 return;
1280
1281 case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER:
1282 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER:
1283 _mesa_program_resource_prop(shProg, res, index,
1284 GL_REFERENCED_BY_TESS_EVALUATION_SHADER, params,
1285 caller);
1286 return;
1287
1288 case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER:
1289 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER:
1290 _mesa_program_resource_prop(shProg, res, index,
1291 GL_REFERENCED_BY_GEOMETRY_SHADER, params,
1292 caller);
1293 return;
1294 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1295 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER:
1296 _mesa_program_resource_prop(shProg, res, index,
1297 GL_REFERENCED_BY_FRAGMENT_SHADER, params,
1298 caller);
1299 return;
1300 case GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER:
1301 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER:
1302 _mesa_program_resource_prop(shProg, res, index,
1303 GL_REFERENCED_BY_COMPUTE_SHADER, params,
1304 caller);
1305 return;
1306 default:
1307 _mesa_error(ctx, GL_INVALID_ENUM,
1308 "%s(pname 0x%x (%s))", caller, pname,
1309 _mesa_enum_to_string(pname));
1310 return;
1311 }
1312 }
1313
1314
1315 void GLAPIENTRY
1316 _mesa_GetActiveUniformBlockiv(GLuint program,
1317 GLuint uniformBlockIndex,
1318 GLenum pname,
1319 GLint *params)
1320 {
1321 GET_CURRENT_CONTEXT(ctx);
1322 struct gl_shader_program *shProg;
1323
1324 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1325 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1326 return;
1327 }
1328
1329 shProg = _mesa_lookup_shader_program_err(ctx, program,
1330 "glGetActiveUniformBlockiv");
1331 if (!shProg)
1332 return;
1333
1334 mesa_bufferiv(shProg, GL_UNIFORM_BLOCK, uniformBlockIndex, pname, params,
1335 "glGetActiveUniformBlockiv");
1336 }
1337
1338 void GLAPIENTRY
1339 _mesa_GetActiveUniformBlockName(GLuint program,
1340 GLuint uniformBlockIndex,
1341 GLsizei bufSize,
1342 GLsizei *length,
1343 GLchar *uniformBlockName)
1344 {
1345 GET_CURRENT_CONTEXT(ctx);
1346 struct gl_shader_program *shProg;
1347
1348 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1349 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1350 return;
1351 }
1352
1353 if (bufSize < 0) {
1354 _mesa_error(ctx, GL_INVALID_VALUE,
1355 "glGetActiveUniformBlockName(bufSize %d < 0)",
1356 bufSize);
1357 return;
1358 }
1359
1360 shProg = _mesa_lookup_shader_program_err(ctx, program,
1361 "glGetActiveUniformBlockiv");
1362 if (!shProg)
1363 return;
1364
1365 if (uniformBlockName)
1366 _mesa_get_program_resource_name(shProg, GL_UNIFORM_BLOCK,
1367 uniformBlockIndex, bufSize, length,
1368 uniformBlockName,
1369 "glGetActiveUniformBlockName");
1370 }
1371
1372 void GLAPIENTRY
1373 _mesa_GetActiveUniformName(GLuint program, GLuint uniformIndex,
1374 GLsizei bufSize, GLsizei *length,
1375 GLchar *uniformName)
1376 {
1377 GET_CURRENT_CONTEXT(ctx);
1378 struct gl_shader_program *shProg;
1379
1380 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1381 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformName");
1382 return;
1383 }
1384
1385 if (bufSize < 0) {
1386 _mesa_error(ctx, GL_INVALID_VALUE,
1387 "glGetActiveUniformName(bufSize %d < 0)",
1388 bufSize);
1389 return;
1390 }
1391
1392 shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniformName");
1393
1394 if (!shProg)
1395 return;
1396
1397 _mesa_get_program_resource_name(shProg, GL_UNIFORM, uniformIndex, bufSize,
1398 length, uniformName, "glGetActiveUniformName");
1399 }
1400
1401 void GLAPIENTRY
1402 _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
1403 GLenum pname, GLint *params)
1404 {
1405 GET_CURRENT_CONTEXT(ctx);
1406 struct gl_shader_program *shProg;
1407
1408 if (!ctx->Extensions.ARB_shader_atomic_counters) {
1409 _mesa_error(ctx, GL_INVALID_OPERATION,
1410 "glGetActiveAtomicCounterBufferiv");
1411 return;
1412 }
1413
1414 shProg = _mesa_lookup_shader_program_err(ctx, program,
1415 "glGetActiveAtomicCounterBufferiv");
1416 if (!shProg)
1417 return;
1418
1419 mesa_bufferiv(shProg, GL_ATOMIC_COUNTER_BUFFER, bufferIndex, pname, params,
1420 "glGetActiveAtomicCounterBufferiv");
1421 }
1422
1423 void GLAPIENTRY
1424 _mesa_Uniform1d(GLint location, GLdouble v0)
1425 {
1426 GET_CURRENT_CONTEXT(ctx);
1427 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 1);
1428 }
1429
1430 void GLAPIENTRY
1431 _mesa_Uniform2d(GLint location, GLdouble v0, GLdouble v1)
1432 {
1433 GET_CURRENT_CONTEXT(ctx);
1434 GLdouble v[2];
1435 v[0] = v0;
1436 v[1] = v1;
1437 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 2);
1438 }
1439
1440 void GLAPIENTRY
1441 _mesa_Uniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
1442 {
1443 GET_CURRENT_CONTEXT(ctx);
1444 GLdouble v[3];
1445 v[0] = v0;
1446 v[1] = v1;
1447 v[2] = v2;
1448 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 3);
1449 }
1450
1451 void GLAPIENTRY
1452 _mesa_Uniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2,
1453 GLdouble v3)
1454 {
1455 GET_CURRENT_CONTEXT(ctx);
1456 GLdouble v[4];
1457 v[0] = v0;
1458 v[1] = v1;
1459 v[2] = v2;
1460 v[3] = v3;
1461 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 4);
1462 }
1463
1464 void GLAPIENTRY
1465 _mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
1466 {
1467 GET_CURRENT_CONTEXT(ctx);
1468 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 1);
1469 }
1470
1471 void GLAPIENTRY
1472 _mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
1473 {
1474 GET_CURRENT_CONTEXT(ctx);
1475 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 2);
1476 }
1477
1478 void GLAPIENTRY
1479 _mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
1480 {
1481 GET_CURRENT_CONTEXT(ctx);
1482 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 3);
1483 }
1484
1485 void GLAPIENTRY
1486 _mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
1487 {
1488 GET_CURRENT_CONTEXT(ctx);
1489 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_DOUBLE, 4);
1490 }
1491
1492 void GLAPIENTRY
1493 _mesa_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
1494 const GLdouble * value)
1495 {
1496 GET_CURRENT_CONTEXT(ctx);
1497 _mesa_uniform_matrix(location, count, transpose, value,
1498 ctx, ctx->_Shader->ActiveProgram, 2, 2, GLSL_TYPE_DOUBLE);
1499 }
1500
1501 void GLAPIENTRY
1502 _mesa_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
1503 const GLdouble * value)
1504 {
1505 GET_CURRENT_CONTEXT(ctx);
1506 _mesa_uniform_matrix(location, count, transpose, value,
1507 ctx, ctx->_Shader->ActiveProgram, 3, 3, GLSL_TYPE_DOUBLE);
1508 }
1509
1510 void GLAPIENTRY
1511 _mesa_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
1512 const GLdouble * value)
1513 {
1514 GET_CURRENT_CONTEXT(ctx);
1515 _mesa_uniform_matrix(location, count, transpose, value,
1516 ctx, ctx->_Shader->ActiveProgram, 4, 4, GLSL_TYPE_DOUBLE);
1517 }
1518
1519 void GLAPIENTRY
1520 _mesa_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
1521 const GLdouble *value)
1522 {
1523 GET_CURRENT_CONTEXT(ctx);
1524 _mesa_uniform_matrix(location, count, transpose, value,
1525 ctx, ctx->_Shader->ActiveProgram, 2, 3, GLSL_TYPE_DOUBLE);
1526 }
1527
1528 void GLAPIENTRY
1529 _mesa_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
1530 const GLdouble *value)
1531 {
1532 GET_CURRENT_CONTEXT(ctx);
1533 _mesa_uniform_matrix(location, count, transpose, value,
1534 ctx, ctx->_Shader->ActiveProgram, 3, 2, GLSL_TYPE_DOUBLE);
1535 }
1536
1537 void GLAPIENTRY
1538 _mesa_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
1539 const GLdouble *value)
1540 {
1541 GET_CURRENT_CONTEXT(ctx);
1542 _mesa_uniform_matrix(location, count, transpose, value,
1543 ctx, ctx->_Shader->ActiveProgram, 2, 4, GLSL_TYPE_DOUBLE);
1544 }
1545
1546 void GLAPIENTRY
1547 _mesa_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
1548 const GLdouble *value)
1549 {
1550 GET_CURRENT_CONTEXT(ctx);
1551 _mesa_uniform_matrix(location, count, transpose, value,
1552 ctx, ctx->_Shader->ActiveProgram, 4, 2, GLSL_TYPE_DOUBLE);
1553 }
1554
1555 void GLAPIENTRY
1556 _mesa_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
1557 const GLdouble *value)
1558 {
1559 GET_CURRENT_CONTEXT(ctx);
1560 _mesa_uniform_matrix(location, count, transpose, value,
1561 ctx, ctx->_Shader->ActiveProgram, 3, 4, GLSL_TYPE_DOUBLE);
1562 }
1563
1564 void GLAPIENTRY
1565 _mesa_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
1566 const GLdouble *value)
1567 {
1568 GET_CURRENT_CONTEXT(ctx);
1569 _mesa_uniform_matrix(location, count, transpose, value,
1570 ctx, ctx->_Shader->ActiveProgram, 4, 3, GLSL_TYPE_DOUBLE);
1571 }
1572
1573 void GLAPIENTRY
1574 _mesa_ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
1575 {
1576 GET_CURRENT_CONTEXT(ctx);
1577 struct gl_shader_program *shProg =
1578 _mesa_lookup_shader_program_err(ctx, program,
1579 "glProgramUniform1d");
1580 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_DOUBLE, 1);
1581 }
1582
1583 void GLAPIENTRY
1584 _mesa_ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
1585 {
1586 GET_CURRENT_CONTEXT(ctx);
1587 GLdouble v[2];
1588 struct gl_shader_program *shProg;
1589 v[0] = v0;
1590 v[1] = v1;
1591 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2d");
1592 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 2);
1593 }
1594
1595 void GLAPIENTRY
1596 _mesa_ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1597 GLdouble v2)
1598 {
1599 GET_CURRENT_CONTEXT(ctx);
1600 GLdouble v[3];
1601 struct gl_shader_program *shProg;
1602 v[0] = v0;
1603 v[1] = v1;
1604 v[2] = v2;
1605 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3d");
1606 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 3);
1607 }
1608
1609 void GLAPIENTRY
1610 _mesa_ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1611 GLdouble v2, GLdouble v3)
1612 {
1613 GET_CURRENT_CONTEXT(ctx);
1614 GLdouble v[4];
1615 struct gl_shader_program *shProg;
1616 v[0] = v0;
1617 v[1] = v1;
1618 v[2] = v2;
1619 v[3] = v3;
1620 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4d");
1621 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_DOUBLE, 4);
1622 }
1623
1624 void GLAPIENTRY
1625 _mesa_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
1626 const GLdouble * value)
1627 {
1628 GET_CURRENT_CONTEXT(ctx);
1629 struct gl_shader_program *shProg =
1630 _mesa_lookup_shader_program_err(ctx, program,
1631 "glProgramUniform1dv");
1632 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 1);
1633 }
1634
1635 void GLAPIENTRY
1636 _mesa_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
1637 const GLdouble * value)
1638 {
1639 GET_CURRENT_CONTEXT(ctx);
1640 struct gl_shader_program *shProg =
1641 _mesa_lookup_shader_program_err(ctx, program,
1642 "glProgramUniform2dv");
1643 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 2);
1644 }
1645
1646 void GLAPIENTRY
1647 _mesa_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
1648 const GLdouble * value)
1649 {
1650 GET_CURRENT_CONTEXT(ctx);
1651 struct gl_shader_program *shProg =
1652 _mesa_lookup_shader_program_err(ctx, program,
1653 "glProgramUniform3dv");
1654 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 3);
1655 }
1656
1657 void GLAPIENTRY
1658 _mesa_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
1659 const GLdouble * value)
1660 {
1661 GET_CURRENT_CONTEXT(ctx);
1662 struct gl_shader_program *shProg =
1663 _mesa_lookup_shader_program_err(ctx, program,
1664 "glProgramUniform4dv");
1665 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_DOUBLE, 4);
1666 }
1667
1668 void GLAPIENTRY
1669 _mesa_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
1670 GLboolean transpose, const GLdouble * value)
1671 {
1672 GET_CURRENT_CONTEXT(ctx);
1673 struct gl_shader_program *shProg =
1674 _mesa_lookup_shader_program_err(ctx, program,
1675 "glProgramUniformMatrix2dv");
1676 _mesa_uniform_matrix(location, count, transpose, value,
1677 ctx, shProg, 2, 2, GLSL_TYPE_DOUBLE);
1678 }
1679
1680 void GLAPIENTRY
1681 _mesa_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
1682 GLboolean transpose, const GLdouble * value)
1683 {
1684 GET_CURRENT_CONTEXT(ctx);
1685 struct gl_shader_program *shProg =
1686 _mesa_lookup_shader_program_err(ctx, program,
1687 "glProgramUniformMatrix3dv");
1688 _mesa_uniform_matrix(location, count, transpose, value,
1689 ctx, shProg, 3, 3, GLSL_TYPE_DOUBLE);
1690 }
1691
1692 void GLAPIENTRY
1693 _mesa_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
1694 GLboolean transpose, const GLdouble * value)
1695 {
1696 GET_CURRENT_CONTEXT(ctx);
1697 struct gl_shader_program *shProg =
1698 _mesa_lookup_shader_program_err(ctx, program,
1699 "glProgramUniformMatrix4dv");
1700 _mesa_uniform_matrix(location, count, transpose, value,
1701 ctx, shProg, 4, 4, GLSL_TYPE_DOUBLE);
1702 }
1703
1704 void GLAPIENTRY
1705 _mesa_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
1706 GLboolean transpose, const GLdouble * value)
1707 {
1708 GET_CURRENT_CONTEXT(ctx);
1709 struct gl_shader_program *shProg =
1710 _mesa_lookup_shader_program_err(ctx, program,
1711 "glProgramUniformMatrix2x3dv");
1712 _mesa_uniform_matrix(location, count, transpose, value,
1713 ctx, shProg, 2, 3, GLSL_TYPE_DOUBLE);
1714 }
1715
1716 void GLAPIENTRY
1717 _mesa_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
1718 GLboolean transpose, const GLdouble * value)
1719 {
1720 GET_CURRENT_CONTEXT(ctx);
1721 struct gl_shader_program *shProg =
1722 _mesa_lookup_shader_program_err(ctx, program,
1723 "glProgramUniformMatrix3x2dv");
1724 _mesa_uniform_matrix(location, count, transpose, value,
1725 ctx, shProg, 3, 2, GLSL_TYPE_DOUBLE);
1726 }
1727
1728 void GLAPIENTRY
1729 _mesa_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
1730 GLboolean transpose, const GLdouble * value)
1731 {
1732 GET_CURRENT_CONTEXT(ctx);
1733 struct gl_shader_program *shProg =
1734 _mesa_lookup_shader_program_err(ctx, program,
1735 "glProgramUniformMatrix2x4dv");
1736 _mesa_uniform_matrix(location, count, transpose, value,
1737 ctx, shProg, 2, 4, GLSL_TYPE_DOUBLE);
1738 }
1739
1740 void GLAPIENTRY
1741 _mesa_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
1742 GLboolean transpose, const GLdouble * value)
1743 {
1744 GET_CURRENT_CONTEXT(ctx);
1745 struct gl_shader_program *shProg =
1746 _mesa_lookup_shader_program_err(ctx, program,
1747 "glProgramUniformMatrix4x2dv");
1748 _mesa_uniform_matrix(location, count, transpose, value,
1749 ctx, shProg, 4, 2, GLSL_TYPE_DOUBLE);
1750 }
1751
1752 void GLAPIENTRY
1753 _mesa_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
1754 GLboolean transpose, const GLdouble * value)
1755 {
1756 GET_CURRENT_CONTEXT(ctx);
1757 struct gl_shader_program *shProg =
1758 _mesa_lookup_shader_program_err(ctx, program,
1759 "glProgramUniformMatrix3x4dv");
1760 _mesa_uniform_matrix(location, count, transpose, value,
1761 ctx, shProg, 3, 4, GLSL_TYPE_DOUBLE);
1762 }
1763
1764 void GLAPIENTRY
1765 _mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
1766 GLboolean transpose, const GLdouble * value)
1767 {
1768 GET_CURRENT_CONTEXT(ctx);
1769 struct gl_shader_program *shProg =
1770 _mesa_lookup_shader_program_err(ctx, program,
1771 "glProgramUniformMatrix4x3dv");
1772 _mesa_uniform_matrix(location, count, transpose, value,
1773 ctx, shProg, 4, 3, GLSL_TYPE_DOUBLE);
1774 }
1775
1776 void GLAPIENTRY
1777 _mesa_Uniform1i64ARB(GLint location, GLint64 v0)
1778 {
1779 GET_CURRENT_CONTEXT(ctx);
1780 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 1);
1781 }
1782
1783 void GLAPIENTRY
1784 _mesa_Uniform2i64ARB(GLint location, GLint64 v0, GLint64 v1)
1785 {
1786 GET_CURRENT_CONTEXT(ctx);
1787 int64_t v[2];
1788 v[0] = v0;
1789 v[1] = v1;
1790 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 2);
1791 }
1792
1793 void GLAPIENTRY
1794 _mesa_Uniform3i64ARB(GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
1795 {
1796 GET_CURRENT_CONTEXT(ctx);
1797 int64_t v[3];
1798 v[0] = v0;
1799 v[1] = v1;
1800 v[2] = v2;
1801 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 3);
1802 }
1803
1804 void GLAPIENTRY
1805 _mesa_Uniform4i64ARB(GLint location, GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
1806 {
1807 GET_CURRENT_CONTEXT(ctx);
1808 int64_t v[4];
1809 v[0] = v0;
1810 v[1] = v1;
1811 v[2] = v2;
1812 v[3] = v3;
1813 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 4);
1814 }
1815
1816 void GLAPIENTRY
1817 _mesa_Uniform1i64vARB(GLint location, GLsizei count, const GLint64 *value)
1818 {
1819 GET_CURRENT_CONTEXT(ctx);
1820 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 1);
1821 }
1822
1823 void GLAPIENTRY
1824 _mesa_Uniform2i64vARB(GLint location, GLsizei count, const GLint64 *value)
1825 {
1826 GET_CURRENT_CONTEXT(ctx);
1827 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 2);
1828 }
1829
1830 void GLAPIENTRY
1831 _mesa_Uniform3i64vARB(GLint location, GLsizei count, const GLint64 *value)
1832 {
1833 GET_CURRENT_CONTEXT(ctx);
1834 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 3);
1835 }
1836
1837 void GLAPIENTRY
1838 _mesa_Uniform4i64vARB(GLint location, GLsizei count, const GLint64 *value)
1839 {
1840 GET_CURRENT_CONTEXT(ctx);
1841 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_INT64, 4);
1842 }
1843
1844 void GLAPIENTRY
1845 _mesa_Uniform1ui64ARB(GLint location, GLuint64 v0)
1846 {
1847 GET_CURRENT_CONTEXT(ctx);
1848 _mesa_uniform(location, 1, &v0, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 1);
1849 }
1850
1851 void GLAPIENTRY
1852 _mesa_Uniform2ui64ARB(GLint location, GLuint64 v0, GLuint64 v1)
1853 {
1854 GET_CURRENT_CONTEXT(ctx);
1855 uint64_t v[2];
1856 v[0] = v0;
1857 v[1] = v1;
1858 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 2);
1859 }
1860
1861 void GLAPIENTRY
1862 _mesa_Uniform3ui64ARB(GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
1863 {
1864 GET_CURRENT_CONTEXT(ctx);
1865 uint64_t v[3];
1866 v[0] = v0;
1867 v[1] = v1;
1868 v[2] = v2;
1869 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 3);
1870 }
1871
1872 void GLAPIENTRY
1873 _mesa_Uniform4ui64ARB(GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
1874 {
1875 GET_CURRENT_CONTEXT(ctx);
1876 uint64_t v[4];
1877 v[0] = v0;
1878 v[1] = v1;
1879 v[2] = v2;
1880 v[3] = v3;
1881 _mesa_uniform(location, 1, v, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 4);
1882 }
1883
1884 void GLAPIENTRY
1885 _mesa_Uniform1ui64vARB(GLint location, GLsizei count, const GLuint64 *value)
1886 {
1887 GET_CURRENT_CONTEXT(ctx);
1888 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 1);
1889 }
1890
1891 void GLAPIENTRY
1892 _mesa_Uniform2ui64vARB(GLint location, GLsizei count, const GLuint64 *value)
1893 {
1894 GET_CURRENT_CONTEXT(ctx);
1895 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 2);
1896 }
1897
1898 void GLAPIENTRY
1899 _mesa_Uniform3ui64vARB(GLint location, GLsizei count, const GLuint64 *value)
1900 {
1901 GET_CURRENT_CONTEXT(ctx);
1902 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 3);
1903 }
1904
1905 void GLAPIENTRY
1906 _mesa_Uniform4ui64vARB(GLint location, GLsizei count, const GLuint64 *value)
1907 {
1908 GET_CURRENT_CONTEXT(ctx);
1909 _mesa_uniform(location, count, value, ctx, ctx->_Shader->ActiveProgram, GLSL_TYPE_UINT64, 4);
1910 }
1911
1912 /* DSA entrypoints */
1913 void GLAPIENTRY
1914 _mesa_ProgramUniform1i64ARB(GLuint program, GLint location, GLint64 v0)
1915 {
1916 GET_CURRENT_CONTEXT(ctx);
1917 struct gl_shader_program *shProg =
1918 _mesa_lookup_shader_program_err(ctx, program,
1919 "glProgramUniform1i64ARB");
1920 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_INT64, 1);
1921 }
1922
1923 void GLAPIENTRY
1924 _mesa_ProgramUniform2i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1)
1925 {
1926 GET_CURRENT_CONTEXT(ctx);
1927 struct gl_shader_program *shProg =
1928 _mesa_lookup_shader_program_err(ctx, program,
1929 "glProgramUniform2i64ARB");
1930 int64_t v[2];
1931 v[0] = v0;
1932 v[1] = v1;
1933 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 2);
1934 }
1935
1936 void GLAPIENTRY
1937 _mesa_ProgramUniform3i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
1938 {
1939 GET_CURRENT_CONTEXT(ctx);
1940 struct gl_shader_program *shProg =
1941 _mesa_lookup_shader_program_err(ctx, program,
1942 "glProgramUniform3i64ARB");
1943 int64_t v[3];
1944 v[0] = v0;
1945 v[1] = v1;
1946 v[2] = v2;
1947 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 3);
1948 }
1949
1950 void GLAPIENTRY
1951 _mesa_ProgramUniform4i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
1952 {
1953 GET_CURRENT_CONTEXT(ctx);
1954 struct gl_shader_program *shProg =
1955 _mesa_lookup_shader_program_err(ctx, program,
1956 "glProgramUniform4i64ARB");
1957 int64_t v[4];
1958 v[0] = v0;
1959 v[1] = v1;
1960 v[2] = v2;
1961 v[3] = v3;
1962 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_INT64, 4);
1963 }
1964
1965 void GLAPIENTRY
1966 _mesa_ProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
1967 {
1968 GET_CURRENT_CONTEXT(ctx);
1969 struct gl_shader_program *shProg =
1970 _mesa_lookup_shader_program_err(ctx, program,
1971 "glProgramUniform1i64vARB");
1972 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 1);
1973 }
1974
1975 void GLAPIENTRY
1976 _mesa_ProgramUniform2i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
1977 {
1978 GET_CURRENT_CONTEXT(ctx);
1979 struct gl_shader_program *shProg =
1980 _mesa_lookup_shader_program_err(ctx, program,
1981 "glProgramUniform2i64vARB");
1982 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 2);
1983 }
1984
1985 void GLAPIENTRY
1986 _mesa_ProgramUniform3i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
1987 {
1988 GET_CURRENT_CONTEXT(ctx);
1989 struct gl_shader_program *shProg =
1990 _mesa_lookup_shader_program_err(ctx, program,
1991 "glProgramUniform3i64vARB");
1992 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 3);
1993 }
1994
1995 void GLAPIENTRY
1996 _mesa_ProgramUniform4i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
1997 {
1998 GET_CURRENT_CONTEXT(ctx);
1999 struct gl_shader_program *shProg =
2000 _mesa_lookup_shader_program_err(ctx, program,
2001 "glProgramUniform4i64vARB");
2002 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_INT64, 4);
2003 }
2004
2005 void GLAPIENTRY
2006 _mesa_ProgramUniform1ui64ARB(GLuint program, GLint location, GLuint64 v0)
2007 {
2008 GET_CURRENT_CONTEXT(ctx);
2009 struct gl_shader_program *shProg =
2010 _mesa_lookup_shader_program_err(ctx, program,
2011 "glProgramUniform1ui64ARB");
2012 _mesa_uniform(location, 1, &v0, ctx, shProg, GLSL_TYPE_UINT64, 1);
2013 }
2014
2015 void GLAPIENTRY
2016 _mesa_ProgramUniform2ui64ARB(GLuint program, GLint location, GLuint64 v0, GLuint64 v1)
2017 {
2018 GET_CURRENT_CONTEXT(ctx);
2019 struct gl_shader_program *shProg =
2020 _mesa_lookup_shader_program_err(ctx, program,
2021 "glProgramUniform2ui64ARB");
2022 uint64_t v[2];
2023 v[0] = v0;
2024 v[1] = v1;
2025 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 2);
2026 }
2027
2028 void GLAPIENTRY
2029 _mesa_ProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
2030 {
2031 GET_CURRENT_CONTEXT(ctx);
2032 struct gl_shader_program *shProg =
2033 _mesa_lookup_shader_program_err(ctx, program,
2034 "glProgramUniform3ui64ARB");
2035 uint64_t v[3];
2036 v[0] = v0;
2037 v[1] = v1;
2038 v[2] = v2;
2039 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 3);
2040 }
2041
2042 void GLAPIENTRY
2043 _mesa_ProgramUniform4ui64ARB(GLuint program, GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
2044 {
2045 GET_CURRENT_CONTEXT(ctx);
2046 struct gl_shader_program *shProg =
2047 _mesa_lookup_shader_program_err(ctx, program,
2048 "glProgramUniform4ui64ARB");
2049 uint64_t v[4];
2050 v[0] = v0;
2051 v[1] = v1;
2052 v[2] = v2;
2053 v[3] = v3;
2054 _mesa_uniform(location, 1, v, ctx, shProg, GLSL_TYPE_UINT64, 4);
2055 }
2056
2057 void GLAPIENTRY
2058 _mesa_ProgramUniform1ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64 *value)
2059 {
2060 GET_CURRENT_CONTEXT(ctx);
2061 struct gl_shader_program *shProg =
2062 _mesa_lookup_shader_program_err(ctx, program,
2063 "glProgramUniform1ui64vARB");
2064 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 1);
2065 }
2066
2067 void GLAPIENTRY
2068 _mesa_ProgramUniform2ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64 *value)
2069 {
2070 GET_CURRENT_CONTEXT(ctx);
2071 struct gl_shader_program *shProg =
2072 _mesa_lookup_shader_program_err(ctx, program,
2073 "glProgramUniform2ui64vARB");
2074 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 2);
2075 }
2076
2077 void GLAPIENTRY
2078 _mesa_ProgramUniform3ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64 *value)
2079 {
2080 GET_CURRENT_CONTEXT(ctx);
2081 struct gl_shader_program *shProg =
2082 _mesa_lookup_shader_program_err(ctx, program,
2083 "glProgramUniform3ui64vARB");
2084 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 3);
2085 }
2086
2087 void GLAPIENTRY
2088 _mesa_ProgramUniform4ui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64 *value)
2089 {
2090 GET_CURRENT_CONTEXT(ctx);
2091 struct gl_shader_program *shProg =
2092 _mesa_lookup_shader_program_err(ctx, program,
2093 "glProgramUniform4ui64vARB");
2094 _mesa_uniform(location, count, value, ctx, shProg, GLSL_TYPE_UINT64, 4);
2095 }