Home | History | Annotate | Download | only in CHROMIUM
      1 Name
      2 
      3     CHROMIUM_bind_uniform_location
      4 
      5 Name Strings
      6 
      7     GL_CHROMIUM_bind_uniform_location
      8 
      9 Version
     10 
     11     Last Modifed Date: June 20, 2012
     12 
     13 Dependencies
     14 
     15     OpenGL ES 2.0 is required.
     16 
     17 Overview
     18 
     19     This extension is simlar to glBindAttribLocation but instead
     20     lets you choose a location for a uniform. This allows you
     21     to not have to query the locations of uniforms.
     22 
     23     This allows the client program to know the locations of uniforms
     24     without having to wait for shaders to compile or GLSL programs to
     25     link to query the locations and therefore have no blocking calls
     26     when initializing programs.
     27 
     28 Issues
     29 
     30     If a uniform is an array you can only call glBindUniformLocation
     31     for the location of the first element. Other elements' locations
     32     must be queried if you need them. Often this is not an issue
     33     because you can set all the elements with a single gl call from
     34     the first location.
     35 
     36     Good Example:
     37 
     38         --shader--
     39         uniform float u_someArray[4];
     40 
     41         --C--
     42         GLint location = 123;
     43         glBindUniformLocation(program, location, "u_someArray");
     44         glLinkProgram(program);
     45         glUseProgram(program);
     46 
     47         // set all 4 floats in u_someArray
     48         float values[] = { 0.1f, 0.2f, 0.3f, 0.4f, };
     49         glUniform1fv(location, 4, values);
     50 
     51     Bad example 1:
     52 
     53         GLint location = 123;
     54         glBindUniformLocation(program, location, "u_someArray");
     55         glLinkProgram(program);
     56         glUseProgram(program);
     57 
     58         // set floats in u_someArray one at a time
     59         glUniform1f(location, 0.1f);
     60         glUniform1f(location + 1, 0.2f);  // ERROR! math not allowed on locations
     61 
     62     Bad example 2:
     63 
     64         GLint location0 = 123;
     65         GLint location1 = 124;
     66         glBindUniformLocation(program, location0, "u_someArray[0]");
     67         glBindUniformLocation(program, location1, "u_someArray[1]"); // ERROR!
     68         // not allowed to assign locations to array elements
     69 
     70     If you need to set individual elements of a uniform array you must query the
     71     location of the each element you wish to set.
     72 
     73 New Tokens
     74 
     75     None
     76 
     77 New Procedures and Functions
     78 
     79     void BindUniformLocationCHROMIUM (GLuint program, GLint location,
     80                                       const GLhchar* name);
     81 
     82     specifes that the uniform variable named <name> in program <program>
     83     should be bound to uniform location <location> when the program is next
     84     linked.  If <name> was bound previously, its assigned binding is replaced
     85     with <location>. <name> must be a null terminated string.  The error
     86     INVALID_VALUE is generated if <location> is equal or greater than
     87 
     88     (MAX_VERTEX_UNIFORM_VECTORS + MAX_FRAGMENT_UNIFORM_VECTORS) * 4
     89 
     90     or less than 0. BindUniformLocation has no effect until the program is
     91     linked. In particular, it doesn't modify the bindings of active uniforms
     92     variables in a program that has already been linked.
     93 
     94     The error INVALID_OPERATION is generated if name starts with the reserved
     95     "gl_" prefix. The error INVALID_VALUE is generated if name ends with
     96     an array element expression other than "[0]".
     97 
     98     When a program is linked, any active uniforms without a binding specified
     99     through BindUniformLocation will be automatically be bound to locations by
    100     the GL.  Such bindings can be queried using the command
    101     GetUniformLocation.
    102 
    103     BindUniformLocation may be issued before any shader objects are attached
    104     to a program object.  Hence it is allowed to bind any name (except a name
    105     starting with "gl_") to an index, including a name that is never used as a
    106     uniform in any shader object.  Assigned bindings for uniform variables
    107     that do not exist or are not active are ignored.
    108 
    109     It is possible for an application to bind more than one uniform name to
    110     the same location.  This is referred to as aliasing.  This will only work
    111     if only one of the aliased uniforms is active in the executable program,
    112     or if no path through the shader consumes more than one uniform of a set
    113     of uniforms aliased to the same location.  A link error can occur if the
    114     linker determines that every path through the shader consumes multiple
    115     aliased uniforms, but implementations are not required to generate an
    116     error in this case.  The compiler and linker are allowed to assume that no
    117     aliasing is done, and may employ optimizations that work only in the
    118     absence of aliasing.
    119 
    120 Errors
    121 
    122     None.
    123 
    124 New State
    125 
    126     None.
    127 
    128 Revision History
    129 
    130     7/20/2012    Documented the extension
    131 
    132