From 2bc933f7d5852df4aaf3c2d59b153a85ced111c2 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 23 Mar 2022 15:37:49 +0100 Subject: [PATCH] glsl/nir/linker: fix shader_storage_blocks_write_access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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: 79127f8d5be ("glsl: set ShaderStorageBlocksWriteAccess in the nir linker") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6184 Reviewed-by: Alejandro PiƱeiro Part-of: --- src/compiler/glsl/gl_nir_link_uniforms.c | 18 ++++++++++++++++-- src/gallium/drivers/virgl/ci/traces-virgl.yml | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c index d1d483bd502..aa77225600b 100644 --- a/src/compiler/glsl/gl_nir_link_uniforms.c +++ b/src/compiler/glsl/gl_nir_link_uniforms.c @@ -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); } } diff --git a/src/gallium/drivers/virgl/ci/traces-virgl.yml b/src/gallium/drivers/virgl/ci/traces-virgl.yml index 5c87456f2f1..ac1d02b3430 100644 --- a/src/gallium/drivers/virgl/ci/traces-virgl.yml +++ b/src/gallium/drivers/virgl/ci/traces-virgl.yml @@ -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: