zink: add extension loading framework for spirv builder
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Fri, 17 Jul 2020 13:50:35 +0000 (09:50 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 31 Jul 2020 06:53:01 +0000 (06:53 +0000)
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5969>

src/gallium/drivers/zink/nir_to_spirv/spirv_builder.c
src/gallium/drivers/zink/nir_to_spirv/spirv_builder.h

index 530036d3d7081a6b35585f0f8188e54fc504d78c..1b7c676486add9665a57638b2e428c24caff5b18 100644 (file)
@@ -96,6 +96,16 @@ spirv_builder_emit_cap(struct spirv_builder *b, SpvCapability cap)
    spirv_buffer_emit_word(&b->capabilities, cap);
 }
 
+void
+spirv_builder_emit_extension(struct spirv_builder *b, const char *name)
+{
+   size_t pos = b->extensions.num_words;
+   spirv_buffer_prepare(&b->extensions, b->mem_ctx, 1);
+   spirv_buffer_emit_word(&b->extensions, SpvOpExtension);
+   int len = spirv_buffer_emit_string(&b->extensions, b->mem_ctx, name);
+   b->extensions.words[pos] |= (1 + len) << 16;
+}
+
 void
 spirv_builder_emit_source(struct spirv_builder *b, SpvSourceLanguage lang,
                           uint32_t version)
@@ -1106,6 +1116,7 @@ spirv_builder_get_num_words(struct spirv_builder *b)
    const size_t header_size = 5;
    return header_size +
           b->capabilities.num_words +
+          b->extensions.num_words +
           b->imports.num_words +
           b->memory_model.num_words +
           b->entry_points.num_words +
@@ -1131,6 +1142,7 @@ spirv_builder_get_words(struct spirv_builder *b, uint32_t *words,
 
    const struct spirv_buffer *buffers[] = {
       &b->capabilities,
+      &b->extensions,
       &b->imports,
       &b->memory_model,
       &b->entry_points,
index 7b870e948087d9477336192a819a0849764167e8..a1e9b6c655ef131b295a1a533d8a5f6acef8b560 100644 (file)
@@ -42,6 +42,7 @@ struct spirv_builder {
    void *mem_ctx;
 
    struct spirv_buffer capabilities;
+   struct spirv_buffer extensions;
    struct spirv_buffer imports;
    struct spirv_buffer memory_model;
    struct spirv_buffer entry_points;
@@ -66,6 +67,9 @@ spirv_builder_new_id(struct spirv_builder *b)
 void
 spirv_builder_emit_cap(struct spirv_builder *b, SpvCapability cap);
 
+void
+spirv_builder_emit_extension(struct spirv_builder *b, const char *ext);
+
 void
 spirv_builder_emit_source(struct spirv_builder *b, SpvSourceLanguage lang,
                           uint32_t version);