Mesa (master): zink: only emit each cap once

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jan 4 18:44:25 UTC 2021


Module: Mesa
Branch: master
Commit: 96746d6557d25975bca173a3f4647f53f73f71ab
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=96746d6557d25975bca173a3f4647f53f73f71ab

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
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 <michael.blumenkrantz at gmail.com>
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;



More information about the mesa-commit mailing list