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