diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2022-05-21 18:53:59 -0400 |
---|---|---|
committer | Dylan Baker <dylan.c.baker@intel.com> | 2022-06-15 16:12:58 -0700 |
commit | 692375bf9d25b592d6ec98b9523e8093fae3c68a (patch) | |
tree | efe896d78b5be6dad38792c5563e2b4ec178f28d | |
parent | 274fcc2783384d64a422140eead460484553e22f (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.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 7 |
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 */ |