zink: split up creating zink_shader objects and VkShaderModule objects
[mesa.git] / src / gallium / drivers / zink / zink_program.h
index da52f6009b2c969aff87dd72e1dc358fd4764c2f..bd6f7dbaa7a6801a109fc37570883593d7751e41 100644 (file)
@@ -27,7 +27,9 @@
 #include <vulkan/vulkan.h>
 
 #include "pipe/p_state.h"
+#include "util/u_inlines.h"
 
+struct zink_context;
 struct zink_screen;
 struct zink_shader;
 struct zink_gfx_pipeline_state;
@@ -36,7 +38,10 @@ struct hash_table;
 struct set;
 
 struct zink_gfx_program {
-   struct zink_shader *stages[PIPE_SHADER_TYPES - 1]; // compute stage doesn't belong here
+   struct pipe_reference reference;
+
+   VkShaderModule stages[PIPE_SHADER_TYPES - 1]; // compute stage doesn't belong here
+   struct zink_shader *shaders[PIPE_SHADER_TYPES - 1];
    VkDescriptorSetLayout dsl;
    VkPipelineLayout layout;
    unsigned num_descriptors;
@@ -45,7 +50,7 @@ struct zink_gfx_program {
 };
 
 struct zink_gfx_program *
-zink_create_gfx_program(struct zink_screen *screen,
+zink_create_gfx_program(struct zink_context *ctx,
                         struct zink_shader *stages[PIPE_SHADER_TYPES - 1]);
 
 void
@@ -59,6 +64,21 @@ zink_get_gfx_pipeline(struct zink_screen *screen,
                       enum pipe_prim_type mode);
 
 void
-zink_gfx_program_remove_shader(struct zink_gfx_program *prog, struct zink_shader *shader);
+zink_program_init(struct zink_context *ctx);
+
+void
+debug_describe_zink_gfx_program(char* buf, const struct zink_gfx_program *ptr);
+
+static inline void
+zink_gfx_program_reference(struct zink_screen *screen,
+                           struct zink_gfx_program **dst,
+                           struct zink_gfx_program *src)
+{
+   struct zink_gfx_program *old_dst = dst ? *dst : NULL;
 
+   if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference,
+                                (debug_reference_descriptor)debug_describe_zink_gfx_program))
+      zink_destroy_gfx_program(screen, old_dst);
+   if (dst) *dst = src;
+}
 #endif