diff options
author | Benjamin Otte <otte@redhat.com> | 2016-12-14 09:40:15 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-12-20 18:01:11 +0100 |
commit | 08a2a29c26f12c7a856a5c24d1083a05f687a484 (patch) | |
tree | 248e6c0ef96e07ae9b96e2b3f8d1a4015e5043f4 /gsk/gskvulkanrender.c | |
parent | 7d837a2ae662ebfdc4202db63dcc0cd4b96ca5f3 (diff) | |
download | gtk+-08a2a29c26f12c7a856a5c24d1083a05f687a484.tar.gz |
vulkan: Add infrastructure for multiple pipelines
And use it to draw solid colors with a 2nd pipeline.
Diffstat (limited to 'gsk/gskvulkanrender.c')
-rw-r--r-- | gsk/gskvulkanrender.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 1c27648a9a..9eec621484 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -34,7 +34,7 @@ struct _GskVulkanRender uint32_t descriptor_pool_maxsets; VkDescriptorSet *descriptor_sets; gsize n_descriptor_sets; - GskVulkanPipeline *pipeline; + GskVulkanPipeline *pipelines[GSK_VULKAN_N_PIPELINES]; VkCommandBuffer command_buffer; @@ -164,8 +164,6 @@ gsk_vulkan_render_new (GskRenderer *renderer, self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan); - self->pipeline = gsk_vulkan_pipeline_new (self->layout, "blit", self->render_pass); - return self; } @@ -289,6 +287,29 @@ gsk_vulkan_render_collect_vertices (GskVulkanRender *self) return buffer; } +GskVulkanPipeline * +gsk_vulkan_render_get_pipeline (GskVulkanRender *self, + GskVulkanPipelineType type) +{ + static const struct { + const char *name; + } pipeline_info[GSK_VULKAN_N_PIPELINES] = { + { "blit" }, + { "color" } + }; + + g_return_val_if_fail (type < GSK_VULKAN_N_PIPELINES, NULL); + + if (self->pipelines[type] == NULL) + { + self->pipelines[type] = gsk_vulkan_pipeline_new (self->layout, + pipeline_info[type].name, + self->render_pass); + } + + return self->pipelines[type]; +} + VkDescriptorSet gsk_vulkan_render_get_descriptor_set (GskVulkanRender *self, gsize id) @@ -455,10 +476,6 @@ gsk_vulkan_render_draw (GskVulkanRender *self, }, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindPipeline (self->command_buffer, - VK_PIPELINE_BIND_POINT_GRAPHICS, - gsk_vulkan_pipeline_get_pipeline (self->pipeline)); - vkCmdBindVertexBuffers (self->command_buffer, 0, 1, @@ -547,6 +564,7 @@ gsk_vulkan_render_free (GskVulkanRender *self) GHashTableIter iter; gpointer key, value; VkDevice device; + guint i; gsk_vulkan_render_cleanup (self); @@ -566,7 +584,8 @@ gsk_vulkan_render_free (GskVulkanRender *self) } g_hash_table_unref (self->framebuffers); - g_clear_object (&self->pipeline); + for (i = 0; i < GSK_VULKAN_N_PIPELINES; i++) + g_clear_object (&self->pipelines[i]); g_clear_pointer (&self->layout, gsk_vulkan_pipeline_layout_unref); |