Module: Mesa Branch: master Commit: 96746d6557d25975bca173a3f4647f53f73f71ab URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=96746d6557d25975bca173a3f4647f53f73f71ab
Author: Erik Faye-Lund <[email protected]> Date: Mon Jan 4 16:27:59 2021 +0100 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 <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8312> --- .../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 <stdlib.h> 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; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
