[Mesa-dev] [PATCH 5/7] linker: Set block bindings based on UniformBlocks rather than UniformStorage

Ian Romanick idr at freedesktop.org
Thu Apr 10 11:38:19 PDT 2014


On 04/09/2014 08:09 AM, Kenneth Graunke wrote:
> On 04/04/2014 02:01 PM, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> For blocks, gl_shader_program::UniformStorage isn't very useful.  The
>> names stored there are the names of the elements of the block, so
>> finding blocks with an instance name is hard.  There is also only one
>> entry in ::UniformStorage for each element of a block array, and that is
>> a deal breaker.
>>
>> Using ::UniformBlocks is what _mesa_GetUniformBlockIndex does.  I
>> contemplated sharing code between set_block_binding and
>> _mesa_GetUniformBlockIndex, but building the stand-alone compiler and
>> the unit tests make this hard.  I plan to return to this effort shortly.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76323
>> Cc: "10.1" <mesa-stable at lists.freedesktop.org>
>> Cc: github at socker.lepus.uberspace.de
>> ---
>>  src/glsl/link_uniform_initializers.cpp | 32 +++++++++++++++++++++-----------
>>  1 file changed, 21 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/glsl/link_uniform_initializers.cpp b/src/glsl/link_uniform_initializers.cpp
>> index c633850..491eb69 100644
>> --- a/src/glsl/link_uniform_initializers.cpp
>> +++ b/src/glsl/link_uniform_initializers.cpp
>> @@ -46,6 +46,18 @@ get_storage(gl_uniform_storage *storage, unsigned num_storage,
>>     return NULL;
>>  }
>>  
>> +static unsigned
>> +get_uniform_block_index(const gl_shader_program *shProg,
>> +                        const char *uniformBlockName)
>> +{
>> +   for (unsigned i = 0; i < shProg->NumUniformBlocks; i++) {
>> +      if (!strcmp(shProg->UniformBlocks[i].Name, uniformBlockName))
>> +	 return i;
>> +   }
>> +
>> +   return GL_INVALID_INDEX;
>> +}
>> +
>>  void
>>  copy_constant_to_storage(union gl_constant_value *storage,
>>  			 const ir_constant *val,
>> @@ -123,29 +135,24 @@ set_sampler_binding(gl_shader_program *prog, const char *name, int binding)
>>  }
>>  
>>  void
>> -set_block_binding(gl_shader_program *prog, const char *name, int binding)
>> +set_block_binding(gl_shader_program *prog, const char *block_name, int binding)
>>  {
>> -   struct gl_uniform_storage *const storage =
>> -      get_storage(prog->UniformStorage, prog->NumUserUniformStorage, name);
>> +   const unsigned block_index = get_uniform_block_index(prog, block_name);
>>  
>> -   if (storage == NULL) {
>> -      assert(storage != NULL);
>> +   if (block_index == GL_INVALID_INDEX) {
>> +      assert(block_index != GL_INVALID_INDEX);
>>        return;
>>     }
>>  
>> -   if (storage->block_index != -1) {
>>        /* This is a field of a UBO.  val is the binding index. */
>>        for (int i = 0; i < MESA_SHADER_STAGES; i++) {
>> -         int stage_index = prog->UniformBlockStageIndex[i][storage->block_index];
>> +         int stage_index = prog->UniformBlockStageIndex[i][block_index];
>>  
>>           if (stage_index != -1) {
>>              struct gl_shader *sh = prog->_LinkedShaders[i];
>>              sh->UniformBlocks[stage_index].Binding = binding;
>>           }
>>        }
>> -   }
>> -
>> -   storage->initialized = true;
> 
> Why is it not necessary to set storage->initialized = true?  It goes
> away here and never seems to come back.

The meaning of gl_uniform_storage::initialized is: Has this uniform ever
been given a value?  Setting the binding of a block doesn't give
anything a value, but it does for samplers.  I hadn't fully worked
through the logic when I wrote the patch, and I forgot to come back to
it to document it.

>>  }
>>  
>>  void
>> @@ -253,7 +260,10 @@ link_set_uniform_initializers(struct gl_shader_program *prog)
>>                  || (type->is_array() && type->fields.array->is_sampler())) {
>>                 linker::set_sampler_binding(prog, var->name, var->data.binding);
>>              } else if (var->is_in_uniform_block()) {
>> -               linker::set_block_binding(prog, var->name, var->data.binding);
>> +               const glsl_type *const iface_type = var->get_interface_type();
>> +
>> +               linker::set_block_binding(prog, iface_type->name,
>> +                                         var->data.binding);
>>              } else {
>>                 assert(!"Explicit binding not on a sampler or UBO.");
>>              }
>>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140410/25cc7449/attachment-0001.sig>


More information about the mesa-dev mailing list