st/mesa/glsl: move SamplerTargets to gl_program
[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 void
67 _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
68 struct gl_program *prog)
69 {
70 GLbitfield mask = prog->SamplersUsed;
71 struct gl_linked_shader *shader =
72 shProg->_LinkedShaders[_mesa_program_enum_to_shader_stage(prog->Target)];
73
74 assert(shader);
75
76 memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
77
78 shProg->SamplersValidated = GL_TRUE;
79
80 while (mask) {
81 const int s = u_bit_scan(&mask);
82 GLuint unit = prog->SamplerUnits[s];
83 GLuint tgt = prog->sh.SamplerTargets[s];
84 assert(unit < ARRAY_SIZE(prog->TexturesUsed));
85 assert(tgt < NUM_TEXTURE_TARGETS);
86
87 /* The types of the samplers associated with a particular texture
88 * unit must be an exact match. Page 74 (page 89 of the PDF) of the
89 * OpenGL 3.3 core spec says:
90 *
91 * "It is not allowed to have variables of different sampler
92 * types pointing to the same texture image unit within a program
93 * object."
94 */
95 if (prog->TexturesUsed[unit] & ~(1 << tgt))
96 shProg->SamplersValidated = GL_FALSE;
97
98 prog->TexturesUsed[unit] |= (1 << tgt);
99 }
100 }
101
102 /**
103 * Connect a piece of driver storage with a part of a uniform
104 *
105 * \param uni The uniform with which the storage will be associated
106 * \param element_stride Byte-stride between array elements.
107 * \sa gl_uniform_driver_storage::element_stride.
108 * \param vector_stride Byte-stride between vectors (in a matrix).
109 * \sa gl_uniform_driver_storage::vector_stride.
110 * \param format Conversion from native format to driver format
111 * required by the driver.
112 * \param data Location to dump the data.
113 */
114 void
115 _mesa_uniform_attach_driver_storage(struct gl_uniform_storage *uni,
116 unsigned element_stride,
117 unsigned vector_stride,
118 enum gl_uniform_driver_format format,
119 void *data)
120 {
121 uni->driver_storage =
122 realloc(uni->driver_storage,
123 sizeof(struct gl_uniform_driver_storage)
124 * (uni->num_driver_storage + 1));
125
126 uni->driver_storage[uni->num_driver_storage].element_stride = element_stride;
127 uni->driver_storage[uni->num_driver_storage].vector_stride = vector_stride;
128 uni->driver_storage[uni->num_driver_storage].format = format;
129 uni->driver_storage[uni->num_driver_storage].data = data;
130
131 uni->num_driver_storage++;
132 }
133
134 /**
135 * Sever all connections with all pieces of driver storage for all uniforms
136 *
137 * \warning
138 * This function does \b not release any of the \c data pointers
139 * previously passed in to \c _mesa_uniform_attach_driver_stoarge.
140 */
141 void
142 _mesa_uniform_detach_all_driver_storage(struct gl_uniform_storage *uni)
143 {
144 free(uni->driver_storage);
145 uni->driver_storage = NULL;
146 uni->num_driver_storage = 0;
147 }
148
149 void GLAPIENTRY
150 _mesa_Uniform1f(GLint location, GLfloat v0)
151 {
152 GET_CURRENT_CONTEXT(ctx);
153 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_FLOAT, 1);
154 }
155
156 void GLAPIENTRY
157 _mesa_Uniform2f(GLint location, GLfloat v0, GLfloat v1)
158 {
159 GET_CURRENT_CONTEXT(ctx);
160 GLfloat v[2];
161 v[0] = v0;
162 v[1] = v1;
163 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_FLOAT, 2);
164 }
165
166 void GLAPIENTRY
167 _mesa_Uniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
168 {
169 GET_CURRENT_CONTEXT(ctx);
170 GLfloat v[3];
171 v[0] = v0;
172 v[1] = v1;
173 v[2] = v2;
174 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_FLOAT, 3);
175 }
176
177 void GLAPIENTRY
178 _mesa_Uniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
179 GLfloat v3)
180 {
181 GET_CURRENT_CONTEXT(ctx);
182 GLfloat v[4];
183 v[0] = v0;
184 v[1] = v1;
185 v[2] = v2;
186 v[3] = v3;
187 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_FLOAT, 4);
188 }
189
190 void GLAPIENTRY
191 _mesa_Uniform1i(GLint location, GLint v0)
192 {
193 GET_CURRENT_CONTEXT(ctx);
194 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_INT, 1);
195 }
196
197 void GLAPIENTRY
198 _mesa_Uniform2i(GLint location, GLint v0, GLint v1)
199 {
200 GET_CURRENT_CONTEXT(ctx);
201 GLint v[2];
202 v[0] = v0;
203 v[1] = v1;
204 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_INT, 2);
205 }
206
207 void GLAPIENTRY
208 _mesa_Uniform3i(GLint location, GLint v0, GLint v1, GLint v2)
209 {
210 GET_CURRENT_CONTEXT(ctx);
211 GLint v[3];
212 v[0] = v0;
213 v[1] = v1;
214 v[2] = v2;
215 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_INT, 3);
216 }
217
218 void GLAPIENTRY
219 _mesa_Uniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
220 {
221 GET_CURRENT_CONTEXT(ctx);
222 GLint v[4];
223 v[0] = v0;
224 v[1] = v1;
225 v[2] = v2;
226 v[3] = v3;
227 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_INT, 4);
228 }
229
230 void GLAPIENTRY
231 _mesa_Uniform1fv(GLint location, GLsizei count, const GLfloat * value)
232 {
233 GET_CURRENT_CONTEXT(ctx);
234 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_FLOAT, 1);
235 }
236
237 void GLAPIENTRY
238 _mesa_Uniform2fv(GLint location, GLsizei count, const GLfloat * value)
239 {
240 GET_CURRENT_CONTEXT(ctx);
241 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_FLOAT, 2);
242 }
243
244 void GLAPIENTRY
245 _mesa_Uniform3fv(GLint location, GLsizei count, const GLfloat * value)
246 {
247 GET_CURRENT_CONTEXT(ctx);
248 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_FLOAT, 3);
249 }
250
251 void GLAPIENTRY
252 _mesa_Uniform4fv(GLint location, GLsizei count, const GLfloat * value)
253 {
254 GET_CURRENT_CONTEXT(ctx);
255 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_FLOAT, 4);
256 }
257
258 void GLAPIENTRY
259 _mesa_Uniform1iv(GLint location, GLsizei count, const GLint * value)
260 {
261 GET_CURRENT_CONTEXT(ctx);
262 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_INT, 1);
263 }
264
265 void GLAPIENTRY
266 _mesa_Uniform2iv(GLint location, GLsizei count, const GLint * value)
267 {
268 GET_CURRENT_CONTEXT(ctx);
269 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_INT, 2);
270 }
271
272 void GLAPIENTRY
273 _mesa_Uniform3iv(GLint location, GLsizei count, const GLint * value)
274 {
275 GET_CURRENT_CONTEXT(ctx);
276 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_INT, 3);
277 }
278
279 void GLAPIENTRY
280 _mesa_Uniform4iv(GLint location, GLsizei count, const GLint * value)
281 {
282 GET_CURRENT_CONTEXT(ctx);
283 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_INT, 4);
284 }
285
286 /** Same as above with direct state access **/
287 void GLAPIENTRY
288 _mesa_ProgramUniform1f(GLuint program, GLint location, GLfloat v0)
289 {
290 GET_CURRENT_CONTEXT(ctx);
291 struct gl_shader_program *shProg =
292 _mesa_lookup_shader_program_err(ctx, program,
293 "glProgramUniform1f");
294 _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_FLOAT, 1);
295 }
296
297 void GLAPIENTRY
298 _mesa_ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1)
299 {
300 GET_CURRENT_CONTEXT(ctx);
301 GLfloat v[2];
302 struct gl_shader_program *shProg;
303 v[0] = v0;
304 v[1] = v1;
305 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2f");
306 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_FLOAT, 2);
307 }
308
309 void GLAPIENTRY
310 _mesa_ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
311 GLfloat v2)
312 {
313 GET_CURRENT_CONTEXT(ctx);
314 GLfloat v[3];
315 struct gl_shader_program *shProg;
316 v[0] = v0;
317 v[1] = v1;
318 v[2] = v2;
319 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3f");
320 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_FLOAT, 3);
321 }
322
323 void GLAPIENTRY
324 _mesa_ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1,
325 GLfloat v2, GLfloat v3)
326 {
327 GET_CURRENT_CONTEXT(ctx);
328 GLfloat v[4];
329 struct gl_shader_program *shProg;
330 v[0] = v0;
331 v[1] = v1;
332 v[2] = v2;
333 v[3] = v3;
334 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4f");
335 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_FLOAT, 4);
336 }
337
338 void GLAPIENTRY
339 _mesa_ProgramUniform1i(GLuint program, GLint location, GLint v0)
340 {
341 GET_CURRENT_CONTEXT(ctx);
342 struct gl_shader_program *shProg =
343 _mesa_lookup_shader_program_err(ctx, program,
344 "glProgramUniform1i");
345 _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_INT, 1);
346 }
347
348 void GLAPIENTRY
349 _mesa_ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1)
350 {
351 GET_CURRENT_CONTEXT(ctx);
352 GLint v[2];
353 struct gl_shader_program *shProg;
354 v[0] = v0;
355 v[1] = v1;
356 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2i");
357 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT, 2);
358 }
359
360 void GLAPIENTRY
361 _mesa_ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1,
362 GLint v2)
363 {
364 GET_CURRENT_CONTEXT(ctx);
365 GLint v[3];
366 struct gl_shader_program *shProg;
367 v[0] = v0;
368 v[1] = v1;
369 v[2] = v2;
370 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3i");
371 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT, 3);
372 }
373
374 void GLAPIENTRY
375 _mesa_ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1,
376 GLint v2, GLint v3)
377 {
378 GET_CURRENT_CONTEXT(ctx);
379 GLint v[4];
380 struct gl_shader_program *shProg;
381 v[0] = v0;
382 v[1] = v1;
383 v[2] = v2;
384 v[3] = v3;
385 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4i");
386 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT, 4);
387 }
388
389 void GLAPIENTRY
390 _mesa_ProgramUniform1fv(GLuint program, GLint location, GLsizei count,
391 const GLfloat * value)
392 {
393 GET_CURRENT_CONTEXT(ctx);
394 struct gl_shader_program *shProg =
395 _mesa_lookup_shader_program_err(ctx, program,
396 "glProgramUniform1fv");
397 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_FLOAT, 1);
398 }
399
400 void GLAPIENTRY
401 _mesa_ProgramUniform2fv(GLuint program, GLint location, GLsizei count,
402 const GLfloat * value)
403 {
404 GET_CURRENT_CONTEXT(ctx);
405 struct gl_shader_program *shProg =
406 _mesa_lookup_shader_program_err(ctx, program,
407 "glProgramUniform2fv");
408 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_FLOAT, 2);
409 }
410
411 void GLAPIENTRY
412 _mesa_ProgramUniform3fv(GLuint program, GLint location, GLsizei count,
413 const GLfloat * value)
414 {
415 GET_CURRENT_CONTEXT(ctx);
416 struct gl_shader_program *shProg =
417 _mesa_lookup_shader_program_err(ctx, program,
418 "glProgramUniform3fv");
419 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_FLOAT, 3);
420 }
421
422 void GLAPIENTRY
423 _mesa_ProgramUniform4fv(GLuint program, GLint location, GLsizei count,
424 const GLfloat * value)
425 {
426 GET_CURRENT_CONTEXT(ctx);
427 struct gl_shader_program *shProg =
428 _mesa_lookup_shader_program_err(ctx, program,
429 "glProgramUniform4fv");
430 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_FLOAT, 4);
431 }
432
433 void GLAPIENTRY
434 _mesa_ProgramUniform1iv(GLuint program, GLint location, GLsizei count,
435 const GLint * value)
436 {
437 GET_CURRENT_CONTEXT(ctx);
438 struct gl_shader_program *shProg =
439 _mesa_lookup_shader_program_err(ctx, program,
440 "glProgramUniform1iv");
441 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_INT, 1);
442 }
443
444 void GLAPIENTRY
445 _mesa_ProgramUniform2iv(GLuint program, GLint location, GLsizei count,
446 const GLint * value)
447 {
448 GET_CURRENT_CONTEXT(ctx);
449 struct gl_shader_program *shProg =
450 _mesa_lookup_shader_program_err(ctx, program,
451 "glProgramUniform2iv");
452 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_INT, 2);
453 }
454
455 void GLAPIENTRY
456 _mesa_ProgramUniform3iv(GLuint program, GLint location, GLsizei count,
457 const GLint * value)
458 {
459 GET_CURRENT_CONTEXT(ctx);
460 struct gl_shader_program *shProg =
461 _mesa_lookup_shader_program_err(ctx, program,
462 "glProgramUniform3iv");
463 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_INT, 3);
464 }
465
466 void GLAPIENTRY
467 _mesa_ProgramUniform4iv(GLuint program, GLint location, GLsizei count,
468 const GLint * value)
469 {
470 GET_CURRENT_CONTEXT(ctx);
471 struct gl_shader_program *shProg =
472 _mesa_lookup_shader_program_err(ctx, program,
473 "glProgramUniform4iv");
474 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_INT, 4);
475 }
476
477
478 /** OpenGL 3.0 GLuint-valued functions **/
479 void GLAPIENTRY
480 _mesa_Uniform1ui(GLint location, GLuint v0)
481 {
482 GET_CURRENT_CONTEXT(ctx);
483 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_UINT, 1);
484 }
485
486 void GLAPIENTRY
487 _mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1)
488 {
489 GET_CURRENT_CONTEXT(ctx);
490 GLuint v[2];
491 v[0] = v0;
492 v[1] = v1;
493 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_UINT, 2);
494 }
495
496 void GLAPIENTRY
497 _mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
498 {
499 GET_CURRENT_CONTEXT(ctx);
500 GLuint v[3];
501 v[0] = v0;
502 v[1] = v1;
503 v[2] = v2;
504 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_UINT, 3);
505 }
506
507 void GLAPIENTRY
508 _mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
509 {
510 GET_CURRENT_CONTEXT(ctx);
511 GLuint v[4];
512 v[0] = v0;
513 v[1] = v1;
514 v[2] = v2;
515 v[3] = v3;
516 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_UINT, 4);
517 }
518
519 void GLAPIENTRY
520 _mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
521 {
522 GET_CURRENT_CONTEXT(ctx);
523 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_UINT, 1);
524 }
525
526 void GLAPIENTRY
527 _mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
528 {
529 GET_CURRENT_CONTEXT(ctx);
530 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_UINT, 2);
531 }
532
533 void GLAPIENTRY
534 _mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
535 {
536 GET_CURRENT_CONTEXT(ctx);
537 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_UINT, 3);
538 }
539
540 void GLAPIENTRY
541 _mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
542 {
543 GET_CURRENT_CONTEXT(ctx);
544 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_UINT, 4);
545 }
546
547
548
549 void GLAPIENTRY
550 _mesa_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
551 const GLfloat * value)
552 {
553 GET_CURRENT_CONTEXT(ctx);
554 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
555 2, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
556 }
557
558 void GLAPIENTRY
559 _mesa_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
560 const GLfloat * value)
561 {
562 GET_CURRENT_CONTEXT(ctx);
563 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
564 3, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
565 }
566
567 void GLAPIENTRY
568 _mesa_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
569 const GLfloat * value)
570 {
571 GET_CURRENT_CONTEXT(ctx);
572 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
573 4, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
574 }
575
576 /** Same as above with direct state access **/
577
578 void GLAPIENTRY
579 _mesa_ProgramUniform1ui(GLuint program, GLint location, GLuint v0)
580 {
581 GET_CURRENT_CONTEXT(ctx);
582 struct gl_shader_program *shProg =
583 _mesa_lookup_shader_program_err(ctx, program,
584 "glProgramUniform1ui");
585 _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_UINT, 1);
586 }
587
588 void GLAPIENTRY
589 _mesa_ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1)
590 {
591 GET_CURRENT_CONTEXT(ctx);
592 GLuint v[2];
593 struct gl_shader_program *shProg;
594 v[0] = v0;
595 v[1] = v1;
596 shProg = _mesa_lookup_shader_program_err(ctx, program,
597 "glProgramUniform2ui");
598 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT, 2);
599 }
600
601 void GLAPIENTRY
602 _mesa_ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1,
603 GLuint v2)
604 {
605 GET_CURRENT_CONTEXT(ctx);
606 GLuint v[3];
607 struct gl_shader_program *shProg;
608 v[0] = v0;
609 v[1] = v1;
610 v[2] = v2;
611 shProg = _mesa_lookup_shader_program_err(ctx, program,
612 "glProgramUniform3ui");
613 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT, 3);
614 }
615
616 void GLAPIENTRY
617 _mesa_ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1,
618 GLuint v2, GLuint v3)
619 {
620 GET_CURRENT_CONTEXT(ctx);
621 GLuint v[4];
622 struct gl_shader_program *shProg;
623 v[0] = v0;
624 v[1] = v1;
625 v[2] = v2;
626 v[3] = v3;
627 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4ui");
628 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT, 4);
629 }
630
631 void GLAPIENTRY
632 _mesa_ProgramUniform1uiv(GLuint program, GLint location, GLsizei count,
633 const GLuint *value)
634 {
635 GET_CURRENT_CONTEXT(ctx);
636 struct gl_shader_program *shProg =
637 _mesa_lookup_shader_program_err(ctx, program,
638 "glProgramUniform1uiv");
639 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_UINT, 1);
640 }
641
642 void GLAPIENTRY
643 _mesa_ProgramUniform2uiv(GLuint program, GLint location, GLsizei count,
644 const GLuint *value)
645 {
646 GET_CURRENT_CONTEXT(ctx);
647 struct gl_shader_program *shProg =
648 _mesa_lookup_shader_program_err(ctx, program,
649 "glProgramUniform2uiv");
650 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_UINT, 2);
651 }
652
653 void GLAPIENTRY
654 _mesa_ProgramUniform3uiv(GLuint program, GLint location, GLsizei count,
655 const GLuint *value)
656 {
657 GET_CURRENT_CONTEXT(ctx);
658 struct gl_shader_program *shProg =
659 _mesa_lookup_shader_program_err(ctx, program,
660 "glProgramUniform3uiv");
661 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_UINT, 3);
662 }
663
664 void GLAPIENTRY
665 _mesa_ProgramUniform4uiv(GLuint program, GLint location, GLsizei count,
666 const GLuint *value)
667 {
668 GET_CURRENT_CONTEXT(ctx);
669 struct gl_shader_program *shProg =
670 _mesa_lookup_shader_program_err(ctx, program,
671 "glProgramUniform4uiv");
672 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_UINT, 4);
673 }
674
675
676
677 void GLAPIENTRY
678 _mesa_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
679 GLboolean transpose, const GLfloat * value)
680 {
681 GET_CURRENT_CONTEXT(ctx);
682 struct gl_shader_program *shProg =
683 _mesa_lookup_shader_program_err(ctx, program,
684 "glProgramUniformMatrix2fv");
685 _mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
686 }
687
688 void GLAPIENTRY
689 _mesa_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
690 GLboolean transpose, const GLfloat * value)
691 {
692 GET_CURRENT_CONTEXT(ctx);
693 struct gl_shader_program *shProg =
694 _mesa_lookup_shader_program_err(ctx, program,
695 "glProgramUniformMatrix3fv");
696 _mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
697 }
698
699 void GLAPIENTRY
700 _mesa_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
701 GLboolean transpose, const GLfloat * value)
702 {
703 GET_CURRENT_CONTEXT(ctx);
704 struct gl_shader_program *shProg =
705 _mesa_lookup_shader_program_err(ctx, program,
706 "glProgramUniformMatrix4fv");
707 _mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
708 }
709
710
711 /**
712 * Non-square UniformMatrix are OpenGL 2.1
713 */
714 void GLAPIENTRY
715 _mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
716 const GLfloat *value)
717 {
718 GET_CURRENT_CONTEXT(ctx);
719 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
720 2, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
721 }
722
723 void GLAPIENTRY
724 _mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
725 const GLfloat *value)
726 {
727 GET_CURRENT_CONTEXT(ctx);
728 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
729 3, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
730 }
731
732 void GLAPIENTRY
733 _mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
734 const GLfloat *value)
735 {
736 GET_CURRENT_CONTEXT(ctx);
737 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
738 2, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
739 }
740
741 void GLAPIENTRY
742 _mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
743 const GLfloat *value)
744 {
745 GET_CURRENT_CONTEXT(ctx);
746 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
747 4, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
748 }
749
750 void GLAPIENTRY
751 _mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
752 const GLfloat *value)
753 {
754 GET_CURRENT_CONTEXT(ctx);
755 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
756 3, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
757 }
758
759 void GLAPIENTRY
760 _mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
761 const GLfloat *value)
762 {
763 GET_CURRENT_CONTEXT(ctx);
764 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
765 4, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
766 }
767
768 /** Same as above with direct state access **/
769
770 void GLAPIENTRY
771 _mesa_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
772 GLboolean transpose, const GLfloat * value)
773 {
774 GET_CURRENT_CONTEXT(ctx);
775 struct gl_shader_program *shProg =
776 _mesa_lookup_shader_program_err(ctx, program,
777 "glProgramUniformMatrix2x3fv");
778 _mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
779 }
780
781 void GLAPIENTRY
782 _mesa_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
783 GLboolean transpose, const GLfloat * value)
784 {
785 GET_CURRENT_CONTEXT(ctx);
786 struct gl_shader_program *shProg =
787 _mesa_lookup_shader_program_err(ctx, program,
788 "glProgramUniformMatrix3x2fv");
789 _mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
790 }
791
792 void GLAPIENTRY
793 _mesa_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
794 GLboolean transpose, const GLfloat * value)
795 {
796 GET_CURRENT_CONTEXT(ctx);
797 struct gl_shader_program *shProg =
798 _mesa_lookup_shader_program_err(ctx, program,
799 "glProgramUniformMatrix2x4fv");
800 _mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
801 }
802
803 void GLAPIENTRY
804 _mesa_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
805 GLboolean transpose, const GLfloat * value)
806 {
807 GET_CURRENT_CONTEXT(ctx);
808 struct gl_shader_program *shProg =
809 _mesa_lookup_shader_program_err(ctx, program,
810 "glProgramUniformMatrix4x2fv");
811 _mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GLSL_TYPE_FLOAT);
812 }
813
814 void GLAPIENTRY
815 _mesa_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
816 GLboolean transpose, const GLfloat * value)
817 {
818 GET_CURRENT_CONTEXT(ctx);
819 struct gl_shader_program *shProg =
820 _mesa_lookup_shader_program_err(ctx, program,
821 "glProgramUniformMatrix3x4fv");
822 _mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GLSL_TYPE_FLOAT);
823 }
824
825 void GLAPIENTRY
826 _mesa_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
827 GLboolean transpose, const GLfloat * value)
828 {
829 GET_CURRENT_CONTEXT(ctx);
830 struct gl_shader_program *shProg =
831 _mesa_lookup_shader_program_err(ctx, program,
832 "glProgramUniformMatrix4x3fv");
833 _mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GLSL_TYPE_FLOAT);
834 }
835
836
837 void GLAPIENTRY
838 _mesa_GetnUniformfvARB(GLuint program, GLint location,
839 GLsizei bufSize, GLfloat *params)
840 {
841 GET_CURRENT_CONTEXT(ctx);
842 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_FLOAT, params);
843 }
844
845 void GLAPIENTRY
846 _mesa_GetUniformfv(GLuint program, GLint location, GLfloat *params)
847 {
848 _mesa_GetnUniformfvARB(program, location, INT_MAX, params);
849 }
850
851
852 void GLAPIENTRY
853 _mesa_GetnUniformivARB(GLuint program, GLint location,
854 GLsizei bufSize, GLint *params)
855 {
856 GET_CURRENT_CONTEXT(ctx);
857 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT, params);
858 }
859
860 void GLAPIENTRY
861 _mesa_GetUniformiv(GLuint program, GLint location, GLint *params)
862 {
863 _mesa_GetnUniformivARB(program, location, INT_MAX, params);
864 }
865
866
867 /* GL3 */
868 void GLAPIENTRY
869 _mesa_GetnUniformuivARB(GLuint program, GLint location,
870 GLsizei bufSize, GLuint *params)
871 {
872 GET_CURRENT_CONTEXT(ctx);
873 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT, params);
874 }
875
876 void GLAPIENTRY
877 _mesa_GetUniformuiv(GLuint program, GLint location, GLuint *params)
878 {
879 _mesa_GetnUniformuivARB(program, location, INT_MAX, params);
880 }
881
882
883 /* GL4 */
884 void GLAPIENTRY
885 _mesa_GetnUniformdvARB(GLuint program, GLint location,
886 GLsizei bufSize, GLdouble *params)
887 {
888 GET_CURRENT_CONTEXT(ctx);
889
890 _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_DOUBLE, params);
891 }
892
893 void GLAPIENTRY
894 _mesa_GetUniformdv(GLuint program, GLint location, GLdouble *params)
895 {
896 _mesa_GetnUniformdvARB(program, location, INT_MAX, params);
897 }
898
899
900 GLint GLAPIENTRY
901 _mesa_GetUniformLocation(GLuint programObj, const GLcharARB *name)
902 {
903 struct gl_shader_program *shProg;
904
905 GET_CURRENT_CONTEXT(ctx);
906
907 shProg = _mesa_lookup_shader_program_err(ctx, programObj,
908 "glGetUniformLocation");
909 if (!shProg)
910 return -1;
911
912 /* Page 80 (page 94 of the PDF) of the OpenGL 2.1 spec says:
913 *
914 * "If program has not been successfully linked, the error
915 * INVALID_OPERATION is generated."
916 */
917 if (shProg->data->LinkStatus == GL_FALSE) {
918 _mesa_error(ctx, GL_INVALID_OPERATION,
919 "glGetUniformLocation(program not linked)");
920 return -1;
921 }
922
923 return _mesa_program_resource_location(shProg, GL_UNIFORM, name);
924 }
925
926 GLuint GLAPIENTRY
927 _mesa_GetUniformBlockIndex(GLuint program,
928 const GLchar *uniformBlockName)
929 {
930 GET_CURRENT_CONTEXT(ctx);
931 struct gl_shader_program *shProg;
932
933 if (!ctx->Extensions.ARB_uniform_buffer_object) {
934 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformBlockIndex");
935 return GL_INVALID_INDEX;
936 }
937
938 shProg = _mesa_lookup_shader_program_err(ctx, program,
939 "glGetUniformBlockIndex");
940 if (!shProg)
941 return GL_INVALID_INDEX;
942
943 struct gl_program_resource *res =
944 _mesa_program_resource_find_name(shProg, GL_UNIFORM_BLOCK,
945 uniformBlockName, NULL);
946 if (!res)
947 return GL_INVALID_INDEX;
948
949 return _mesa_program_resource_index(shProg, res);
950 }
951
952 void GLAPIENTRY
953 _mesa_GetUniformIndices(GLuint program,
954 GLsizei uniformCount,
955 const GLchar * const *uniformNames,
956 GLuint *uniformIndices)
957 {
958 GET_CURRENT_CONTEXT(ctx);
959 GLsizei i;
960 struct gl_shader_program *shProg;
961
962 if (!ctx->Extensions.ARB_uniform_buffer_object) {
963 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformIndices");
964 return;
965 }
966
967 shProg = _mesa_lookup_shader_program_err(ctx, program,
968 "glGetUniformIndices");
969 if (!shProg)
970 return;
971
972 if (uniformCount < 0) {
973 _mesa_error(ctx, GL_INVALID_VALUE,
974 "glGetUniformIndices(uniformCount < 0)");
975 return;
976 }
977
978 for (i = 0; i < uniformCount; i++) {
979 struct gl_program_resource *res =
980 _mesa_program_resource_find_name(shProg, GL_UNIFORM, uniformNames[i],
981 NULL);
982 uniformIndices[i] = _mesa_program_resource_index(shProg, res);
983 }
984 }
985
986 void GLAPIENTRY
987 _mesa_UniformBlockBinding(GLuint program,
988 GLuint uniformBlockIndex,
989 GLuint uniformBlockBinding)
990 {
991 GET_CURRENT_CONTEXT(ctx);
992 struct gl_shader_program *shProg;
993
994 if (!ctx->Extensions.ARB_uniform_buffer_object) {
995 _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformBlockBinding");
996 return;
997 }
998
999 shProg = _mesa_lookup_shader_program_err(ctx, program,
1000 "glUniformBlockBinding");
1001 if (!shProg)
1002 return;
1003
1004 if (uniformBlockIndex >= shProg->data->NumUniformBlocks) {
1005 _mesa_error(ctx, GL_INVALID_VALUE,
1006 "glUniformBlockBinding(block index %u >= %u)",
1007 uniformBlockIndex, shProg->data->NumUniformBlocks);
1008 return;
1009 }
1010
1011 if (uniformBlockBinding >= ctx->Const.MaxUniformBufferBindings) {
1012 _mesa_error(ctx, GL_INVALID_VALUE,
1013 "glUniformBlockBinding(block binding %u >= %u)",
1014 uniformBlockBinding, ctx->Const.MaxUniformBufferBindings);
1015 return;
1016 }
1017
1018 if (shProg->data->UniformBlocks[uniformBlockIndex].Binding !=
1019 uniformBlockBinding) {
1020
1021 FLUSH_VERTICES(ctx, 0);
1022 ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
1023
1024 shProg->data->UniformBlocks[uniformBlockIndex].Binding =
1025 uniformBlockBinding;
1026 }
1027 }
1028
1029 void GLAPIENTRY
1030 _mesa_ShaderStorageBlockBinding(GLuint program,
1031 GLuint shaderStorageBlockIndex,
1032 GLuint shaderStorageBlockBinding)
1033 {
1034 GET_CURRENT_CONTEXT(ctx);
1035 struct gl_shader_program *shProg;
1036
1037 if (!ctx->Extensions.ARB_shader_storage_buffer_object) {
1038 _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderStorageBlockBinding");
1039 return;
1040 }
1041
1042 shProg = _mesa_lookup_shader_program_err(ctx, program,
1043 "glShaderStorageBlockBinding");
1044 if (!shProg)
1045 return;
1046
1047 if (shaderStorageBlockIndex >= shProg->data->NumShaderStorageBlocks) {
1048 _mesa_error(ctx, GL_INVALID_VALUE,
1049 "glShaderStorageBlockBinding(block index %u >= %u)",
1050 shaderStorageBlockIndex,
1051 shProg->data->NumShaderStorageBlocks);
1052 return;
1053 }
1054
1055 if (shaderStorageBlockBinding >= ctx->Const.MaxShaderStorageBufferBindings) {
1056 _mesa_error(ctx, GL_INVALID_VALUE,
1057 "glShaderStorageBlockBinding(block binding %u >= %u)",
1058 shaderStorageBlockBinding,
1059 ctx->Const.MaxShaderStorageBufferBindings);
1060 return;
1061 }
1062
1063 if (shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding !=
1064 shaderStorageBlockBinding) {
1065
1066 FLUSH_VERTICES(ctx, 0);
1067 ctx->NewDriverState |= ctx->DriverFlags.NewShaderStorageBuffer;
1068
1069 shProg->data->ShaderStorageBlocks[shaderStorageBlockIndex].Binding =
1070 shaderStorageBlockBinding;
1071 }
1072 }
1073
1074 /**
1075 * Generic program resource property query.
1076 */
1077 static void
1078 mesa_bufferiv(struct gl_shader_program *shProg, GLenum type,
1079 GLuint index, GLenum pname, GLint *params, const char *caller)
1080 {
1081 GET_CURRENT_CONTEXT(ctx);
1082 struct gl_program_resource *res =
1083 _mesa_program_resource_find_index(shProg, type, index);
1084
1085 if (!res) {
1086 _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufferindex %d)", caller, index);
1087 return;
1088 }
1089
1090 switch (pname) {
1091 case GL_UNIFORM_BLOCK_BINDING:
1092 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1093 _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_BINDING,
1094 params, caller);
1095 return;
1096 case GL_UNIFORM_BLOCK_DATA_SIZE:
1097 case GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE:
1098 _mesa_program_resource_prop(shProg, res, index, GL_BUFFER_DATA_SIZE,
1099 params, caller);
1100 return;
1101 case GL_UNIFORM_BLOCK_NAME_LENGTH:
1102 _mesa_program_resource_prop(shProg, res, index, GL_NAME_LENGTH,
1103 params, caller);
1104 return;
1105 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
1106 case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS:
1107 _mesa_program_resource_prop(shProg, res, index, GL_NUM_ACTIVE_VARIABLES,
1108 params, caller);
1109 return;
1110 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
1111 case GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES:
1112 _mesa_program_resource_prop(shProg, res, index, GL_ACTIVE_VARIABLES,
1113 params, caller);
1114 return;
1115 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1116 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER:
1117 _mesa_program_resource_prop(shProg, res, index,
1118 GL_REFERENCED_BY_VERTEX_SHADER, params,
1119 caller);
1120 return;
1121
1122 case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER:
1123 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER:
1124 _mesa_program_resource_prop(shProg, res, index,
1125 GL_REFERENCED_BY_TESS_CONTROL_SHADER, params,
1126 caller);
1127 return;
1128
1129 case GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER:
1130 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER:
1131 _mesa_program_resource_prop(shProg, res, index,
1132 GL_REFERENCED_BY_TESS_EVALUATION_SHADER, params,
1133 caller);
1134 return;
1135
1136 case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER:
1137 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER:
1138 _mesa_program_resource_prop(shProg, res, index,
1139 GL_REFERENCED_BY_GEOMETRY_SHADER, params,
1140 caller);
1141 return;
1142 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1143 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER:
1144 _mesa_program_resource_prop(shProg, res, index,
1145 GL_REFERENCED_BY_FRAGMENT_SHADER, params,
1146 caller);
1147 return;
1148 case GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER:
1149 case GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER:
1150 _mesa_program_resource_prop(shProg, res, index,
1151 GL_REFERENCED_BY_COMPUTE_SHADER, params,
1152 caller);
1153 return;
1154 default:
1155 _mesa_error(ctx, GL_INVALID_ENUM,
1156 "%s(pname 0x%x (%s))", caller, pname,
1157 _mesa_enum_to_string(pname));
1158 return;
1159 }
1160 }
1161
1162
1163 void GLAPIENTRY
1164 _mesa_GetActiveUniformBlockiv(GLuint program,
1165 GLuint uniformBlockIndex,
1166 GLenum pname,
1167 GLint *params)
1168 {
1169 GET_CURRENT_CONTEXT(ctx);
1170 struct gl_shader_program *shProg;
1171
1172 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1173 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1174 return;
1175 }
1176
1177 shProg = _mesa_lookup_shader_program_err(ctx, program,
1178 "glGetActiveUniformBlockiv");
1179 if (!shProg)
1180 return;
1181
1182 mesa_bufferiv(shProg, GL_UNIFORM_BLOCK, uniformBlockIndex, pname, params,
1183 "glGetActiveUniformBlockiv");
1184 }
1185
1186 void GLAPIENTRY
1187 _mesa_GetActiveUniformBlockName(GLuint program,
1188 GLuint uniformBlockIndex,
1189 GLsizei bufSize,
1190 GLsizei *length,
1191 GLchar *uniformBlockName)
1192 {
1193 GET_CURRENT_CONTEXT(ctx);
1194 struct gl_shader_program *shProg;
1195
1196 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1197 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
1198 return;
1199 }
1200
1201 if (bufSize < 0) {
1202 _mesa_error(ctx, GL_INVALID_VALUE,
1203 "glGetActiveUniformBlockName(bufSize %d < 0)",
1204 bufSize);
1205 return;
1206 }
1207
1208 shProg = _mesa_lookup_shader_program_err(ctx, program,
1209 "glGetActiveUniformBlockiv");
1210 if (!shProg)
1211 return;
1212
1213 if (uniformBlockName)
1214 _mesa_get_program_resource_name(shProg, GL_UNIFORM_BLOCK,
1215 uniformBlockIndex, bufSize, length,
1216 uniformBlockName,
1217 "glGetActiveUniformBlockName");
1218 }
1219
1220 void GLAPIENTRY
1221 _mesa_GetActiveUniformName(GLuint program, GLuint uniformIndex,
1222 GLsizei bufSize, GLsizei *length,
1223 GLchar *uniformName)
1224 {
1225 GET_CURRENT_CONTEXT(ctx);
1226 struct gl_shader_program *shProg;
1227
1228 if (!ctx->Extensions.ARB_uniform_buffer_object) {
1229 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformName");
1230 return;
1231 }
1232
1233 if (bufSize < 0) {
1234 _mesa_error(ctx, GL_INVALID_VALUE,
1235 "glGetActiveUniformName(bufSize %d < 0)",
1236 bufSize);
1237 return;
1238 }
1239
1240 shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniformName");
1241
1242 if (!shProg)
1243 return;
1244
1245 _mesa_get_program_resource_name(shProg, GL_UNIFORM, uniformIndex, bufSize,
1246 length, uniformName, "glGetActiveUniformName");
1247 }
1248
1249 void GLAPIENTRY
1250 _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
1251 GLenum pname, GLint *params)
1252 {
1253 GET_CURRENT_CONTEXT(ctx);
1254 struct gl_shader_program *shProg;
1255
1256 if (!ctx->Extensions.ARB_shader_atomic_counters) {
1257 _mesa_error(ctx, GL_INVALID_OPERATION,
1258 "glGetActiveAtomicCounterBufferiv");
1259 return;
1260 }
1261
1262 shProg = _mesa_lookup_shader_program_err(ctx, program,
1263 "glGetActiveAtomicCounterBufferiv");
1264 if (!shProg)
1265 return;
1266
1267 mesa_bufferiv(shProg, GL_ATOMIC_COUNTER_BUFFER, bufferIndex, pname, params,
1268 "glGetActiveAtomicCounterBufferiv");
1269 }
1270
1271 void GLAPIENTRY
1272 _mesa_Uniform1d(GLint location, GLdouble v0)
1273 {
1274 GET_CURRENT_CONTEXT(ctx);
1275 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_DOUBLE, 1);
1276 }
1277
1278 void GLAPIENTRY
1279 _mesa_Uniform2d(GLint location, GLdouble v0, GLdouble v1)
1280 {
1281 GET_CURRENT_CONTEXT(ctx);
1282 GLdouble v[2];
1283 v[0] = v0;
1284 v[1] = v1;
1285 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 2);
1286 }
1287
1288 void GLAPIENTRY
1289 _mesa_Uniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
1290 {
1291 GET_CURRENT_CONTEXT(ctx);
1292 GLdouble v[3];
1293 v[0] = v0;
1294 v[1] = v1;
1295 v[2] = v2;
1296 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 3);
1297 }
1298
1299 void GLAPIENTRY
1300 _mesa_Uniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2,
1301 GLdouble v3)
1302 {
1303 GET_CURRENT_CONTEXT(ctx);
1304 GLdouble v[4];
1305 v[0] = v0;
1306 v[1] = v1;
1307 v[2] = v2;
1308 v[3] = v3;
1309 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_DOUBLE, 4);
1310 }
1311
1312 void GLAPIENTRY
1313 _mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
1314 {
1315 GET_CURRENT_CONTEXT(ctx);
1316 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 1);
1317 }
1318
1319 void GLAPIENTRY
1320 _mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
1321 {
1322 GET_CURRENT_CONTEXT(ctx);
1323 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 2);
1324 }
1325
1326 void GLAPIENTRY
1327 _mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
1328 {
1329 GET_CURRENT_CONTEXT(ctx);
1330 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 3);
1331 }
1332
1333 void GLAPIENTRY
1334 _mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
1335 {
1336 GET_CURRENT_CONTEXT(ctx);
1337 _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 4);
1338 }
1339
1340 void GLAPIENTRY
1341 _mesa_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
1342 const GLdouble * value)
1343 {
1344 GET_CURRENT_CONTEXT(ctx);
1345 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1346 2, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1347 }
1348
1349 void GLAPIENTRY
1350 _mesa_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
1351 const GLdouble * value)
1352 {
1353 GET_CURRENT_CONTEXT(ctx);
1354 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1355 3, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1356 }
1357
1358 void GLAPIENTRY
1359 _mesa_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
1360 const GLdouble * value)
1361 {
1362 GET_CURRENT_CONTEXT(ctx);
1363 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1364 4, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1365 }
1366
1367 void GLAPIENTRY
1368 _mesa_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
1369 const GLdouble *value)
1370 {
1371 GET_CURRENT_CONTEXT(ctx);
1372 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1373 2, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1374 }
1375
1376 void GLAPIENTRY
1377 _mesa_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
1378 const GLdouble *value)
1379 {
1380 GET_CURRENT_CONTEXT(ctx);
1381 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1382 3, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1383 }
1384
1385 void GLAPIENTRY
1386 _mesa_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
1387 const GLdouble *value)
1388 {
1389 GET_CURRENT_CONTEXT(ctx);
1390 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1391 2, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1392 }
1393
1394 void GLAPIENTRY
1395 _mesa_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
1396 const GLdouble *value)
1397 {
1398 GET_CURRENT_CONTEXT(ctx);
1399 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1400 4, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1401 }
1402
1403 void GLAPIENTRY
1404 _mesa_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
1405 const GLdouble *value)
1406 {
1407 GET_CURRENT_CONTEXT(ctx);
1408 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1409 3, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1410 }
1411
1412 void GLAPIENTRY
1413 _mesa_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
1414 const GLdouble *value)
1415 {
1416 GET_CURRENT_CONTEXT(ctx);
1417 _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
1418 4, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1419 }
1420
1421 void GLAPIENTRY
1422 _mesa_ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
1423 {
1424 GET_CURRENT_CONTEXT(ctx);
1425 struct gl_shader_program *shProg =
1426 _mesa_lookup_shader_program_err(ctx, program,
1427 "glProgramUniform1d");
1428 _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_DOUBLE, 1);
1429 }
1430
1431 void GLAPIENTRY
1432 _mesa_ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
1433 {
1434 GET_CURRENT_CONTEXT(ctx);
1435 GLdouble v[2];
1436 struct gl_shader_program *shProg;
1437 v[0] = v0;
1438 v[1] = v1;
1439 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2d");
1440 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 2);
1441 }
1442
1443 void GLAPIENTRY
1444 _mesa_ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1445 GLdouble v2)
1446 {
1447 GET_CURRENT_CONTEXT(ctx);
1448 GLdouble v[3];
1449 struct gl_shader_program *shProg;
1450 v[0] = v0;
1451 v[1] = v1;
1452 v[2] = v2;
1453 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3d");
1454 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 3);
1455 }
1456
1457 void GLAPIENTRY
1458 _mesa_ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
1459 GLdouble v2, GLdouble v3)
1460 {
1461 GET_CURRENT_CONTEXT(ctx);
1462 GLdouble v[4];
1463 struct gl_shader_program *shProg;
1464 v[0] = v0;
1465 v[1] = v1;
1466 v[2] = v2;
1467 v[3] = v3;
1468 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4d");
1469 _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 4);
1470 }
1471
1472 void GLAPIENTRY
1473 _mesa_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
1474 const GLdouble * value)
1475 {
1476 GET_CURRENT_CONTEXT(ctx);
1477 struct gl_shader_program *shProg =
1478 _mesa_lookup_shader_program_err(ctx, program,
1479 "glProgramUniform1dv");
1480 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 1);
1481 }
1482
1483 void GLAPIENTRY
1484 _mesa_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
1485 const GLdouble * value)
1486 {
1487 GET_CURRENT_CONTEXT(ctx);
1488 struct gl_shader_program *shProg =
1489 _mesa_lookup_shader_program_err(ctx, program,
1490 "glProgramUniform2dv");
1491 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 2);
1492 }
1493
1494 void GLAPIENTRY
1495 _mesa_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
1496 const GLdouble * value)
1497 {
1498 GET_CURRENT_CONTEXT(ctx);
1499 struct gl_shader_program *shProg =
1500 _mesa_lookup_shader_program_err(ctx, program,
1501 "glProgramUniform3dv");
1502 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 3);
1503 }
1504
1505 void GLAPIENTRY
1506 _mesa_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
1507 const GLdouble * value)
1508 {
1509 GET_CURRENT_CONTEXT(ctx);
1510 struct gl_shader_program *shProg =
1511 _mesa_lookup_shader_program_err(ctx, program,
1512 "glProgramUniform4dv");
1513 _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 4);
1514 }
1515
1516 void GLAPIENTRY
1517 _mesa_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
1518 GLboolean transpose, const GLdouble * value)
1519 {
1520 GET_CURRENT_CONTEXT(ctx);
1521 struct gl_shader_program *shProg =
1522 _mesa_lookup_shader_program_err(ctx, program,
1523 "glProgramUniformMatrix2dv");
1524 _mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1525 }
1526
1527 void GLAPIENTRY
1528 _mesa_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
1529 GLboolean transpose, const GLdouble * value)
1530 {
1531 GET_CURRENT_CONTEXT(ctx);
1532 struct gl_shader_program *shProg =
1533 _mesa_lookup_shader_program_err(ctx, program,
1534 "glProgramUniformMatrix3dv");
1535 _mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1536 }
1537
1538 void GLAPIENTRY
1539 _mesa_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
1540 GLboolean transpose, const GLdouble * value)
1541 {
1542 GET_CURRENT_CONTEXT(ctx);
1543 struct gl_shader_program *shProg =
1544 _mesa_lookup_shader_program_err(ctx, program,
1545 "glProgramUniformMatrix4dv");
1546 _mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1547 }
1548
1549 void GLAPIENTRY
1550 _mesa_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
1551 GLboolean transpose, const GLdouble * value)
1552 {
1553 GET_CURRENT_CONTEXT(ctx);
1554 struct gl_shader_program *shProg =
1555 _mesa_lookup_shader_program_err(ctx, program,
1556 "glProgramUniformMatrix2x3dv");
1557 _mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1558 }
1559
1560 void GLAPIENTRY
1561 _mesa_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
1562 GLboolean transpose, const GLdouble * value)
1563 {
1564 GET_CURRENT_CONTEXT(ctx);
1565 struct gl_shader_program *shProg =
1566 _mesa_lookup_shader_program_err(ctx, program,
1567 "glProgramUniformMatrix3x2dv");
1568 _mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1569 }
1570
1571 void GLAPIENTRY
1572 _mesa_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
1573 GLboolean transpose, const GLdouble * value)
1574 {
1575 GET_CURRENT_CONTEXT(ctx);
1576 struct gl_shader_program *shProg =
1577 _mesa_lookup_shader_program_err(ctx, program,
1578 "glProgramUniformMatrix2x4dv");
1579 _mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1580 }
1581
1582 void GLAPIENTRY
1583 _mesa_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
1584 GLboolean transpose, const GLdouble * value)
1585 {
1586 GET_CURRENT_CONTEXT(ctx);
1587 struct gl_shader_program *shProg =
1588 _mesa_lookup_shader_program_err(ctx, program,
1589 "glProgramUniformMatrix4x2dv");
1590 _mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1591 }
1592
1593 void GLAPIENTRY
1594 _mesa_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
1595 GLboolean transpose, const GLdouble * value)
1596 {
1597 GET_CURRENT_CONTEXT(ctx);
1598 struct gl_shader_program *shProg =
1599 _mesa_lookup_shader_program_err(ctx, program,
1600 "glProgramUniformMatrix3x4dv");
1601 _mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1602 }
1603
1604 void GLAPIENTRY
1605 _mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
1606 GLboolean transpose, const GLdouble * value)
1607 {
1608 GET_CURRENT_CONTEXT(ctx);
1609 struct gl_shader_program *shProg =
1610 _mesa_lookup_shader_program_err(ctx, program,
1611 "glProgramUniformMatrix4x3dv");
1612 _mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GLSL_TYPE_DOUBLE);
1613 }