mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 06:40:11 +01:00
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:
parent
61ee560bc5
commit
2bc933f7d5
2 changed files with 18 additions and 4 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue