From 96746d6557d25975bca173a3f4647f53f73f71ab Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 4 Jan 2021 16:27:59 +0100 Subject: [PATCH] zink: only emit each cap once This just prevents us from emitting some caps a bunch of times. Since there's few caps in use, it seems reasonable to use this mechanism for all caps, as it's unlikely to add up to anything worth worrying about. Reviewed-By: Mike Blumenkrantz Part-of: --- .../drivers/zink/nir_to_spirv/spirv_builder.c | 21 +++++++++++++------ .../drivers/zink/nir_to_spirv/spirv_builder.h | 4 +++- 2 files changed, 18 insertions(+), 7 deletions(-) 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 5aee0b6b44a..e384e945884 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c @@ -24,6 +24,7 @@ #include "spirv_builder.h" #include "util/macros.h" +#include "util/set.h" #include "util/ralloc.h" #include "util/u_bitcast.h" #include "util/u_memory.h" @@ -91,9 +92,11 @@ spirv_buffer_emit_string(struct spirv_buffer *b, void *mem_ctx, void spirv_builder_emit_cap(struct spirv_builder *b, SpvCapability cap) { - spirv_buffer_prepare(&b->capabilities, b->mem_ctx, 2); - spirv_buffer_emit_word(&b->capabilities, SpvOpCapability | (2 << 16)); - spirv_buffer_emit_word(&b->capabilities, cap); + if (!b->caps) + b->caps = _mesa_set_create_u32_keys(b->mem_ctx); + + assert(b->caps); + _mesa_set_add(b->caps, (void*)(uintptr_t)cap); } void @@ -1283,8 +1286,8 @@ size_t spirv_builder_get_num_words(struct spirv_builder *b) { const size_t header_size = 5; - return header_size + - b->capabilities.num_words + + const size_t caps_size = b->caps ? b->caps->entries * 2 : 0; + return header_size + caps_size + b->extensions.num_words + b->imports.num_words + b->memory_model.num_words + @@ -1309,8 +1312,14 @@ spirv_builder_get_words(struct spirv_builder *b, uint32_t *words, words[written++] = b->prev_id + 1; words[written++] = 0; + if (b->caps) { + set_foreach(b->caps, entry) { + words[written++] = SpvOpCapability | (2 << 16); + words[written++] = (uintptr_t)entry->key; + } + } + const struct spirv_buffer *buffers[] = { - &b->capabilities, &b->extensions, &b->imports, &b->memory_model, 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 d819a6d29db..6bcc650c83d 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h +++ b/src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h @@ -32,6 +32,7 @@ #include struct hash_table; +struct set; struct spirv_buffer { uint32_t *words; @@ -41,7 +42,8 @@ struct spirv_buffer { struct spirv_builder { void *mem_ctx; - struct spirv_buffer capabilities; + struct set *caps; + struct spirv_buffer extensions; struct spirv_buffer imports; struct spirv_buffer memory_model;