nouveau/nir: Implement load_global_constant
[mesa.git] / src / gallium / drivers / zink / zink_program.h
index ca989f9c4bd276116933d30766f45f3ba56f98f8..5e68783a2f80177ea6d36c3db90194c8e4d93174 100644 (file)
 #include <vulkan/vulkan.h>
 
 #include "pipe/p_state.h"
+#include "util/u_inlines.h"
+
+#include "zink_context.h"
 
 struct zink_screen;
 struct zink_shader;
 struct zink_gfx_pipeline_state;
 
+struct hash_table;
+struct set;
+
+struct zink_shader_module {
+   struct pipe_reference reference;
+   VkShaderModule shader;
+};
+
 struct zink_gfx_program {
-   struct zink_shader *stages[PIPE_SHADER_TYPES - 1]; // compute stage doesn't belong here
+   struct pipe_reference reference;
+
+   struct zink_shader_module *modules[ZINK_SHADER_COUNT]; // compute stage doesn't belong here
+   struct zink_shader *shaders[ZINK_SHADER_COUNT];
    VkDescriptorSetLayout dsl;
    VkPipelineLayout layout;
-   struct hash_table *pipelines[PIPE_PRIM_TRIANGLE_FAN + 1];
+   unsigned num_descriptors;
+   struct hash_table *pipelines[10]; // number of draw modes we support
+   struct set *render_passes;
 };
 
 struct zink_gfx_program *
-zink_create_gfx_program(struct zink_screen *screen,
-                        struct zink_shader *stages[PIPE_SHADER_TYPES - 1]);
+zink_create_gfx_program(struct zink_context *ctx,
+                        struct zink_shader *stages[ZINK_SHADER_COUNT]);
 
 void
 zink_destroy_gfx_program(struct zink_screen *screen,
@@ -53,4 +69,22 @@ zink_get_gfx_pipeline(struct zink_screen *screen,
                       struct zink_gfx_pipeline_state *state,
                       enum pipe_prim_type mode);
 
+void
+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