summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2022-05-21 18:53:59 -0400
committerDylan Baker <dylan.c.baker@intel.com>2022-06-15 16:12:58 -0700
commit692375bf9d25b592d6ec98b9523e8093fae3c68a (patch)
treeefe896d78b5be6dad38792c5563e2b4ec178f28d
parent274fcc2783384d64a422140eead460484553e22f (diff)
zink: fix variable locations in manual xfb emission
the last output isn't always only consuming 1 slot, so ensure that the xfb outputs begin at the appropriate place cc: mesa-stable Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16669> (cherry picked from commit e9d28cbe3fbe56076f85e9e309211d831368d1fc)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c7
2 files changed, 5 insertions, 4 deletions
diff --git a/.pick_status.json b/.pick_status.json
index ab1b06728ef..bed8f184ac4 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -895,7 +895,7 @@
"description": "zink: fix variable locations in manual xfb emission",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 6dbcd81f1cf..66e9de3fec7 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -4068,18 +4068,19 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_
nir_foreach_shader_in_variable(var, s)
emit_input(&ctx, var);
- int max_output = -1;
+ int max_output = 0;
nir_foreach_shader_out_variable(var, s) {
/* ignore SPIR-V built-ins, tagged with a sentinel value */
if (var->data.driver_location != UINT_MAX) {
assert(var->data.driver_location < INT_MAX);
- max_output = MAX2(max_output, (int)var->data.driver_location);
+ unsigned extent = glsl_count_attribute_slots(var->type, false);
+ max_output = MAX2(max_output, (int)var->data.driver_location + extent);
}
emit_output(&ctx, var);
}
if (sinfo->last_vertex)
- emit_so_info(&ctx, sinfo, max_output + 1);
+ emit_so_info(&ctx, sinfo, max_output);
uint32_t tcs_vertices_out_word = 0;
/* we have to reverse iterate to match what's done in zink_compiler.c */