Home | History | Annotate | Download | only in main
      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 }
   2096