Module: Mesa Branch: main Commit: cd9b09903845e3c3d278add45fdd4fb66202614d URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd9b09903845e3c3d278add45fdd4fb66202614d
Author: Mike Blumenkrantz <[email protected]> Date: Wed Feb 9 15:41:28 2022 -0500 zink: store the tcs_vertices_out spirv word to the spirv_shader struct Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14976> --- src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 3 ++- src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h | 1 + src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c | 11 +++++++++-- src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) 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 774484fabd2..4026aa7f414 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 @@ -4036,7 +4036,8 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_ if (!ret->words) goto fail; - ret->num_words = spirv_builder_get_words(&ctx.builder, ret->words, num_words, spirv_version); + ret->num_words = spirv_builder_get_words(&ctx.builder, ret->words, num_words, spirv_version, &tcs_vertices_out_word); + ret->tcs_vertices_out_word = tcs_vertices_out_word; assert(ret->num_words == num_words); ralloc_free(ctx.mem_ctx); diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h index ca0614f0787..25a26a6d76a 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h @@ -39,6 +39,7 @@ struct spirv_shader { uint32_t *words; size_t num_words; + uint32_t tcs_vertices_out_word; }; struct nir_shader; diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c index 44a0ad5bbfc..1f1a8496895 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -1614,7 +1614,8 @@ spirv_builder_get_num_words(struct spirv_builder *b) size_t spirv_builder_get_words(struct spirv_builder *b, uint32_t *words, - size_t num_words, uint32_t spirv_version) + size_t num_words, uint32_t spirv_version, + uint32_t *tcs_vertices_out_word) { assert(num_words >= spirv_builder_get_num_words(b)); @@ -1644,10 +1645,16 @@ spirv_builder_get_words(struct spirv_builder *b, uint32_t *words, &b->instructions }; + bool find_tcs_vertices_out = *tcs_vertices_out_word > 0; for (int i = 0; i < ARRAY_SIZE(buffers); ++i) { const struct spirv_buffer *buffer = buffers[i]; - for (int j = 0; j < buffer->num_words; ++j) + for (int j = 0; j < buffer->num_words; ++j) { + if (find_tcs_vertices_out && buffer == &b->exec_modes && *tcs_vertices_out_word == j) { + *tcs_vertices_out_word = written; + find_tcs_vertices_out = false; + } words[written++] = buffer->words[j]; + } } assert(written == spirv_builder_get_num_words(b)); diff --git a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h index 26b523c6fdb..9c7faaf5c8b 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -456,7 +456,8 @@ spirv_builder_get_num_words(struct spirv_builder *b); size_t spirv_builder_get_words(struct spirv_builder *b, uint32_t *words, - size_t num_words, uint32_t spirv_version); + size_t num_words, uint32_t spirv_version, + uint32_t *tcs_vertices_out_word); void spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream);
