glsl: fix shader_storage_blocks_write_access for SSBO block arrays (v2)
This fixes KHR-GL45.compute_shader.resources-max on radeonsi.
Fixes: 4e1e8f684b
"glsl: remember which SSBOs are not read-only and pass it to gallium"
v2: use is_interface_array, protect again assertion failures in u_bit_consecutive
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -522,8 +522,10 @@ public:
|
||||
prog->data->ShaderStorageBlocks : prog->data->UniformBlocks;
|
||||
unsigned num_blks = var->is_in_shader_storage_block() ?
|
||||
prog->data->NumShaderStorageBlocks : prog->data->NumUniformBlocks;
|
||||
bool is_interface_array =
|
||||
var->is_interface_instance() && var->type->is_array();
|
||||
|
||||
if (var->is_interface_instance() && var->type->is_array()) {
|
||||
if (is_interface_array) {
|
||||
unsigned l = strlen(var->get_interface_type()->name);
|
||||
|
||||
for (unsigned i = 0; i < num_blks; i++) {
|
||||
@@ -544,8 +546,22 @@ public:
|
||||
assert(buffer_block_index != -1);
|
||||
|
||||
if (var->is_in_shader_storage_block() &&
|
||||
!var->data.memory_read_only)
|
||||
shader_storage_blocks_write_access |= 1 << buffer_block_index;
|
||||
!var->data.memory_read_only) {
|
||||
unsigned array_size = is_interface_array ?
|
||||
var->type->array_size() : 1;
|
||||
|
||||
STATIC_ASSERT(MAX_SHADER_STORAGE_BUFFERS <= 32);
|
||||
|
||||
/* Shaders that use too many SSBOs will fail to compile, which
|
||||
* we don't care about.
|
||||
*
|
||||
* This is true for shaders that do not use too many SSBOs:
|
||||
*/
|
||||
if (buffer_block_index + array_size <= 32) {
|
||||
shader_storage_blocks_write_access |=
|
||||
u_bit_consecutive(buffer_block_index, array_size);
|
||||
}
|
||||
}
|
||||
|
||||
/* Uniform blocks that were specified with an instance name must be
|
||||
* handled a little bit differently. The name of the variable is the
|
||||
|
Reference in New Issue
Block a user