glsl: Propagate explicit binding information from the AST all the way to the linker
Information about the binding was not being properly communicated from the front-end compiler to the linker. As a result, the linker never knew that any UBOs had explicit bindings! Fixes the piglit test arb_shading_language_420pack-binding-layout. 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> Tested-by: github@socker.lepus.uberspace.de [v0] Cc: "10.1" <mesa-stable@lists.freedesktop.org> Cc: github@socker.lepus.uberspace.de
This commit is contained in:
@@ -5316,6 +5316,13 @@ ast_interface_block::hir(exec_list *instructions,
|
||||
earlier->reinit_interface_type(block_type);
|
||||
delete var;
|
||||
} else {
|
||||
/* Propagate the "binding" keyword into this UBO's fields;
|
||||
* the UBO declaration itself doesn't get an ir_variable unless it
|
||||
* has an instance name. This is ugly.
|
||||
*/
|
||||
var->data.explicit_binding = this->layout.flags.q.explicit_binding;
|
||||
var->data.binding = this->layout.binding;
|
||||
|
||||
state->symbols->add_variable(var);
|
||||
instructions->push_tail(var);
|
||||
}
|
||||
|
@@ -46,6 +46,14 @@ process_block(void *mem_ctx, struct hash_table *ht, ir_variable *var)
|
||||
b->type = block_type;
|
||||
b->has_instance_name = var->is_interface_instance();
|
||||
|
||||
if (var->data.explicit_binding) {
|
||||
b->has_binding = true;
|
||||
b->binding = var->data.binding;
|
||||
} else {
|
||||
b->has_binding = false;
|
||||
b->binding = 0;
|
||||
}
|
||||
|
||||
_mesa_hash_table_insert(ht, h, var->get_interface_type()->name,
|
||||
(void *) b);
|
||||
return b;
|
||||
|
@@ -36,7 +36,10 @@ struct link_uniform_block_active {
|
||||
unsigned *array_elements;
|
||||
unsigned num_array_elements;
|
||||
|
||||
unsigned binding;
|
||||
|
||||
bool has_instance_name;
|
||||
bool has_binding;
|
||||
};
|
||||
|
||||
class link_uniform_block_active_visitor : public ir_hierarchical_visitor {
|
||||
|
@@ -251,7 +251,17 @@ link_uniform_blocks(void *mem_ctx,
|
||||
blocks[i].Name = ralloc_asprintf(blocks, "%s[%u]", name,
|
||||
b->array_elements[j]);
|
||||
blocks[i].Uniforms = &variables[parcel.index];
|
||||
blocks[i].Binding = 0;
|
||||
|
||||
/* The GL_ARB_shading_language_420pack 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."
|
||||
*/
|
||||
blocks[i].Binding = (b->has_binding) ? b->binding + j : 0;
|
||||
|
||||
blocks[i].UniformBufferSize = 0;
|
||||
blocks[i]._Packing =
|
||||
gl_uniform_block_packing(block_type->interface_packing);
|
||||
@@ -269,7 +279,7 @@ link_uniform_blocks(void *mem_ctx,
|
||||
} else {
|
||||
blocks[i].Name = ralloc_strdup(blocks, block_type->name);
|
||||
blocks[i].Uniforms = &variables[parcel.index];
|
||||
blocks[i].Binding = 0;
|
||||
blocks[i].Binding = (b->has_binding) ? b->binding : 0;
|
||||
blocks[i].UniformBufferSize = 0;
|
||||
blocks[i]._Packing =
|
||||
gl_uniform_block_packing(block_type->interface_packing);
|
||||
|
Reference in New Issue
Block a user