From 385ab749222491ba90adec3c64b45b56e038929e Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 13 Jul 2023 19:48:50 +0200 Subject: [PATCH] vulkan: Merge te 2 upload ops They are about to share a ton of code, sothey should be in the same source file. This commit just does the copying, no functional changes. --- gsk/meson.build | 1 - gsk/vulkan/gskvulkanrenderpass.c | 1 - gsk/vulkan/gskvulkanuploadcairoop.c | 255 --------------------- gsk/vulkan/gskvulkanuploadcairoopprivate.h | 16 -- gsk/vulkan/gskvulkanuploadop.c | 250 ++++++++++++++++++++ gsk/vulkan/gskvulkanuploadopprivate.h | 6 + 6 files changed, 256 insertions(+), 273 deletions(-) delete mode 100644 gsk/vulkan/gskvulkanuploadcairoop.c delete mode 100644 gsk/vulkan/gskvulkanuploadcairoopprivate.h diff --git a/gsk/meson.build b/gsk/meson.build index 7422b8eac3..260ed72c01 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -133,7 +133,6 @@ if have_vulkan 'vulkan/gskvulkanrenderpassop.c', 'vulkan/gskvulkanscissorop.c', 'vulkan/gskvulkantextureop.c', - 'vulkan/gskvulkanuploadcairoop.c', 'vulkan/gskvulkanuploadop.c', ]) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index f3cdb72edf..ea932fbf9e 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -30,7 +30,6 @@ #include "gskvulkanpushconstantsopprivate.h" #include "gskvulkanscissoropprivate.h" #include "gskvulkantextureopprivate.h" -#include "gskvulkanuploadcairoopprivate.h" #include "gskvulkanuploadopprivate.h" #include "gskprivate.h" diff --git a/gsk/vulkan/gskvulkanuploadcairoop.c b/gsk/vulkan/gskvulkanuploadcairoop.c deleted file mode 100644 index e636012f8d..0000000000 --- a/gsk/vulkan/gskvulkanuploadcairoop.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "config.h" - -#include "gskvulkanuploadcairoopprivate.h" - -#include "gskvulkanprivate.h" - -#include "gdk/gdkmemoryformatprivate.h" - -typedef struct _GskVulkanUploadCairoOp GskVulkanUploadCairoOp; - -struct _GskVulkanUploadCairoOp -{ - GskVulkanOp op; - - GskVulkanImage *image; - GskRenderNode *node; - graphene_rect_t viewport; - - GskVulkanBuffer *buffer; -}; - -static void -gsk_vulkan_upload_cairo_op_finish (GskVulkanOp *op) -{ - GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op; - - g_object_unref (self->image); - gsk_render_node_unref (self->node); - - g_clear_pointer (&self->buffer, gsk_vulkan_buffer_free); -} - -static void -gsk_vulkan_upload_cairo_op_print (GskVulkanOp *op, - GString *string, - guint indent) -{ - GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op; - - print_indent (string, indent); - g_string_append (string, "upload-cairo "); - print_image (string, self->image); - print_newline (string); -} - -static void -gsk_vulkan_upload_cairo_op_draw (GskVulkanUploadCairoOp *self, - guchar *data, - gsize stride) -{ - cairo_surface_t *surface; - cairo_t *cr; - int width, height; - - width = gsk_vulkan_image_get_width (self->image); - height = gsk_vulkan_image_get_height (self->image); - - surface = cairo_image_surface_create_for_data (data, - CAIRO_FORMAT_ARGB32, - width, height, - stride); - cairo_surface_set_device_scale (surface, - width / self->viewport.size.width, - height / self->viewport.size.height); - cr = cairo_create (surface); - cairo_translate (cr, -self->viewport.origin.x, -self->viewport.origin.y); - - gsk_render_node_draw (self->node, cr); - - cairo_destroy (cr); - - cairo_surface_finish (surface); - 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, - VkPipelineLayout pipeline_layout, - 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; -} - -static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanUploadCairoOp), - GSK_VULKAN_STAGE_UPLOAD, - NULL, - 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_cairo_op_command -}; - -GskVulkanImage * -gsk_vulkan_upload_cairo_op (GskVulkanRender *render, - GdkVulkanContext *context, - GskRenderNode *node, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport) -{ - GskVulkanUploadCairoOp *self; - - self = (GskVulkanUploadCairoOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS); - - self->node = gsk_render_node_ref (node); - self->image = gsk_vulkan_image_new_for_upload (context, - GDK_MEMORY_DEFAULT, - ceil (graphene_vec2_get_x (scale) * viewport->size.width), - ceil (graphene_vec2_get_y (scale) * viewport->size.height)); - self->viewport = *viewport; - - return self->image; -} diff --git a/gsk/vulkan/gskvulkanuploadcairoopprivate.h b/gsk/vulkan/gskvulkanuploadcairoopprivate.h deleted file mode 100644 index ab966c5db7..0000000000 --- a/gsk/vulkan/gskvulkanuploadcairoopprivate.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "gskvulkanopprivate.h" - -G_BEGIN_DECLS - -GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRender *render, - GdkVulkanContext *context, - GskRenderNode *node, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport); - - - -G_END_DECLS - diff --git a/gsk/vulkan/gskvulkanuploadop.c b/gsk/vulkan/gskvulkanuploadop.c index d426bad44a..d3e26534ca 100644 --- a/gsk/vulkan/gskvulkanuploadop.c +++ b/gsk/vulkan/gskvulkanuploadop.c @@ -4,6 +4,8 @@ #include "gskvulkanprivate.h" +#include "gdk/gdkmemoryformatprivate.h" + typedef struct _GskVulkanUploadOp GskVulkanUploadOp; struct _GskVulkanUploadOp @@ -111,3 +113,251 @@ gsk_vulkan_upload_op (GskVulkanRender *render, return self->image; } + +typedef struct _GskVulkanUploadCairoOp GskVulkanUploadCairoOp; + +struct _GskVulkanUploadCairoOp +{ + GskVulkanOp op; + + GskVulkanImage *image; + GskRenderNode *node; + graphene_rect_t viewport; + + GskVulkanBuffer *buffer; +}; + +static void +gsk_vulkan_upload_cairo_op_finish (GskVulkanOp *op) +{ + GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op; + + g_object_unref (self->image); + gsk_render_node_unref (self->node); + + g_clear_pointer (&self->buffer, gsk_vulkan_buffer_free); +} + +static void +gsk_vulkan_upload_cairo_op_print (GskVulkanOp *op, + GString *string, + guint indent) +{ + GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op; + + print_indent (string, indent); + g_string_append (string, "upload-cairo "); + print_image (string, self->image); + print_newline (string); +} + +static void +gsk_vulkan_upload_cairo_op_draw (GskVulkanUploadCairoOp *self, + guchar *data, + gsize stride) +{ + cairo_surface_t *surface; + cairo_t *cr; + int width, height; + + width = gsk_vulkan_image_get_width (self->image); + height = gsk_vulkan_image_get_height (self->image); + + surface = cairo_image_surface_create_for_data (data, + CAIRO_FORMAT_ARGB32, + width, height, + stride); + cairo_surface_set_device_scale (surface, + width / self->viewport.size.width, + height / self->viewport.size.height); + cr = cairo_create (surface); + cairo_translate (cr, -self->viewport.origin.x, -self->viewport.origin.y); + + gsk_render_node_draw (self->node, cr); + + cairo_destroy (cr); + + cairo_surface_finish (surface); + 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, + VkPipelineLayout pipeline_layout, + 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; +} + +static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = { + GSK_VULKAN_OP_SIZE (GskVulkanUploadCairoOp), + GSK_VULKAN_STAGE_UPLOAD, + NULL, + 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_cairo_op_command +}; + +GskVulkanImage * +gsk_vulkan_upload_cairo_op (GskVulkanRender *render, + GdkVulkanContext *context, + GskRenderNode *node, + const graphene_vec2_t *scale, + const graphene_rect_t *viewport) +{ + GskVulkanUploadCairoOp *self; + + self = (GskVulkanUploadCairoOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS); + + self->node = gsk_render_node_ref (node); + self->image = gsk_vulkan_image_new_for_upload (context, + GDK_MEMORY_DEFAULT, + ceil (graphene_vec2_get_x (scale) * viewport->size.width), + ceil (graphene_vec2_get_y (scale) * viewport->size.height)); + self->viewport = *viewport; + + return self->image; +} diff --git a/gsk/vulkan/gskvulkanuploadopprivate.h b/gsk/vulkan/gskvulkanuploadopprivate.h index 2948a879d4..d94ddf5fc2 100644 --- a/gsk/vulkan/gskvulkanuploadopprivate.h +++ b/gsk/vulkan/gskvulkanuploadopprivate.h @@ -8,6 +8,12 @@ GskVulkanImage * gsk_vulkan_upload_op (GskVulk GdkVulkanContext *context, GdkTexture *texture); +GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRender *render, + GdkVulkanContext *context, + GskRenderNode *node, + const graphene_vec2_t *scale, + const graphene_rect_t *viewport); + G_END_DECLS -- 2.30.2