diff --git a/gsk/Makefile.am b/gsk/Makefile.am index 395997035d..beadbf3996 100644 --- a/gsk/Makefile.am +++ b/gsk/Makefile.am @@ -25,6 +25,7 @@ noinst_LTLIBRARIES = if HAVE_VULKAN gsk_private_vulan_source_h = \ gskvulkanbufferprivate.h \ + gskvulkancommandpoolprivate.h \ gskvulkanimageprivate.h \ gskvulkanmemoryprivate.h \ gskvulkanpipelineprivate.h \ @@ -35,6 +36,7 @@ gsk_private_vulan_source_h = \ gskvulkanshaderprivate.h gsk_private_vulkan_source_c = \ gskvulkanbuffer.c \ + gskvulkancommandpool.c \ gskvulkanimage.c \ gskvulkanmemory.c \ gskvulkanpipeline.c \ diff --git a/gsk/gskvulkancommandpool.c b/gsk/gskvulkancommandpool.c new file mode 100644 index 0000000000..218a8c92fc --- /dev/null +++ b/gsk/gskvulkancommandpool.c @@ -0,0 +1,104 @@ +#include "config.h" + +#include "gskvulkancommandpoolprivate.h" +#include "gskvulkanpipelineprivate.h" + +struct _GskVulkanCommandPool +{ + GdkVulkanContext *vulkan; + + VkCommandPool vk_command_pool; +}; + +GskVulkanCommandPool * +gsk_vulkan_command_pool_new (GdkVulkanContext *context) +{ + GskVulkanCommandPool *self; + + self = g_slice_new0 (GskVulkanCommandPool); + + self->vulkan = g_object_ref (context); + + GSK_VK_CHECK (vkCreateCommandPool, gdk_vulkan_context_get_device (context), + &(const VkCommandPoolCreateInfo) { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .queueFamilyIndex = gdk_vulkan_context_get_queue_family_index (self->vulkan), + .flags = 0 + }, + NULL, + &self->vk_command_pool); + + return self; +} + +void +gsk_vulkan_command_pool_free (GskVulkanCommandPool *self) +{ + vkDestroyCommandPool (gdk_vulkan_context_get_device (self->vulkan), + self->vk_command_pool, + NULL); + + g_slice_free (GskVulkanCommandPool, self); +} + +void +gsk_vulkan_command_pool_reset (GskVulkanCommandPool *self) +{ + GSK_VK_CHECK (vkResetCommandPool, gdk_vulkan_context_get_device (self->vulkan), + self->vk_command_pool, + 0); +} + +VkCommandBuffer +gsk_vulkan_command_pool_get_buffer (GskVulkanCommandPool *self) +{ + VkCommandBuffer command_buffer; + + GSK_VK_CHECK (vkAllocateCommandBuffers, gdk_vulkan_context_get_device (self->vulkan), + &(VkCommandBufferAllocateInfo) { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = self->vk_command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1, + }, + &command_buffer); + + GSK_VK_CHECK (vkBeginCommandBuffer, command_buffer, + &(VkCommandBufferBeginInfo) { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = 0 + }); + + return command_buffer; +} + +void +gsk_vulkan_command_pool_submit_buffer (GskVulkanCommandPool *self, + VkCommandBuffer command_buffer, + VkFence fence) +{ + GSK_VK_CHECK (vkEndCommandBuffer, command_buffer); + + GSK_VK_CHECK (vkQueueSubmit, gdk_vulkan_context_get_queue (self->vulkan), + 1, + &(VkSubmitInfo) { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = 1, + .pWaitSemaphores = (VkSemaphore[1]) { + gdk_vulkan_context_get_draw_semaphore (self->vulkan) + }, + .pWaitDstStageMask = (VkPipelineStageFlags []) { + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + }, + .commandBufferCount = 1, + .pCommandBuffers = (VkCommandBuffer[1]) { + command_buffer + }, + .signalSemaphoreCount = 1, + .pSignalSemaphores = (VkSemaphore[1]) { + gdk_vulkan_context_get_draw_semaphore (self->vulkan) + } + }, + fence); +} + diff --git a/gsk/gskvulkancommandpoolprivate.h b/gsk/gskvulkancommandpoolprivate.h new file mode 100644 index 0000000000..037390812b --- /dev/null +++ b/gsk/gskvulkancommandpoolprivate.h @@ -0,0 +1,22 @@ +#ifndef __GSK_VULKAN_COMMAND_POOL_PRIVATE_H__ +#define __GSK_VULKAN_COMMAND_POOL_PRIVATE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GskVulkanCommandPool GskVulkanCommandPool; + +GskVulkanCommandPool * gsk_vulkan_command_pool_new (GdkVulkanContext *context); +void gsk_vulkan_command_pool_free (GskVulkanCommandPool *self); + +void gsk_vulkan_command_pool_reset (GskVulkanCommandPool *self); + +VkCommandBuffer gsk_vulkan_command_pool_get_buffer (GskVulkanCommandPool *self); +void gsk_vulkan_command_pool_submit_buffer (GskVulkanCommandPool *self, + VkCommandBuffer buffer, + VkFence fence); + +G_END_DECLS + +#endif /* __GSK_VULKAN_COMMAND_POOL_PRIVATE_H__ */ diff --git a/gsk/gskvulkanimage.c b/gsk/gskvulkanimage.c index 4b4b381010..f65b021fe4 100644 --- a/gsk/gskvulkanimage.c +++ b/gsk/gskvulkanimage.c @@ -139,15 +139,16 @@ gsk_vulkan_image_ensure_view (GskVulkanImage *self, } GskVulkanImage * -gsk_vulkan_image_new_from_data_via_staging_buffer (GdkVulkanContext *context, - VkCommandBuffer command_buffer, - guchar *data, - gsize width, - gsize height, - gsize stride) +gsk_vulkan_image_new_from_data_via_staging_buffer (GdkVulkanContext *context, + GskVulkanCommandPool *command_pool, + guchar *data, + gsize width, + gsize height, + gsize stride) { GskVulkanImage *self; GskVulkanBuffer *staging; + VkCommandBuffer command_buffer; guchar *mem; staging = gsk_vulkan_buffer_new_staging (context, width * height * 4); @@ -174,6 +175,8 @@ gsk_vulkan_image_new_from_data_via_staging_buffer (GdkVulkanContext *context, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + command_buffer = gsk_vulkan_command_pool_get_buffer (command_pool); + vkCmdPipelineBarrier (command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, @@ -249,6 +252,8 @@ gsk_vulkan_image_new_from_data_via_staging_buffer (GdkVulkanContext *context, } }); + gsk_vulkan_command_pool_submit_buffer (command_pool, command_buffer, VK_NULL_HANDLE); + /* XXX: Is this okay or do we need to keep the staging image around until the commands execute */ gsk_vulkan_buffer_free (staging); @@ -258,14 +263,15 @@ gsk_vulkan_image_new_from_data_via_staging_buffer (GdkVulkanContext *context, } GskVulkanImage * -gsk_vulkan_image_new_from_data_via_staging_image (GdkVulkanContext *context, - VkCommandBuffer command_buffer, - guchar *data, - gsize width, - gsize height, - gsize stride) +gsk_vulkan_image_new_from_data_via_staging_image (GdkVulkanContext *context, + GskVulkanCommandPool *command_pool, + guchar *data, + gsize width, + gsize height, + gsize stride) { GskVulkanImage *self, *staging; + VkCommandBuffer command_buffer; staging = gsk_vulkan_image_new (context, width, @@ -283,6 +289,8 @@ gsk_vulkan_image_new_from_data_via_staging_image (GdkVulkanContext *context, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + command_buffer = gsk_vulkan_command_pool_get_buffer (command_pool); + vkCmdPipelineBarrier (command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, @@ -380,6 +388,8 @@ gsk_vulkan_image_new_from_data_via_staging_image (GdkVulkanContext *context, } }); + gsk_vulkan_command_pool_submit_buffer (command_pool, command_buffer, VK_NULL_HANDLE); + /* XXX: Is this okay or do we need to keep the staging image around until the commands execute */ g_object_unref (staging); @@ -389,15 +399,18 @@ gsk_vulkan_image_new_from_data_via_staging_image (GdkVulkanContext *context, } GskVulkanImage * -gsk_vulkan_image_new_from_data_directly (GdkVulkanContext *context, - VkCommandBuffer command_buffer, - guchar *data, - gsize width, - gsize height, - gsize stride) +gsk_vulkan_image_new_from_data_directly (GdkVulkanContext *context, + GskVulkanCommandPool *command_pool, + guchar *data, + gsize width, + gsize height, + gsize stride) { + VkCommandBuffer command_buffer; GskVulkanImage *self; + command_buffer = gsk_vulkan_command_pool_get_buffer (command_pool); + self = gsk_vulkan_image_new (context, width, height, @@ -433,25 +446,27 @@ gsk_vulkan_image_new_from_data_directly (GdkVulkanContext *context, } }); + gsk_vulkan_command_pool_submit_buffer (command_pool, command_buffer, VK_NULL_HANDLE); + gsk_vulkan_image_ensure_view (self, VK_FORMAT_B8G8R8A8_SRGB); return self; } GskVulkanImage * -gsk_vulkan_image_new_from_data (GdkVulkanContext *context, - VkCommandBuffer command_buffer, - guchar *data, - gsize width, - gsize height, - gsize stride) +gsk_vulkan_image_new_from_data (GdkVulkanContext *context, + GskVulkanCommandPool *command_pool, + guchar *data, + gsize width, + gsize height, + gsize stride) { if (GSK_RENDER_MODE_CHECK (STAGING_BUFFER)) - return gsk_vulkan_image_new_from_data_via_staging_buffer (context, command_buffer, data, width, height, stride); + return gsk_vulkan_image_new_from_data_via_staging_buffer (context, command_pool, data, width, height, stride); if (GSK_RENDER_MODE_CHECK (STAGING_IMAGE)) - return gsk_vulkan_image_new_from_data_via_staging_image (context, command_buffer, data, width, height, stride); + return gsk_vulkan_image_new_from_data_via_staging_image (context, command_pool, data, width, height, stride); else - return gsk_vulkan_image_new_from_data_directly (context, command_buffer, data, width, height, stride); + return gsk_vulkan_image_new_from_data_directly (context, command_pool, data, width, height, stride); } GskVulkanImage * diff --git a/gsk/gskvulkanimageprivate.h b/gsk/gskvulkanimageprivate.h index 1c43d9aa9b..3d6668e347 100644 --- a/gsk/gskvulkanimageprivate.h +++ b/gsk/gskvulkanimageprivate.h @@ -3,6 +3,8 @@ #include +#include "gsk/gskvulkancommandpoolprivate.h" + G_BEGIN_DECLS #define GSK_TYPE_VULKAN_IMAGE (gsk_vulkan_image_get_type ()) @@ -15,7 +17,7 @@ GskVulkanImage * gsk_vulkan_image_new_for_swapchain (GdkVulk gsize width, gsize height); GskVulkanImage * gsk_vulkan_image_new_from_data (GdkVulkanContext *context, - VkCommandBuffer command_buffer, + GskVulkanCommandPool *pool, guchar *data, gsize width, gsize height, diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 9eec621484..dffd20d256 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -4,6 +4,7 @@ #include "gskrendererprivate.h" #include "gskvulkanbufferprivate.h" +#include "gskvulkancommandpoolprivate.h" #include "gskvulkanpipelineprivate.h" #include "gskvulkanrenderpassprivate.h" @@ -24,7 +25,7 @@ struct _GskVulkanRender VkRect2D scissor; GHashTable *framebuffers; - VkCommandPool command_pool; + GskVulkanCommandPool *command_pool; VkFence fence; VkRenderPass render_pass; GskVulkanPipelineLayout *layout; @@ -36,8 +37,6 @@ struct _GskVulkanRender gsize n_descriptor_sets; GskVulkanPipeline *pipelines[GSK_VULKAN_N_PIPELINES]; - VkCommandBuffer command_buffer; - GskVulkanImage *target; GSList *render_passes; @@ -87,15 +86,7 @@ gsk_vulkan_render_new (GskRenderer *renderer, device = gdk_vulkan_context_get_device (self->vulkan); - GSK_VK_CHECK (vkCreateCommandPool, device, - &(const VkCommandPoolCreateInfo) { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .queueFamilyIndex = gdk_vulkan_context_get_queue_family_index (self->vulkan), - .flags = 0 - }, - NULL, - &self->command_pool); - + self->command_pool = gsk_vulkan_command_pool_new (self->vulkan); GSK_VK_CHECK (vkCreateFence, device, &(VkFenceCreateInfo) { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, @@ -244,7 +235,7 @@ gsk_vulkan_render_upload (GskVulkanRender *self) for (l = self->render_passes; l; l = l->next) { - gsk_vulkan_render_pass_upload (l->data, self, self->command_buffer); + gsk_vulkan_render_pass_upload (l->data, self, self->command_pool); } } @@ -437,13 +428,16 @@ gsk_vulkan_render_draw (GskVulkanRender *self, VkSampler sampler) { GskVulkanBuffer *buffer; + VkCommandBuffer command_buffer; GSList *l; gsk_vulkan_render_prepare_descriptor_sets (self, sampler); + command_buffer = gsk_vulkan_command_pool_get_buffer (self->command_pool); + buffer = gsk_vulkan_render_collect_vertices (self); - vkCmdSetViewport (self->command_buffer, + vkCmdSetViewport (command_buffer, 0, 1, &(VkViewport) { @@ -455,12 +449,12 @@ gsk_vulkan_render_draw (GskVulkanRender *self, .maxDepth = 1 }); - vkCmdSetScissor (self->command_buffer, + vkCmdSetScissor (command_buffer, 0, 1, &self->scissor); - vkCmdBeginRenderPass (self->command_buffer, + vkCmdBeginRenderPass (command_buffer, &(VkRenderPassBeginInfo) { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, .renderPass = self->render_pass, @@ -476,7 +470,7 @@ gsk_vulkan_render_draw (GskVulkanRender *self, }, VK_SUBPASS_CONTENTS_INLINE); - vkCmdBindVertexBuffers (self->command_buffer, + vkCmdBindVertexBuffers (command_buffer, 0, 1, (VkBuffer[1]) { @@ -486,38 +480,14 @@ gsk_vulkan_render_draw (GskVulkanRender *self, for (l = self->render_passes; l; l = l->next) { - gsk_vulkan_render_pass_draw (l->data, self, self->layout, self->command_buffer); + gsk_vulkan_render_pass_draw (l->data, self, self->layout, command_buffer); } - vkCmdEndRenderPass (self->command_buffer); + vkCmdEndRenderPass (command_buffer); + + gsk_vulkan_command_pool_submit_buffer (self->command_pool, command_buffer, self->fence); gsk_vulkan_buffer_free (buffer); -} - -void -gsk_vulkan_render_submit (GskVulkanRender *self) -{ - GSK_VK_CHECK (vkEndCommandBuffer, self->command_buffer); - - GSK_VK_CHECK (vkQueueSubmit, gdk_vulkan_context_get_queue (self->vulkan), - 1, - &(VkSubmitInfo) { - .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .waitSemaphoreCount = 1, - .pWaitSemaphores = (VkSemaphore[1]) { - gdk_vulkan_context_get_draw_semaphore (self->vulkan) - }, - .pWaitDstStageMask = (VkPipelineStageFlags []) { - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - }, - .commandBufferCount = 1, - .pCommandBuffers = &self->command_buffer, - .signalSemaphoreCount = 1, - .pSignalSemaphores = (VkSemaphore[1]) { - gdk_vulkan_context_get_draw_semaphore (self->vulkan) - } - }, - self->fence); if (GSK_RENDER_MODE_CHECK (SYNC)) { @@ -544,9 +514,8 @@ gsk_vulkan_render_cleanup (GskVulkanRender *self) GSK_VK_CHECK (vkResetFences, device, 1, &self->fence); - GSK_VK_CHECK (vkResetCommandPool, device, - self->command_pool, - 0); + + gsk_vulkan_command_pool_reset (self->command_pool); g_hash_table_remove_all (self->descriptor_set_indexes); @@ -602,9 +571,8 @@ gsk_vulkan_render_free (GskVulkanRender *self) vkDestroyFence (device, self->fence, NULL); - vkDestroyCommandPool (device, - self->command_pool, - NULL); + + gsk_vulkan_command_pool_free (self->command_pool); g_slice_free (GskVulkanRender, self); } @@ -619,30 +587,11 @@ void gsk_vulkan_render_reset (GskVulkanRender *self, GskVulkanImage *target) { - VkDevice device; - gsk_vulkan_render_cleanup (self); self->target = g_object_ref (target); gsk_vulkan_render_compute_mvp (self); - - device = gdk_vulkan_context_get_device (self->vulkan); - - GSK_VK_CHECK (vkAllocateCommandBuffers, device, - &(VkCommandBufferAllocateInfo) { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .commandPool = self->command_pool, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandBufferCount = 1, - }, - &self->command_buffer); - - GSK_VK_CHECK (vkBeginCommandBuffer, self->command_buffer, - &(VkCommandBufferBeginInfo) { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, - .flags = 0 - }); } GskRenderer * diff --git a/gsk/gskvulkanrenderer.c b/gsk/gskvulkanrenderer.c index 08e94fc1c7..cf550b3fea 100644 --- a/gsk/gskvulkanrenderer.c +++ b/gsk/gskvulkanrenderer.c @@ -196,8 +196,6 @@ gsk_vulkan_renderer_render (GskRenderer *renderer, gsk_vulkan_render_draw (render, self->sampler); - gsk_vulkan_render_submit (render); - #ifdef G_ENABLE_DEBUG cpu_time = gsk_profiler_timer_end (profiler, self->profile_timers.cpu_time); gsk_profiler_timer_set (profiler, self->profile_timers.cpu_time, cpu_time); @@ -271,9 +269,9 @@ gsk_vulkan_renderer_clear_texture (gpointer p) } GskVulkanImage * -gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self, - GskTexture *texture, - VkCommandBuffer command_buffer) +gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self, + GskTexture *texture, + GskVulkanCommandPool *command_pool) { GskVulkanTextureData *data; cairo_surface_t *surface; @@ -285,7 +283,7 @@ gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self, surface = gsk_texture_download (texture); image = gsk_vulkan_image_new_from_data (self->vulkan, - command_buffer, + command_pool, cairo_image_surface_get_data (surface), cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), diff --git a/gsk/gskvulkanrendererprivate.h b/gsk/gskvulkanrendererprivate.h index c3485f76b3..982983a777 100644 --- a/gsk/gskvulkanrendererprivate.h +++ b/gsk/gskvulkanrendererprivate.h @@ -23,7 +23,7 @@ GType gsk_vulkan_renderer_get_type (void) G_GNUC_CONST; GskVulkanImage * gsk_vulkan_renderer_ref_texture_image (GskVulkanRenderer *self, GskTexture *texture, - VkCommandBuffer command_buffer); + GskVulkanCommandPool *command_pool); G_END_DECLS diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 81912dd8be..6e1461c5df 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -173,10 +173,10 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, } static void -gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self, - GskVulkanOpRender *op, - GskVulkanRender *render, - VkCommandBuffer command_buffer) +gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self, + GskVulkanOpRender *op, + GskVulkanRender *render, + GskVulkanCommandPool *command_pool) { graphene_rect_t bounds; cairo_surface_t *surface; @@ -195,7 +195,7 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self, cairo_destroy (cr); op->source = gsk_vulkan_image_new_from_data (self->vulkan, - command_buffer, + command_pool, cairo_image_surface_get_data (surface), cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), @@ -207,9 +207,9 @@ gsk_vulkan_render_pass_upload_fallback (GskVulkanRenderPass *self, } void -gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, - GskVulkanRender *render, - VkCommandBuffer command_buffer) +gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, + GskVulkanRender *render, + GskVulkanCommandPool *command_pool) { GskVulkanOp *op; guint i; @@ -221,14 +221,14 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, switch (op->type) { case GSK_VULKAN_OP_FALLBACK: - gsk_vulkan_render_pass_upload_fallback (self, &op->render, render, command_buffer); + gsk_vulkan_render_pass_upload_fallback (self, &op->render, render, command_pool); break; case GSK_VULKAN_OP_SURFACE: { cairo_surface_t *surface = gsk_cairo_node_get_surface (op->render.node); op->render.source = gsk_vulkan_image_new_from_data (self->vulkan, - command_buffer, + command_pool, cairo_image_surface_get_data (surface), cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), @@ -241,7 +241,7 @@ gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, { op->render.source = gsk_vulkan_renderer_ref_texture_image (GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)), gsk_texture_node_get_texture (op->render.node), - command_buffer); + command_pool); gsk_vulkan_render_add_cleanup_image (render, op->render.source); } break; diff --git a/gsk/gskvulkanrenderpassprivate.h b/gsk/gskvulkanrenderpassprivate.h index 0ce7b8d385..7d5478dabc 100644 --- a/gsk/gskvulkanrenderpassprivate.h +++ b/gsk/gskvulkanrenderpassprivate.h @@ -4,6 +4,7 @@ #include #include +#include "gsk/gskvulkancommandpoolprivate.h" #include "gsk/gskvulkanrenderprivate.h" G_BEGIN_DECLS @@ -20,7 +21,7 @@ void gsk_vulkan_render_pass_add (GskVulk void gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self, GskVulkanRender *render, - VkCommandBuffer command_buffer); + GskVulkanCommandPool *command_pool); gsize gsk_vulkan_render_pass_count_vertices (GskVulkanRenderPass *self); gsize gsk_vulkan_render_pass_collect_vertices (GskVulkanRenderPass *self,