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;