mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 07:18:17 +02:00
linker: Set binding for all elements of UBO array
Previously, a UBO like
layout(binding=2) uniform U {
...
} my_constants[4];
wouldn't get any bindings set. The code would try to set the binding of
U, but that would fail. It should instead set the bindings for U[0],
U[1], ...
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76323
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "10.1" <mesa-stable@lists.freedesktop.org>
Cc: github@socker.lepus.uberspace.de
This commit is contained in:
parent
cc42717b50
commit
25a6656875
1 changed files with 34 additions and 2 deletions
|
|
@ -262,8 +262,40 @@ link_set_uniform_initializers(struct gl_shader_program *prog)
|
|||
} else if (var->is_in_uniform_block()) {
|
||||
const glsl_type *const iface_type = var->get_interface_type();
|
||||
|
||||
linker::set_block_binding(prog, iface_type->name,
|
||||
var->data.binding);
|
||||
/* If the variable is an array and it is an interface instance,
|
||||
* we need to set the binding for each array element. Just
|
||||
* checking that the variable is an array is not sufficient.
|
||||
* The variable could be an array element of a uniform block
|
||||
* that lacks an instance name. For example:
|
||||
*
|
||||
* uniform U {
|
||||
* float f[4];
|
||||
* };
|
||||
*
|
||||
* In this case "f" would pass is_in_uniform_block (above) and
|
||||
* type->is_array(), but it will fail is_interface_instance().
|
||||
*/
|
||||
if (var->is_interface_instance() && var->type->is_array()) {
|
||||
for (unsigned i = 0; i < var->type->length; i++) {
|
||||
const char *name =
|
||||
ralloc_asprintf(mem_ctx, "%s[%u]", iface_type->name, i);
|
||||
|
||||
/* Section 4.4.3 (Uniform Block Layout Qualifiers) of the
|
||||
* GLSL 4.20 spec says:
|
||||
*
|
||||
* "If the binding identifier is used with a uniform
|
||||
* block instanced as an array then the first element
|
||||
* of the array takes the specified block binding and
|
||||
* each subsequent element takes the next consecutive
|
||||
* uniform block binding point."
|
||||
*/
|
||||
linker::set_block_binding(prog, name,
|
||||
var->data.binding + i);
|
||||
}
|
||||
} else {
|
||||
linker::set_block_binding(prog, iface_type->name,
|
||||
var->data.binding);
|
||||
}
|
||||
} else {
|
||||
assert(!"Explicit binding not on a sampler or UBO.");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue