[Mesa-dev] [PATCH 5/7] linker: Set block bindings based on UniformBlocks rather than UniformStorage
Kenneth Graunke
kenneth at whitecape.org
Wed Apr 9 08:09:16 PDT 2014
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.
> }
>
> 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: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140409/81962bf0/attachment.sig>
More information about the mesa-dev
mailing list