zink: add extension loading framework for spirv builder
[mesa.git] / src / gallium / drivers / zink / nir_to_spirv / spirv_builder.h
index ddc4bbf43288ff49a7731078dea3d2c8179a5192..a1e9b6c655ef131b295a1a533d8a5f6acef8b560 100644 (file)
 #include <stdint.h>
 #include <stdlib.h>
 
+struct hash_table;
+
 struct spirv_buffer {
    uint32_t *words;
    size_t num_words, room;
 };
 
 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;
@@ -47,6 +52,7 @@ struct spirv_builder {
 
    struct spirv_buffer types_const_defs;
    struct hash_table *types;
+   struct hash_table *consts;
 
    struct spirv_buffer instructions;
    SpvId prev_id;
@@ -61,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);
@@ -90,6 +99,9 @@ void
 spirv_builder_emit_builtin(struct spirv_builder *b, SpvId target,
                            SpvBuiltIn builtin);
 
+void
+spirv_builder_emit_index(struct spirv_builder *b, SpvId target, int index);
+
 void
 spirv_builder_emit_descriptor_set(struct spirv_builder *b, SpvId target,
                                   uint32_t descriptor_set);
@@ -102,6 +114,18 @@ void
 spirv_builder_emit_array_stride(struct spirv_builder *b, SpvId target,
                                 uint32_t stride);
 
+void
+spirv_builder_emit_offset(struct spirv_builder *b, SpvId target,
+                          uint32_t offset);
+
+void
+spirv_builder_emit_xfb_buffer(struct spirv_builder *b, SpvId target,
+                              uint32_t buffer);
+
+void
+spirv_builder_emit_xfb_stride(struct spirv_builder *b, SpvId target,
+                              uint32_t stride);
+
 void
 spirv_builder_emit_member_offset(struct spirv_builder *b, SpvId target,
                                  uint32_t member, uint32_t offset);
@@ -174,18 +198,72 @@ spirv_builder_emit_vector_shuffle(struct spirv_builder *b, SpvId result_type,
                                   SpvId vector_1, SpvId vector_2,
                                   const uint32_t components[],
                                   size_t num_components);
+SpvId
+spirv_builder_emit_vector_extract(struct spirv_builder *b, SpvId result_type,
+                                  SpvId vector_1,
+                                  uint32_t component);
+SpvId
+spirv_builder_emit_vector_insert(struct spirv_builder *b, SpvId result_type,
+                                  SpvId vector_1,
+                                  SpvId component,
+                                  uint32_t index);
+void
+spirv_builder_emit_branch(struct spirv_builder *b, SpvId label);
+
+void
+spirv_builder_emit_selection_merge(struct spirv_builder *b, SpvId merge_block,
+                                   SpvSelectionControlMask selection_control);
+
+void
+spirv_builder_loop_merge(struct spirv_builder *b, SpvId merge_block,
+                         SpvId cont_target, SpvLoopControlMask loop_control);
+
+void
+spirv_builder_emit_branch_conditional(struct spirv_builder *b, SpvId condition,
+                                      SpvId true_label, SpvId false_label);
+
+SpvId
+spirv_builder_emit_phi(struct spirv_builder *b, SpvId result_type,
+                       size_t num_vars, size_t *position);
+
+void
+spirv_builder_set_phi_operand(struct spirv_builder *b, size_t position,
+                              size_t index, SpvId variable, SpvId parent);
+
+void
+spirv_builder_emit_kill(struct spirv_builder *b);
+
+
+SpvId
+spirv_builder_emit_image_sample(struct spirv_builder *b,
+                                SpvId result_type,
+                                SpvId sampled_image,
+                                SpvId coordinate,
+                                bool proj,
+                                SpvId lod,
+                                SpvId bias,
+                                SpvId dref,
+                                SpvId dx,
+                                SpvId dy,
+                                SpvId offset);
+
+SpvId
+spirv_builder_emit_image(struct spirv_builder *b, SpvId result_type,
+                         SpvId sampled_image);
 
 SpvId
-spirv_builder_emit_image_sample_implicit_lod(struct spirv_builder *b,
-                                             SpvId result_type,
-                                             SpvId sampled_image,
-                                             SpvId coordinate);
+spirv_builder_emit_image_fetch(struct spirv_builder *b,
+                               SpvId result_type,
+                               SpvId image,
+                               SpvId coordinate,
+                               SpvId lod,
+                               SpvId sample);
 
 SpvId
-spirv_builder_emit_image_sample_proj_implicit_lod(struct spirv_builder *b,
-                                                  SpvId result_type,
-                                                  SpvId sampled_image,
-                                                  SpvId coordinate);
+spirv_builder_emit_image_query_size(struct spirv_builder *b,
+                                    SpvId result_type,
+                                    SpvId image,
+                                    SpvId lod);
 
 SpvId
 spirv_builder_emit_ext_inst(struct spirv_builder *b, SpvId result_type,