[gtk+/wip/otte/rendernode: 81/100] vulkan: Split out command pool



commit d8f909bf6eed521785b1f63e1dd7daea134c0d04
Author: Benjamin Otte <otte redhat com>
Date:   Fri Dec 16 06:10:24 2016 +0100

    vulkan: Split out command pool
    
    This way we can pass the command pool around.
    And that allows us to allocate and submitcustom buffers.
    And that is necessary to make staging images work.

 gsk/Makefile.am                   |    2 +
 gsk/gskvulkancommandpool.c        |  104 +++++++++++++++++++++++++++++++++++++
 gsk/gskvulkancommandpoolprivate.h |   22 ++++++++
 gsk/gskvulkanimage.c              |   69 +++++++++++++++----------
 gsk/gskvulkanimageprivate.h       |    4 +-
 gsk/gskvulkanrender.c             |   89 +++++++-------------------------
 gsk/gskvulkanrenderer.c           |   10 ++--
 gsk/gskvulkanrendererprivate.h    |    2 +-
 gsk/gskvulkanrenderpass.c         |   22 ++++----
 gsk/gskvulkanrenderpassprivate.h  |    3 +-
 10 files changed, 210 insertions(+), 117 deletions(-)
---
diff --git a/gsk/Makefile.am b/gsk/Makefile.am
index 3959970..beadbf3 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 0000000..218a8c9
--- /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 0000000..0373908
--- /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 <gdk/gdk.h>
+
+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 4b4b381..f65b021 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 1c43d9a..3d6668e 100644
--- a/gsk/gskvulkanimageprivate.h
+++ b/gsk/gskvulkanimageprivate.h
@@ -3,6 +3,8 @@
 
 #include <gdk/gdk.h>
 
+#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 9eec621..dffd20d 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);
-
-  gsk_vulkan_buffer_free (buffer);
-}
+  vkCmdEndRenderPass (command_buffer);
 
-void
-gsk_vulkan_render_submit (GskVulkanRender *self)
-{
-  GSK_VK_CHECK (vkEndCommandBuffer, self->command_buffer);
+  gsk_vulkan_command_pool_submit_buffer (self->command_pool, command_buffer, self->fence);
 
-  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);
+  gsk_vulkan_buffer_free (buffer);
 
   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 08e94fc..cf550b3 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 c3485f7..982983a 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 81912dd..6e1461c 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 0ce7b8d..7d5478d 100644
--- a/gsk/gskvulkanrenderpassprivate.h
+++ b/gsk/gskvulkanrenderpassprivate.h
@@ -4,6 +4,7 @@
 #include <gdk/gdk.h>
 #include <gsk/gskrendernode.h>
 
+#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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]