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@gmail.com> Reviewed-by: Hoe Hao Cheng <haochengho12907@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11044>
This commit is contained in:
committed by
Marge Bot
parent
fb83477a58
commit
cae50a52e2
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user