glsl/nir/linker: fix shader_storage_blocks_write_access

shader_storage_blocks_write_access was computed using the buffer indices
in the program but ShaderStorageBlocksWriteAccess is used with the shader
buffers.

So if a VS had 3 SSBOs and a FS had 4, the mask for VS was 0x3 (correct) but
the mask for the FS was 0x78 instead of 0x15.

Fix this by substracting the index of the first shader buffer in the program's
buffers.

Fixes: 79127f8d5b ("glsl: set ShaderStorageBlocksWriteAccess in the nir linker")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6184
Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15552>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2022-03-23 15:37:49 +01:00
parent 61ee560bc5
commit 2bc933f7d5
2 changed files with 18 additions and 4 deletions

View file

@ -1742,14 +1742,28 @@ gl_nir_link_uniforms(const struct gl_constants *consts,
STATIC_ASSERT(MAX_SHADER_STORAGE_BUFFERS <= 32);
/* Buffers from each stage are pointers to the one stored in the program. We need
* to account for this before computing the mask below otherwise the mask will be
* incorrect.
* sh->Program->sh.SSBlocks: [a][b][c][d][e][f]
* VS prog->data->SSBlocks : [a][b][c]
* FS prog->data->SSBlocks : [d][e][f]
* eg for FS buffer 1, buffer_block_index will be 4 but sh_block_index will be 1.
*/
int base = 0;
base = sh->Program->sh.ShaderStorageBlocks[0] - prog->data->ShaderStorageBlocks;
assert(base >= 0);
int sh_block_index = buffer_block_index - base;
/* 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) {
if (sh_block_index + array_size <= 32) {
state.shader_storage_blocks_write_access |=
u_bit_consecutive(buffer_block_index, array_size);
u_bit_consecutive(sh_block_index, array_size);
}
}

View file

@ -246,7 +246,7 @@ traces:
- path: supertuxkart/supertuxkart-mansion-egl-gles.trace
expectations:
- device: gl-virgl
checksum: c8e5d7c4377b8e484ae41270692914f3
checksum: 5e4e0cedd57bedf3eb7f127489a46b12
- path: xonotic/xonotic-keybench-high.trace
expectations:
- device: gl-virgl
@ -267,7 +267,7 @@ traces:
- path: valve/portal-2.trace
expectations:
- device: gl-virgl
checksum: 9f7fecf8df89e105a4d2b4a61468b427
checksum: 7489a8412ee2bca45431d208e0006a3e
# Piglit crashes when trying to run this one
# - path: supertuxkart/supertuxkart-antediluvian-abyss.rdc
# expectations: