1 #include "config.h"
2
3 #include "gskvulkantexturepipelineprivate.h"
4
5 struct _GskVulkanTexturePipeline
6 {
7 GObject parent_instance;
8 };
9
10 typedef struct _GskVulkanTextureInstance GskVulkanTextureInstance;
11
12 struct _GskVulkanTextureInstance
13 {
14 float rect[4];
15 float tex_rect[4];
16 };
17
G_DEFINE_TYPE(GskVulkanTexturePipeline,gsk_vulkan_texture_pipeline,GSK_TYPE_VULKAN_PIPELINE)18 G_DEFINE_TYPE (GskVulkanTexturePipeline, gsk_vulkan_texture_pipeline, GSK_TYPE_VULKAN_PIPELINE)
19
20 static const VkPipelineVertexInputStateCreateInfo *
21 gsk_vulkan_texture_pipeline_get_input_state_create_info (GskVulkanPipeline *self)
22 {
23 static const VkVertexInputBindingDescription vertexBindingDescriptions[] = {
24 {
25 .binding = 0,
26 .stride = sizeof (GskVulkanTextureInstance),
27 .inputRate = VK_VERTEX_INPUT_RATE_INSTANCE
28 }
29 };
30 static const VkVertexInputAttributeDescription vertexInputAttributeDescription[] = {
31 {
32 .location = 0,
33 .binding = 0,
34 .format = VK_FORMAT_R32G32B32A32_SFLOAT,
35 .offset = G_STRUCT_OFFSET (GskVulkanTextureInstance, rect),
36 },
37 {
38 .location = 1,
39 .binding = 0,
40 .format = VK_FORMAT_R32G32B32A32_SFLOAT,
41 .offset = G_STRUCT_OFFSET (GskVulkanTextureInstance, tex_rect),
42 }
43 };
44 static const VkPipelineVertexInputStateCreateInfo info = {
45 .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
46 .vertexBindingDescriptionCount = G_N_ELEMENTS (vertexBindingDescriptions),
47 .pVertexBindingDescriptions = vertexBindingDescriptions,
48 .vertexAttributeDescriptionCount = G_N_ELEMENTS (vertexInputAttributeDescription),
49 .pVertexAttributeDescriptions = vertexInputAttributeDescription
50 };
51
52 return &info;
53 }
54
55 static void
gsk_vulkan_texture_pipeline_finalize(GObject * gobject)56 gsk_vulkan_texture_pipeline_finalize (GObject *gobject)
57 {
58 //GskVulkanTexturePipeline *self = GSK_VULKAN_TEXTURE_PIPELINE (gobject);
59
60 G_OBJECT_CLASS (gsk_vulkan_texture_pipeline_parent_class)->finalize (gobject);
61 }
62
63 static void
gsk_vulkan_texture_pipeline_class_init(GskVulkanTexturePipelineClass * klass)64 gsk_vulkan_texture_pipeline_class_init (GskVulkanTexturePipelineClass *klass)
65 {
66 GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass);
67
68 G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_texture_pipeline_finalize;
69
70 pipeline_class->get_input_state_create_info = gsk_vulkan_texture_pipeline_get_input_state_create_info;
71 }
72
73 static void
gsk_vulkan_texture_pipeline_init(GskVulkanTexturePipeline * self)74 gsk_vulkan_texture_pipeline_init (GskVulkanTexturePipeline *self)
75 {
76 }
77
78 GskVulkanPipeline *
gsk_vulkan_texture_pipeline_new(GdkVulkanContext * context,VkPipelineLayout layout,const char * shader_name,VkRenderPass render_pass)79 gsk_vulkan_texture_pipeline_new (GdkVulkanContext *context,
80 VkPipelineLayout layout,
81 const char *shader_name,
82 VkRenderPass render_pass)
83 {
84 return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_TEXTURE_PIPELINE, context, layout, shader_name, render_pass);
85 }
86
87 gsize
gsk_vulkan_texture_pipeline_count_vertex_data(GskVulkanTexturePipeline * pipeline)88 gsk_vulkan_texture_pipeline_count_vertex_data (GskVulkanTexturePipeline *pipeline)
89 {
90 return sizeof (GskVulkanTextureInstance);
91 }
92
93 void
gsk_vulkan_texture_pipeline_collect_vertex_data(GskVulkanTexturePipeline * pipeline,guchar * data,const graphene_rect_t * rect,const graphene_rect_t * tex_rect)94 gsk_vulkan_texture_pipeline_collect_vertex_data (GskVulkanTexturePipeline *pipeline,
95 guchar *data,
96 const graphene_rect_t *rect,
97 const graphene_rect_t *tex_rect)
98 {
99 GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) data;
100
101 instance->rect[0] = rect->origin.x;
102 instance->rect[1] = rect->origin.y;
103 instance->rect[2] = rect->size.width;
104 instance->rect[3] = rect->size.height;
105 instance->tex_rect[0] = tex_rect->origin.x;
106 instance->tex_rect[1] = tex_rect->origin.y;
107 instance->tex_rect[2] = tex_rect->size.width;
108 instance->tex_rect[3] = tex_rect->size.height;
109 }
110
111 gsize
gsk_vulkan_texture_pipeline_draw(GskVulkanTexturePipeline * pipeline,VkCommandBuffer command_buffer,gsize offset,gsize n_commands)112 gsk_vulkan_texture_pipeline_draw (GskVulkanTexturePipeline *pipeline,
113 VkCommandBuffer command_buffer,
114 gsize offset,
115 gsize n_commands)
116 {
117 vkCmdDraw (command_buffer,
118 6, n_commands,
119 0, offset);
120
121 return n_commands;
122 }
123