Module: Mesa
Branch: staging/22.2
Commit: 4813bc413e78dc2ea76453b26283ae5f32a0e760
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4813bc413e78dc2ea76453b26283ae5f32a0e760

Author: Mike Blumenkrantz <[email protected]>
Date:   Thu Apr  7 10:14:10 2022 -0400

zink: flag all assigned output slots as mapped

this ensures types which consume more than 1 slot are effectively tagged
so that the next stage inputs are also assigned properly

fixes:
spec@arb_enhanced_layouts@execution@component-layout@vs-fs-array-dvec3

cc: mesa-stable

Reviewed-by: Timur Kristóf <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18444>
(cherry picked from commit a0f6fecc6afeccc8e149ab31769df8b5225faa16)

---

 .pick_status.json                               |  2 +-
 src/gallium/drivers/zink/ci/zink-lvp-fails.txt  |  1 -
 src/gallium/drivers/zink/ci/zink-radv-fails.txt |  1 -
 src/gallium/drivers/zink/zink_compiler.c        | 11 +++++++----
 4 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 7407ca428a5..f90b7fcd77e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -3109,7 +3109,7 @@
         "description": "zink: flag all assigned output slots as mapped",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt 
b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
index 9f73e756db2..9b3fb3e8911 100644
--- a/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-lvp-fails.txt
@@ -251,7 +251,6 @@ spec@arb_texture_buffer_object@formats (vs- arb),Crash
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-mixed-const-non-const-uniform-index,Fail
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-mixed-const-non-const-uniform-index2,Fail
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-non-const-uniform-index,Fail
-spec@arb_enhanced_layouts@execution@component-layout@vs-fs-array-dvec3,Fail
 spec@arb_fragment_program_shadow@tex-shadow1d,Fail
 spec@arb_fragment_program_shadow@tex-shadow2d,Fail
 spec@arb_fragment_program_shadow@tex-shadow2drect,Fail
diff --git a/src/gallium/drivers/zink/ci/zink-radv-fails.txt 
b/src/gallium/drivers/zink/ci/zink-radv-fails.txt
index c486a93170d..b419fb44bf1 100644
--- a/src/gallium/drivers/zink/ci/zink-radv-fails.txt
+++ b/src/gallium/drivers/zink/ci/zink-radv-fails.txt
@@ -60,7 +60,6 @@ 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-mixed-const-non
 
spec@arb_arrays_of_arrays@execution@image_store@basic-imagestore-non-const-uniform-index,Fail
 
spec@arb_bindless_texture@compiler@[email protected],Crash
 spec@arb_depth_texture@depth-tex-modes,Fail
-spec@arb_enhanced_layouts@execution@component-layout@vs-fs-array-dvec3,Fail
 spec@arb_fragment_program_shadow@tex-shadow1d,Fail
 spec@arb_fragment_program_shadow@tex-shadow2d,Fail
 spec@arb_fragment_program_shadow@tex-shadow2drect,Fail
diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 4a500e6cbbe..fb641c14b54 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -1396,11 +1396,14 @@ assign_producer_var_io(gl_shader_stage stage, 
nir_variable *var, unsigned *reser
       }
       if (slot_map[slot] == 0xff) {
          assert(*reserved < MAX_VARYING);
-         slot_map[slot] = *reserved;
-         if (stage == MESA_SHADER_TESS_EVAL && var->data.mode == 
nir_var_shader_in && !var->data.patch)
-            *reserved += 
glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
+         unsigned num_slots;
+         if (nir_is_arrayed_io(var, stage))
+            num_slots = 
glsl_count_vec4_slots(glsl_get_array_element(var->type), false, false);
          else
-            *reserved += glsl_count_vec4_slots(var->type, false, false);
+            num_slots = glsl_count_vec4_slots(var->type, false, false);
+         assert(*reserved + num_slots <= MAX_VARYING);
+         for (unsigned i = 0; i < num_slots; i++)
+            slot_map[slot + i] = (*reserved)++;
       }
       slot = slot_map[slot];
       assert(slot < MAX_VARYING);

Reply via email to