OLD | NEW |
(Empty) | |
| 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 location
s |
| 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 |
OLD | NEW |