vulkan: Merge the two upload ops
authorBenjamin Otte <otte@redhat.com>
Thu, 13 Jul 2023 18:56:57 +0000 (20:56 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 11:16:43 +0000 (13:16 +0200)
Now they both use the same upload code.

gsk/vulkan/gskvulkanrenderpass.c
gsk/vulkan/gskvulkanuploadop.c
gsk/vulkan/gskvulkanuploadopprivate.h

index ea932fbf9e60d2e4882bd137e4b813ac06fae386..6f16a0a95058a0e353bec9ea2ca1b6247b9bdd01 100644 (file)
@@ -193,7 +193,7 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass       *self,
         result = gsk_vulkan_renderer_get_texture_image (renderer, texture);
         if (result == NULL)
           {
-            result = gsk_vulkan_upload_op (render, self->vulkan, texture);
+            result = gsk_vulkan_upload_texture_op (render, self->vulkan, texture);
             gsk_vulkan_renderer_add_texture_image (renderer, texture, result);
           }
 
@@ -471,7 +471,7 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass       *self,
   image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
   if (image == NULL)
     {
-      image = gsk_vulkan_upload_op (render, self->vulkan, texture);
+      image = gsk_vulkan_upload_texture_op (render, self->vulkan, texture);
       gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
     }
 
@@ -514,7 +514,7 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass       *self,
   image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
   if (image == NULL)
     {
-      image = gsk_vulkan_upload_op (render, self->vulkan, texture);
+      image = gsk_vulkan_upload_texture_op (render, self->vulkan, texture);
       gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
     }
 
index d3e26534caa9035f5e0c01176eb3b1f201571de7..4039a52c3d498ce77381c76de1179651503d5c02 100644 (file)
 
 #include "gdk/gdkmemoryformatprivate.h"
 
-typedef struct _GskVulkanUploadOp GskVulkanUploadOp;
+static void
+gsk_vulkan_upload_op_upload (GskVulkanOp       *op,
+                             GskVulkanUploader *uploader)
+{
+}
+
+static gsize
+gsk_vulkan_upload_op_count_vertex_data (GskVulkanOp *op,
+                                        gsize        n_bytes)
+{
+  return n_bytes;
+}
+
+static void
+gsk_vulkan_upload_op_collect_vertex_data (GskVulkanOp *op,
+                                          guchar      *data)
+{
+}
+
+static void
+gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp     *op,
+                                              GskVulkanRender *render)
+{
+}
+
+static GskVulkanOp *
+gsk_vulkan_upload_op_command (GskVulkanOp      *op,
+                              GskVulkanRender  *render,
+                              VkPipelineLayout  pipeline_layout,
+                              VkCommandBuffer   command_buffer,
+                              GskVulkanImage   *image,
+                              void              (* draw_func) (GskVulkanOp *, guchar *, gsize),
+                              GskVulkanBuffer **buffer)
+{
+  gsize stride;
+  guchar *data;
+
+  data = gsk_vulkan_image_try_map (image, &stride);
+  if (data)
+    {
+      draw_func (op, data, stride);
+
+      gsk_vulkan_image_unmap (image);
+      *buffer = NULL;
+    }
+  else
+    {
+      stride = gsk_vulkan_image_get_width (image) * 
+        gdk_memory_format_bytes_per_pixel (gsk_vulkan_image_get_format (image));
+      *buffer = gsk_vulkan_buffer_new_map (gsk_vulkan_render_get_context (render),
+                                           gsk_vulkan_image_get_height (image) * stride,
+                                           GSK_VULKAN_WRITE);
+      data = gsk_vulkan_buffer_map (*buffer);
+
+      draw_func (op, data, stride);
+
+      gsk_vulkan_buffer_unmap (*buffer);
+
+      vkCmdPipelineBarrier (command_buffer,
+                            VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                            VK_PIPELINE_STAGE_TRANSFER_BIT,
+                            0,
+                            0, NULL,
+                            1, &(VkBufferMemoryBarrier) {
+                                .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
+                                .srcAccessMask = VK_ACCESS_HOST_WRITE_BIT,
+                                .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
+                                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                .buffer = gsk_vulkan_buffer_get_buffer (*buffer),
+                                .offset = 0,
+                                .size = VK_WHOLE_SIZE,
+                            },
+                            1, &(VkImageMemoryBarrier) {
+                                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                                .srcAccessMask = gsk_vulkan_image_get_vk_access (image),
+                                .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+                                .oldLayout = gsk_vulkan_image_get_vk_image_layout (image),
+                                .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                                .image = gsk_vulkan_image_get_vk_image (image),
+                                .subresourceRange = {
+                                  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                                  .baseMipLevel = 0,
+                                  .levelCount = 1,
+                                  .baseArrayLayer = 0,
+                                  .layerCount = 1
+                                },
+                            });
+      gsk_vulkan_image_set_vk_image_layout (image,
+                                            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                                            VK_ACCESS_TRANSFER_WRITE_BIT);
+
+      vkCmdCopyBufferToImage (command_buffer,
+                              gsk_vulkan_buffer_get_buffer (*buffer),
+                              gsk_vulkan_image_get_vk_image (image),
+                              VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+                              1,
+                              (VkBufferImageCopy[1]) {
+                                   {
+                                       .bufferOffset = 0,
+                                       .imageSubresource = {
+                                           .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                                           .mipLevel = 0,
+                                           .baseArrayLayer = 0,
+                                           .layerCount = 1
+                                       },
+                                       .imageOffset = { 0, 0, 0 },
+                                       .imageExtent = {
+                                           .width = gsk_vulkan_image_get_width (image),
+                                           .height = gsk_vulkan_image_get_height (image),
+                                           .depth = 1
+                                       }
+                                   }
+                              });
+    }
+
+  vkCmdPipelineBarrier (command_buffer,
+                        VK_PIPELINE_STAGE_TRANSFER_BIT,
+                        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+                        0,
+                        0, NULL,
+                        0, NULL,
+                        1, &(VkImageMemoryBarrier) {
+                            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                            .srcAccessMask = gsk_vulkan_image_get_vk_access (image),
+                            .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+                            .oldLayout = gsk_vulkan_image_get_vk_image_layout (image),
+                            .newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+                            .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+                            .image = gsk_vulkan_image_get_vk_image (image),
+                            .subresourceRange = {
+                              .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                              .baseMipLevel = 0,
+                              .levelCount = 1,
+                              .baseArrayLayer = 0,
+                              .layerCount = 1
+                            },
+                        });
 
-struct _GskVulkanUploadOp
+  gsk_vulkan_image_set_vk_image_layout (image,
+                                        VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+                                        VK_ACCESS_SHADER_READ_BIT);
+
+  return op->next;
+}
+
+typedef struct _GskVulkanUploadTextureOp GskVulkanUploadTextureOp;
+
+struct _GskVulkanUploadTextureOp
 {
   GskVulkanOp op;
 
   GskVulkanImage *image;
+  GskVulkanBuffer *buffer;
   GdkTexture *texture;
 };
 
 static void
-gsk_vulkan_upload_op_finish (GskVulkanOp *op)
+gsk_vulkan_upload_texture_op_finish (GskVulkanOp *op)
 {
-  GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+  GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
 
   g_object_unref (self->image);
+  g_clear_pointer (&self->buffer, gsk_vulkan_buffer_free);
   g_object_unref (self->texture);
 }
 
 static void
-gsk_vulkan_upload_op_print (GskVulkanOp *op,
-                            GString     *string,
-                            guint        indent)
+gsk_vulkan_upload_texture_op_print (GskVulkanOp *op,
+                                    GString     *string,
+                                    guint        indent)
 {
-  GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+  GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
 
   print_indent (string, indent);
-  g_string_append (string, "upload ");
+  g_string_append (string, "upload-texture ");
   print_image (string, self->image);
   print_newline (string);
 }
 
 static void
-gsk_vulkan_upload_op_upload (GskVulkanOp           *op,
-                             GskVulkanUploader     *uploader)
+gsk_vulkan_upload_texture_op_draw (GskVulkanOp *op,
+                                   guchar      *data,
+                                   gsize        stride)
 {
-  GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+  GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
   GdkTextureDownloader *downloader;
-  GskVulkanImageMap map;
 
   downloader = gdk_texture_downloader_new (self->texture);
   gdk_texture_downloader_set_format (downloader, gsk_vulkan_image_get_format (self->image));
-  gsk_vulkan_image_map_memory (self->image, uploader, GSK_VULKAN_WRITE, &map);
-  gdk_texture_downloader_download_into (downloader, map.data, map.stride);
-  gsk_vulkan_image_unmap_memory (self->image, uploader, &map);
+  gdk_texture_downloader_download_into (downloader, data, stride);
   gdk_texture_downloader_free (downloader);
 }
 
-static gsize
-gsk_vulkan_upload_op_count_vertex_data (GskVulkanOp *op,
-                                        gsize        n_bytes)
-{
-  return n_bytes;
-}
-
-static void
-gsk_vulkan_upload_op_collect_vertex_data (GskVulkanOp         *op,
-                                          guchar              *data)
-{
-}
-
-static void
-gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp     *op,
-                                              GskVulkanRender *render)
-{
-}
-
 static GskVulkanOp *
-gsk_vulkan_upload_op_command (GskVulkanOp      *op,
-                              GskVulkanRender  *render,
-                              VkPipelineLayout  pipeline_layout,
-                              VkCommandBuffer   command_buffer)
+gsk_vulkan_upload_texture_op_command (GskVulkanOp      *op,
+                                      GskVulkanRender  *render,
+                                      VkPipelineLayout  pipeline_layout,
+                                      VkCommandBuffer   command_buffer)
 {
-  return op->next;
+  GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
+
+  return gsk_vulkan_upload_op_command (op,
+                                       render,
+                                       pipeline_layout,
+                                       command_buffer,
+                                       self->image,
+                                       gsk_vulkan_upload_texture_op_draw,
+                                       &self->buffer);
 }
 
-static const GskVulkanOpClass GSK_VULKAN_UPLOAD_OP_CLASS = {
-  GSK_VULKAN_OP_SIZE (GskVulkanUploadOp),
+static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = {
+  GSK_VULKAN_OP_SIZE (GskVulkanUploadTextureOp),
   GSK_VULKAN_STAGE_UPLOAD,
   NULL,
   NULL,
-  gsk_vulkan_upload_op_finish,
-  gsk_vulkan_upload_op_print,
+  gsk_vulkan_upload_texture_op_finish,
+  gsk_vulkan_upload_texture_op_print,
   gsk_vulkan_upload_op_upload,
   gsk_vulkan_upload_op_count_vertex_data,
   gsk_vulkan_upload_op_collect_vertex_data,
   gsk_vulkan_upload_op_reserve_descriptor_sets,
-  gsk_vulkan_upload_op_command
+  gsk_vulkan_upload_texture_op_command
 };
 
 GskVulkanImage *
-gsk_vulkan_upload_op (GskVulkanRender  *render,
-                      GdkVulkanContext *context,
-                      GdkTexture       *texture)
+gsk_vulkan_upload_texture_op (GskVulkanRender  *render,
+                              GdkVulkanContext *context,
+                              GdkTexture       *texture)
 {
-  GskVulkanUploadOp *self;
+  GskVulkanUploadTextureOp *self;
 
-  self = (GskVulkanUploadOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_OP_CLASS);
+  self = (GskVulkanUploadTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS);
 
   self->texture = g_object_ref (texture);
   self->image = gsk_vulkan_image_new_for_upload (context,
@@ -152,10 +290,11 @@ gsk_vulkan_upload_cairo_op_print (GskVulkanOp *op,
 }
 
 static void
-gsk_vulkan_upload_cairo_op_draw (GskVulkanUploadCairoOp *self,
-                                 guchar                 *data,
-                                 gsize                   stride)
+gsk_vulkan_upload_cairo_op_draw (GskVulkanOp *op,
+                                 guchar      *data,
+                                 gsize        stride)
 {
+  GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
   cairo_surface_t *surface;
   cairo_t *cr;
   int width, height;
@@ -181,31 +320,6 @@ gsk_vulkan_upload_cairo_op_draw (GskVulkanUploadCairoOp *self,
   cairo_surface_destroy (surface);
 }
 
-static void
-gsk_vulkan_upload_cairo_op_upload (GskVulkanOp       *op,
-                                   GskVulkanUploader *uploader)
-{
-}
-
-static gsize
-gsk_vulkan_upload_cairo_op_count_vertex_data (GskVulkanOp *op,
-                                              gsize        n_bytes)
-{
-  return n_bytes;
-}
-
-static void
-gsk_vulkan_upload_cairo_op_collect_vertex_data (GskVulkanOp *op,
-                                                guchar      *data)
-{
-}
-
-static void
-gsk_vulkan_upload_cairo_op_reserve_descriptor_sets (GskVulkanOp     *op,
-                                                    GskVulkanRender *render)
-{
-}
-
 static GskVulkanOp *
 gsk_vulkan_upload_cairo_op_command (GskVulkanOp      *op,
                                     GskVulkanRender  *render,
@@ -213,118 +327,14 @@ gsk_vulkan_upload_cairo_op_command (GskVulkanOp      *op,
                                     VkCommandBuffer   command_buffer)
 {
   GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
-  gsize stride;
-  guchar *data;
-
-  data = gsk_vulkan_image_try_map (self->image, &stride);
-  if (data)
-    {
-      gsk_vulkan_upload_cairo_op_draw (self, data, stride);
-
-      gsk_vulkan_image_unmap (self->image);
-    }
-  else
-    {
-      stride = gsk_vulkan_image_get_width (self->image) * 
-        gdk_memory_format_bytes_per_pixel (gsk_vulkan_image_get_format (self->image));
-      self->buffer = gsk_vulkan_buffer_new_map (gsk_vulkan_render_get_context (render),
-                                                gsk_vulkan_image_get_height (self->image) * stride,
-                                                GSK_VULKAN_WRITE);
-      data = gsk_vulkan_buffer_map (self->buffer);
-
-      gsk_vulkan_upload_cairo_op_draw (self, data, stride);
-
-      gsk_vulkan_buffer_unmap (self->buffer);
-
-      vkCmdPipelineBarrier (command_buffer,
-                            VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
-                            VK_PIPELINE_STAGE_TRANSFER_BIT,
-                            0,
-                            0, NULL,
-                            1, &(VkBufferMemoryBarrier) {
-                                .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
-                                .srcAccessMask = VK_ACCESS_HOST_WRITE_BIT,
-                                .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
-                                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                                .buffer = gsk_vulkan_buffer_get_buffer (self->buffer),
-                                .offset = 0,
-                                .size = VK_WHOLE_SIZE,
-                            },
-                            1, &(VkImageMemoryBarrier) {
-                                .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
-                                .srcAccessMask = gsk_vulkan_image_get_vk_access (self->image),
-                                .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-                                .oldLayout = gsk_vulkan_image_get_vk_image_layout (self->image),
-                                .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-                                .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                                .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                                .image = gsk_vulkan_image_get_vk_image (self->image),
-                                .subresourceRange = {
-                                  .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                  .baseMipLevel = 0,
-                                  .levelCount = 1,
-                                  .baseArrayLayer = 0,
-                                  .layerCount = 1
-                                },
-                            });
-      gsk_vulkan_image_set_vk_image_layout (self->image,
-                                            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-                                            VK_ACCESS_TRANSFER_WRITE_BIT);
-
-      vkCmdCopyBufferToImage (command_buffer,
-                              gsk_vulkan_buffer_get_buffer (self->buffer),
-                              gsk_vulkan_image_get_vk_image (self->image),
-                              VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-                              1,
-                              (VkBufferImageCopy[1]) {
-                                   {
-                                       .bufferOffset = 0,
-                                       .imageSubresource = {
-                                           .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                           .mipLevel = 0,
-                                           .baseArrayLayer = 0,
-                                           .layerCount = 1
-                                       },
-                                       .imageOffset = { 0, 0, 0 },
-                                       .imageExtent = {
-                                           .width = gsk_vulkan_image_get_width (self->image),
-                                           .height = gsk_vulkan_image_get_height (self->image),
-                                           .depth = 1
-                                       }
-                                   }
-                              });
-    }
 
-  vkCmdPipelineBarrier (command_buffer,
-                        VK_PIPELINE_STAGE_TRANSFER_BIT,
-                        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
-                        0,
-                        0, NULL,
-                        0, NULL,
-                        1, &(VkImageMemoryBarrier) {
-                            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
-                            .srcAccessMask = gsk_vulkan_image_get_vk_access (self->image),
-                            .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
-                            .oldLayout = gsk_vulkan_image_get_vk_image_layout (self->image),
-                            .newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-                            .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
-                            .image = gsk_vulkan_image_get_vk_image (self->image),
-                            .subresourceRange = {
-                              .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                              .baseMipLevel = 0,
-                              .levelCount = 1,
-                              .baseArrayLayer = 0,
-                              .layerCount = 1
-                            },
-                        });
-
-  gsk_vulkan_image_set_vk_image_layout (self->image,
-                                        VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
-                                        VK_ACCESS_SHADER_READ_BIT);
-
-  return op->next;
+  return gsk_vulkan_upload_op_command (op,
+                                       render,
+                                       pipeline_layout,
+                                       command_buffer,
+                                       self->image,
+                                       gsk_vulkan_upload_cairo_op_draw,
+                                       &self->buffer);
 }
 
 static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
@@ -334,10 +344,10 @@ static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
   NULL,
   gsk_vulkan_upload_cairo_op_finish,
   gsk_vulkan_upload_cairo_op_print,
-  gsk_vulkan_upload_cairo_op_upload,
-  gsk_vulkan_upload_cairo_op_count_vertex_data,
-  gsk_vulkan_upload_cairo_op_collect_vertex_data,
-  gsk_vulkan_upload_cairo_op_reserve_descriptor_sets,
+  gsk_vulkan_upload_op_upload,
+  gsk_vulkan_upload_op_count_vertex_data,
+  gsk_vulkan_upload_op_collect_vertex_data,
+  gsk_vulkan_upload_op_reserve_descriptor_sets,
   gsk_vulkan_upload_cairo_op_command
 };
 
index d94ddf5fc26e0b57d273bf20072e0f206a2633c8..dbb1fcfb830242d7bc34bb464b7ff6f9c6441e0d 100644 (file)
@@ -4,7 +4,7 @@
 
 G_BEGIN_DECLS
 
-GskVulkanImage *        gsk_vulkan_upload_op                            (GskVulkanRender                *render,
+GskVulkanImage *        gsk_vulkan_upload_texture_op                    (GskVulkanRender                *render,
                                                                          GdkVulkanContext               *context,
                                                                          GdkTexture                     *texture);