diff options
author | Timothy Arceri <timothy.arceri@collabora.com> | 2016-04-03 12:44:33 +1000 |
---|---|---|
committer | Timothy Arceri <timothy.arceri@collabora.com> | 2016-04-06 09:56:24 +1000 |
commit | f1293b2f9bc3a45c71941931edb5148d7b5f5a27 (patch) | |
tree | ba998230fc2b04bf8d130b6d7704650dbba09e83 /src/compiler/glsl/link_uniform_initializers.cpp | |
parent | 506b561ba7e3df2a7759dded684fae84bf459f65 (diff) | |
download | external_mesa3d-f1293b2f9bc3a45c71941931edb5148d7b5f5a27.zip external_mesa3d-f1293b2f9bc3a45c71941931edb5148d7b5f5a27.tar.gz external_mesa3d-f1293b2f9bc3a45c71941931edb5148d7b5f5a27.tar.bz2 |
glsl: fully split apart buffer block arrays
With this change we create the UBO and SSBO arrays separately from the
beginning rather than putting them into a combined array and splitting
it apart later.
A bug is with UBO and SSBO stage reference querying is also fixed as
we now use the block index to lookup the references in the separate arrays
not the combined buffer block array.
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Diffstat (limited to 'src/compiler/glsl/link_uniform_initializers.cpp')
-rw-r--r-- | src/compiler/glsl/link_uniform_initializers.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/compiler/glsl/link_uniform_initializers.cpp b/src/compiler/glsl/link_uniform_initializers.cpp index e5edf2e..c6346d5 100644 --- a/src/compiler/glsl/link_uniform_initializers.cpp +++ b/src/compiler/glsl/link_uniform_initializers.cpp @@ -154,11 +154,17 @@ set_opaque_binding(void *mem_ctx, gl_shader_program *prog, } void -set_block_binding(gl_shader_program *prog, const char *block_name, int binding) +set_block_binding(gl_shader_program *prog, const char *block_name, + unsigned mode, int binding) { - for (unsigned i = 0; i < prog->NumBufferInterfaceBlocks; i++) { - if (!strcmp(prog->BufferInterfaceBlocks[i].Name, block_name)) { - prog->BufferInterfaceBlocks[i].Binding = binding; + unsigned num_blocks = mode == ir_var_uniform ? prog->NumUniformBlocks : + prog->NumShaderStorageBlocks; + struct gl_uniform_block *blks = mode == ir_var_uniform ? + prog->UniformBlocks : prog->ShaderStorageBlocks; + + for (unsigned i = 0; i < num_blocks; i++) { + if (!strcmp(blks[i].Name, block_name)) { + blks[i].Binding = binding; return; } } @@ -308,11 +314,12 @@ link_set_uniform_initializers(struct gl_shader_program *prog, * each subsequent element takes the next consecutive * uniform block binding point." */ - linker::set_block_binding(prog, name, + linker::set_block_binding(prog, name, var->data.mode, var->data.binding + i); } } else { linker::set_block_binding(prog, iface_type->name, + var->data.mode, var->data.binding); } } else if (type->contains_atomic()) { |