glsl/nir/linker: fix shader_storage_blocks_write_access
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Wed, 23 Mar 2022 14:37:49 +0000 (15:37 +0100)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Mon, 28 Mar 2022 09:06:31 +0000 (11:06 +0200)
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 <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15552>

src/compiler/glsl/gl_nir_link_uniforms.c
src/gallium/drivers/virgl/ci/traces-virgl.yml

index d1d483bd5023643f8fb97340ee81f37cccdf9646..aa77225600bbf6e28189fe3fd2fc2d7e89cfe0f7 100644 (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);
             }
          }
 
index 5c87456f2f144b8a10c0bb1c2576016a60bf53c1..ac1d02b343089d03cb3b9bdab7d0ac0183acbc14 100644 (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: