summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2022-02-16 17:44:13 -0500
committerDylan Baker <dylan.c.baker@intel.com>2022-04-21 21:03:04 -0700
commit8e7e4a69dbfc90d4b28716706b0954e381733e69 (patch)
tree10f15d3d527c3ef38a33b46924b82618e8b343ac
parent78e231bf2e1d167b7ab89e3df22a8547908af15e (diff)
zink: fix xfb analysis variable finding for arrays
this fixes clipdistance exports cc: mesa-stable Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15224> (cherry picked from commit 3f7da0c58447979976eb2928625b1f93154f6c57) Conflicts: src/gallium/drivers/zink/zink_compiler.c Changes for stable: - Add `have_psiz` as an argument to `find_var_with_locations_frac`
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/zink/zink_compiler.c12
2 files changed, 8 insertions, 6 deletions
diff --git a/.pick_status.json b/.pick_status.json
index e1ce9afa029..1bd41da685d 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -12196,7 +12196,7 @@
"description": "zink: fix xfb analysis variable finding for arrays",
"nominated": true,
"nomination_type": 0,
- "resolution": 5,
+ "resolution": 1,
"because_sha": null
},
{
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 099434a698d..89b319a6ab6 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -558,13 +558,15 @@ check_psiz(struct nir_shader *s)
}
static nir_variable *
-find_var_with_location_frac(nir_shader *nir, unsigned location, unsigned location_frac)
+find_var_with_location_frac(nir_shader *nir, unsigned location, unsigned location_frac, bool have_psiz)
{
nir_foreach_shader_out_variable(var, nir) {
if (var->data.location == location &&
(var->data.location_frac == location_frac ||
- glsl_get_vector_elements(var->type) >= location_frac + 1))
- return var;
+ (glsl_type_is_array(var->type) ? glsl_array_size(var->type) : glsl_get_vector_elements(var->type)) >= location_frac + 1)) {
+ if (location != VARYING_SLOT_PSIZ || !have_psiz || var->data.explicit_location)
+ return var;
+ }
}
return NULL;
}
@@ -610,7 +612,7 @@ update_so_info(struct zink_shader *zs, const struct pipe_stream_output_info *so_
if (zs->nir->info.stage != MESA_SHADER_GEOMETRY || util_bitcount(zs->nir->info.gs.active_stream_mask) == 1) {
nir_variable *var = NULL;
while (!var)
- var = find_var_with_location_frac(zs->nir, slot--, output->start_component);
+ var = find_var_with_location_frac(zs->nir, slot--, output->start_component, have_psiz);
slot++;
if (is_inlined(inlined[slot], output))
continue;
@@ -644,7 +646,7 @@ update_so_info(struct zink_shader *zs, const struct pipe_stream_output_info *so_
if (zs->nir->info.stage != MESA_SHADER_GEOMETRY || util_bitcount(zs->nir->info.gs.active_stream_mask) == 1) {
nir_variable *var = NULL;
while (!var)
- var = find_var_with_location_frac(zs->nir, slot--, output->start_component);
+ var = find_var_with_location_frac(zs->nir, slot--, output->start_component, have_psiz);
slot++;
/* if this was flagged as a packed output before, and if all the components are
* being output with the same stream on the same buffer, this entire variable