Mesa (main): zink: store the tcs_vertices_out spirv word to the spirv_shader struct

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Feb 11 01:41:37 UTC 2022


Module: Mesa
Branch: main
Commit: cd9b09903845e3c3d278add45fdd4fb66202614d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=cd9b09903845e3c3d278add45fdd4fb66202614d

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
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 <airlied at redhat.com>
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);



More information about the mesa-commit mailing list