#include <vulkan/vulkan.h>
#include "pipe/p_state.h"
+#include "util/u_inlines.h"
+
+#include "zink_context.h"
-struct zink_context;
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;
unsigned num_descriptors;
- struct hash_table *pipelines[PIPE_PRIM_TRIANGLE_FAN + 1];
+ 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_context *ctx,
- struct zink_shader *stages[PIPE_SHADER_TYPES - 1]);
+ struct zink_shader *stages[ZINK_SHADER_COUNT]);
void
zink_destroy_gfx_program(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