From: Benjamin Otte Date: Thu, 13 Jul 2023 18:56:57 +0000 (+0200) Subject: vulkan: Merge the two upload ops X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~60^2~14 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=822641c1610e0a7796def7e3f8726ec3f0c63730;p=gtk4.git vulkan: Merge the two upload ops Now they both use the same upload code. --- diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index ea932fbf9e..6f16a0a950 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -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); } diff --git a/gsk/vulkan/gskvulkanuploadop.c b/gsk/vulkan/gskvulkanuploadop.c index d3e26534ca..4039a52c3d 100644 --- a/gsk/vulkan/gskvulkanuploadop.c +++ b/gsk/vulkan/gskvulkanuploadop.c @@ -6,104 +6,242 @@ #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 }; diff --git a/gsk/vulkan/gskvulkanuploadopprivate.h b/gsk/vulkan/gskvulkanuploadopprivate.h index d94ddf5fc2..dbb1fcfb83 100644 --- a/gsk/vulkan/gskvulkanuploadopprivate.h +++ b/gsk/vulkan/gskvulkanuploadopprivate.h @@ -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);