Mesa (main): zink: allow to specify any spir-v version to nir_to_spirv

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 7 12:12:42 UTC 2021


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

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Thu May 27 14:42:12 2021 +0200

zink: allow to specify any spir-v version to nir_to_spirv

This will hopefully helps making it easier to override the SPIR-V
version we emit, in case some drivers or tools have issues with too
recent SPIR-V versions.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Reviewed-by: Hoe Hao Cheng <haochengho12907 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11044>

---

 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c  | 7 ++++---
 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.h  | 3 ++-
 src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c | 4 ++--
 src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h | 2 +-
 src/gallium/drivers/zink/zink_compiler.c              | 4 +++-
 5 files changed, 12 insertions(+), 8 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 e5c0399a08e..99a3ce9b93c 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
@@ -3552,14 +3552,15 @@ get_spacing(enum gl_tess_spacing spacing)
 }
 
 struct spirv_shader *
-nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, bool spirv_15)
+nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, uint32_t spirv_version)
 {
    struct spirv_shader *ret = NULL;
 
    struct ntv_context ctx = {};
    ctx.mem_ctx = ralloc_context(NULL);
    ctx.builder.mem_ctx = ctx.mem_ctx;
-   ctx.spirv_1_4_interfaces = spirv_15;
+   assert(spirv_version >= 0x10000);
+   ctx.spirv_1_4_interfaces = spirv_version >= 0x10400;
 
    ctx.glsl_types = _mesa_pointer_hash_table_create(ctx.mem_ctx);
    if (!ctx.glsl_types)
@@ -3899,7 +3900,7 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, bool spir
    if (!ret->words)
       goto fail;
 
-   ret->num_words = spirv_builder_get_words(&ctx.builder, ret->words, num_words, ctx.spirv_15);
+   ret->num_words = spirv_builder_get_words(&ctx.builder, ret->words, num_words, spirv_version);
    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 04f1bd27aff..2c59f408ac8 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
@@ -43,7 +43,8 @@ struct nir_shader;
 struct pipe_stream_output_info;
 
 struct spirv_shader *
-nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, bool spirv_15);
+nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
+             uint32_t spirv_version);
 
 void
 spirv_shader_delete(struct spirv_shader *s);
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 40898d560a7..878783fd3f3 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
@@ -1547,13 +1547,13 @@ 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, bool spirv_15)
+                        size_t num_words, uint32_t spirv_version)
 {
    assert(num_words >= spirv_builder_get_num_words(b));
 
    size_t written  = 0;
    words[written++] = SpvMagicNumber;
-   words[written++] = spirv_15 ? 0x00010500 : 0x00010000;
+   words[written++] = spirv_version;
    words[written++] = 0;
    words[written++] = b->prev_id + 1;
    words[written++] = 0;
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 77bda4f1635..6ad3064ced6 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
+++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h
@@ -448,7 +448,7 @@ 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, bool spirv_15);
+                        size_t num_words, uint32_t spirv_version);
 
 void
 spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream);
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 6e480ec48af..63d570db30b 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -640,7 +640,9 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
 
    assign_io_locations(nir, shader_slot_map, shader_slots_reserved);
 
-   struct spirv_shader *spirv = nir_to_spirv(nir, streamout, screen->vk_version >= VK_MAKE_VERSION(1, 2, 0));
+   uint32_t spirv_version = screen->vk_version >= VK_MAKE_VERSION(1, 2, 0) ?
+                            0x00010500 : 0x00010000;
+   struct spirv_shader *spirv = nir_to_spirv(nir, streamout, spirv_version);
    if (!spirv)
       goto done;
 



More information about the mesa-commit mailing list