From: Benjamin Otte Date: Sat, 15 Jul 2023 20:19:20 +0000 (+0200) Subject: vulkan: Redo barriers X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~60^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e7549f3359fbd04eab4329a59755d993aa60b0b2;p=gtk4.git vulkan: Redo barriers We now store all the relevant state of the image inside the VulkanImage struct, so we can delay barriers for as long as possible. Whenever we want to use an image, we call the new gsk_vulkan_image_transition() and it will add a barrier to the desired state if one is necessary. --- diff --git a/gsk/vulkan/gskvulkanblendmodeop.c b/gsk/vulkan/gskvulkanblendmodeop.c index e4ad4b5d6b..6e8ec8d523 100644 --- a/gsk/vulkan/gskvulkanblendmodeop.c +++ b/gsk/vulkan/gskvulkanblendmodeop.c @@ -72,7 +72,7 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_blend_mode_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanblurop.c b/gsk/vulkan/gskvulkanblurop.c index 6b121cdc08..3c50affbb1 100644 --- a/gsk/vulkan/gskvulkanblurop.c +++ b/gsk/vulkan/gskvulkanblurop.c @@ -62,7 +62,7 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanBlurOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_blur_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanborderop.c b/gsk/vulkan/gskvulkanborderop.c index f72827b54c..2266fdb2f1 100644 --- a/gsk/vulkan/gskvulkanborderop.c +++ b/gsk/vulkan/gskvulkanborderop.c @@ -86,7 +86,7 @@ gsk_vulkan_border_op_command (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanBorderOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_border_op_finish, gsk_vulkan_border_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkancolormatrixop.c b/gsk/vulkan/gskvulkancolormatrixop.c index 1a377fc726..670a139fa6 100644 --- a/gsk/vulkan/gskvulkancolormatrixop.c +++ b/gsk/vulkan/gskvulkancolormatrixop.c @@ -69,7 +69,7 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_color_matrix_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkancolorop.c b/gsk/vulkan/gskvulkancolorop.c index 4f6756d302..de85e5ebfe 100644 --- a/gsk/vulkan/gskvulkancolorop.c +++ b/gsk/vulkan/gskvulkancolorop.c @@ -62,7 +62,7 @@ gsk_vulkan_color_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanColorOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_color_op_finish, gsk_vulkan_color_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkancrossfadeop.c b/gsk/vulkan/gskvulkancrossfadeop.c index 2f0d3ea590..9201bca560 100644 --- a/gsk/vulkan/gskvulkancrossfadeop.c +++ b/gsk/vulkan/gskvulkancrossfadeop.c @@ -72,7 +72,7 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_cross_fade_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkandownloadop.c b/gsk/vulkan/gskvulkandownloadop.c index 1647eb0f55..5d3aa9f7b7 100644 --- a/gsk/vulkan/gskvulkandownloadop.c +++ b/gsk/vulkan/gskvulkandownloadop.c @@ -33,55 +33,18 @@ gsk_vulkan_download_op_command_with_area (GskVulkanOp *op, const cairo_rectangle_int_t *area, GskVulkanBuffer **buffer) { - VkPipelineStageFlags stage; - VkImageLayout image_layout; - VkAccessFlags access; gsize stride; - stage = gsk_vulkan_image_get_vk_pipeline_stage (image); - image_layout = gsk_vulkan_image_get_vk_image_layout (image); - access = gsk_vulkan_image_get_vk_access (image); stride = area->width * gdk_memory_format_bytes_per_pixel (gsk_vulkan_image_get_format (image)); *buffer = gsk_vulkan_buffer_new_map (gsk_vulkan_render_get_context (render), area->height * stride, GSK_VULKAN_READ); - vkCmdPipelineBarrier (command_buffer, - stage, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - 0, NULL, - 1, &(VkBufferMemoryBarrier) { - .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, - .srcAccessMask = VK_ACCESS_HOST_READ_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 = access, - .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, - .oldLayout = image_layout, - .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_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_PIPELINE_STAGE_TRANSFER_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_ACCESS_TRANSFER_READ_BIT); + gsk_vulkan_image_transition (image, + command_buffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_ACCESS_TRANSFER_READ_BIT); vkCmdCopyImageToBuffer (command_buffer, gsk_vulkan_image_get_vk_image (image), @@ -114,29 +77,20 @@ gsk_vulkan_download_op_command_with_area (GskVulkanOp *op, vkCmdPipelineBarrier (command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, - stage, + VK_PIPELINE_STAGE_HOST_BIT, 0, 0, NULL, - 0, NULL, - 1, &(VkImageMemoryBarrier) { - .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .srcAccessMask = gsk_vulkan_image_get_vk_access (image), - .dstAccessMask = access, - .oldLayout = gsk_vulkan_image_get_vk_image_layout (image), - .newLayout = image_layout, + 1, &(VkBufferMemoryBarrier) { + .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, + .dstAccessMask = VK_ACCESS_HOST_READ_BIT, .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, stage, image_layout, access); + .buffer = gsk_vulkan_buffer_get_buffer (*buffer), + .offset = 0, + .size = VK_WHOLE_SIZE, + }, + 0, NULL); return op->next; } diff --git a/gsk/vulkan/gskvulkanglyphop.c b/gsk/vulkan/gskvulkanglyphop.c index 8b7effef99..ba3fddf1c5 100644 --- a/gsk/vulkan/gskvulkanglyphop.c +++ b/gsk/vulkan/gskvulkanglyphop.c @@ -61,7 +61,7 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_glyph_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanimage.c b/gsk/vulkan/gskvulkanimage.c index 232cf8cc33..c9eff3f501 100644 --- a/gsk/vulkan/gskvulkanimage.c +++ b/gsk/vulkan/gskvulkanimage.c @@ -367,6 +367,7 @@ gsk_vulkan_image_new (GdkVulkanContext *context, gsize height, VkImageTiling tiling, VkImageUsageFlags usage, + VkPipelineStageFlags stage, VkImageLayout layout, VkAccessFlags access, VkMemoryPropertyFlags memory) @@ -400,6 +401,7 @@ gsk_vulkan_image_new (GdkVulkanContext *context, self->width = width; self->height = height; self->vk_usage = usage; + self->vk_pipeline_stage = stage; self->vk_image_layout = layout; self->vk_access = access; @@ -455,7 +457,8 @@ gsk_vulkan_image_new_for_upload (GdkVulkanContext *context, VK_IMAGE_TILING_LINEAR, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, - VK_IMAGE_LAYOUT_UNDEFINED, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_IMAGE_LAYOUT_PREINITIALIZED, VK_ACCESS_TRANSFER_WRITE_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); @@ -468,6 +471,10 @@ gsk_vulkan_image_can_map (GskVulkanImage *self) if (GSK_DEBUG_CHECK (STAGING)) return FALSE; + if (self->vk_image_layout != VK_IMAGE_LAYOUT_PREINITIALIZED && + self->vk_image_layout != VK_IMAGE_LAYOUT_GENERAL) + return FALSE; + return gsk_vulkan_memory_can_map (self->memory, TRUE); } @@ -520,6 +527,9 @@ gsk_vulkan_image_new_for_swapchain (GdkVulkanContext *context, self->height = height; self->vk_image = image; self->vk_format = format; + self->vk_pipeline_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + self->vk_image_layout = VK_IMAGE_LAYOUT_UNDEFINED; + self->vk_access = 0; gsk_vulkan_image_create_view (self, &(GskMemoryFormatInfo) { @@ -547,6 +557,7 @@ gsk_vulkan_image_new_for_atlas (GdkVulkanContext *context, height, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_IMAGE_LAYOUT_UNDEFINED, 0, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); @@ -570,6 +581,7 @@ gsk_vulkan_image_new_for_offscreen (GdkVulkanContext *context, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); @@ -692,6 +704,45 @@ gsk_vulkan_image_set_vk_image_layout (GskVulkanImage *self, self->vk_access = access; } +void +gsk_vulkan_image_transition (GskVulkanImage *self, + VkCommandBuffer command_buffer, + VkPipelineStageFlags stage, + VkImageLayout image_layout, + VkAccessFlags access) +{ + if (self->vk_pipeline_stage == stage && + self->vk_image_layout == image_layout && + self->vk_access == access) + return; + + vkCmdPipelineBarrier (command_buffer, + self->vk_pipeline_stage, + stage, + 0, + 0, NULL, + 0, NULL, + 1, &(VkImageMemoryBarrier) { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = self->vk_access, + .dstAccessMask = access, + .oldLayout = self->vk_image_layout, + .newLayout = image_layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = self->vk_image, + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1 + }, + }); + + gsk_vulkan_image_set_vk_image_layout (self, stage, image_layout, access); +} + VkFormat gsk_vulkan_image_get_vk_format (GskVulkanImage *self) { diff --git a/gsk/vulkan/gskvulkanimageprivate.h b/gsk/vulkan/gskvulkanimageprivate.h index f91ce8ff8d..d0c9e6bc45 100644 --- a/gsk/vulkan/gskvulkanimageprivate.h +++ b/gsk/vulkan/gskvulkanimageprivate.h @@ -55,6 +55,15 @@ void gsk_vulkan_image_set_vk_image_layout (GskVulk VkPipelineStageFlags stage, VkImageLayout image_layout, VkAccessFlags access); +void gsk_vulkan_image_transition (GskVulkanImage *self, + VkCommandBuffer command_buffer, + VkPipelineStageFlags stage, + VkImageLayout image_layout, + VkAccessFlags access); +#define gdk_vulkan_image_transition_shader(image) \ + gsk_vulkan_image_transition ((image), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, \ + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT) + VkImage gsk_vulkan_image_get_vk_image (GskVulkanImage *self); VkImageView gsk_vulkan_image_get_image_view (GskVulkanImage *self); VkFormat gsk_vulkan_image_get_vk_format (GskVulkanImage *self); diff --git a/gsk/vulkan/gskvulkaninsetshadowop.c b/gsk/vulkan/gskvulkaninsetshadowop.c index 0a0ee89372..baa7268cf3 100644 --- a/gsk/vulkan/gskvulkaninsetshadowop.c +++ b/gsk/vulkan/gskvulkaninsetshadowop.c @@ -64,7 +64,7 @@ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_inset_shadow_op_finish, gsk_vulkan_inset_shadow_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanlineargradientop.c b/gsk/vulkan/gskvulkanlineargradientop.c index caa0b60dfd..f798ad92d2 100644 --- a/gsk/vulkan/gskvulkanlineargradientop.c +++ b/gsk/vulkan/gskvulkanlineargradientop.c @@ -76,7 +76,7 @@ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_linear_gradient_op_finish, gsk_vulkan_linear_gradient_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanmaskop.c b/gsk/vulkan/gskvulkanmaskop.c index 71df86bdca..401cc7ead8 100644 --- a/gsk/vulkan/gskvulkanmaskop.c +++ b/gsk/vulkan/gskvulkanmaskop.c @@ -83,7 +83,7 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanMaskOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_mask_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanopprivate.h b/gsk/vulkan/gskvulkanopprivate.h index 30bfc1ad8d..58d4642b9f 100644 --- a/gsk/vulkan/gskvulkanopprivate.h +++ b/gsk/vulkan/gskvulkanopprivate.h @@ -10,6 +10,7 @@ typedef enum { GSK_VULKAN_STAGE_UPLOAD, GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, /* magic ones */ GSK_VULKAN_STAGE_BEGIN_PASS, GSK_VULKAN_STAGE_END_PASS diff --git a/gsk/vulkan/gskvulkanoutsetshadowop.c b/gsk/vulkan/gskvulkanoutsetshadowop.c index aa3d0b5b92..2fde9c2ad8 100644 --- a/gsk/vulkan/gskvulkanoutsetshadowop.c +++ b/gsk/vulkan/gskvulkanoutsetshadowop.c @@ -64,7 +64,7 @@ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_outset_shadow_op_finish, gsk_vulkan_outset_shadow_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 4f57fdedf2..3fb7f46ff2 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -422,6 +422,7 @@ gsk_vulkan_render_sort_render_pass (GskVulkanRender *self, break; case GSK_VULKAN_STAGE_COMMAND: + case GSK_VULKAN_STAGE_SHADER: if (sort_data->command.first == NULL) sort_data->command.first = op; else @@ -691,7 +692,7 @@ gsk_vulkan_render_get_render_pass (GskVulkanRender *self, .pDepthStencilAttachment = NULL, } }, - .dependencyCount = 0 + .dependencyCount = 0, }, NULL, &render_pass); diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index 2cd99413d5..a85469cd8e 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -4,6 +4,7 @@ #include "gskrendernodeprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "gdk/gdkvulkancontextprivate.h" @@ -64,6 +65,34 @@ gsk_vulkan_render_pass_op_reserve_descriptor_sets (GskVulkanOp *op, { } +static void +gsk_vulkan_render_pass_op_do_barriers (GskVulkanRenderPassOp *self, + VkCommandBuffer command_buffer) +{ + GskVulkanShaderOp *shader; + GskVulkanOp *op; + gsize i; + + for (op = ((GskVulkanOp *) self)->next; + op->op_class->stage != GSK_VULKAN_STAGE_END_PASS; + op = op->next) + { + if (op->op_class->stage != GSK_VULKAN_STAGE_SHADER) + continue; + + shader = (GskVulkanShaderOp *) op; + + for (i = 0; i < ((GskVulkanShaderOpClass *) op->op_class)->n_images; i++) + { + gsk_vulkan_image_transition (shader->images[i], + command_buffer, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_ACCESS_SHADER_READ_BIT); + } + } +} + static GskVulkanOp * gsk_vulkan_render_pass_op_command (GskVulkanOp *op, GskVulkanRender *render, @@ -76,6 +105,8 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op, /* nesting render passes not allowed */ g_assert (render_pass == VK_NULL_HANDLE); + gsk_vulkan_render_pass_op_do_barriers (self, command_buffer); + vk_render_pass = gsk_vulkan_render_get_render_pass (render, gsk_vulkan_image_get_vk_format (self->image), self->initial_layout, @@ -196,7 +227,7 @@ gsk_vulkan_render_pass_end_op_command (GskVulkanOp *op, gsk_vulkan_image_set_vk_image_layout (self->image, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, self->final_layout, - gsk_vulkan_image_get_vk_access (self->image)); + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT); return op->next; } diff --git a/gsk/vulkan/gskvulkantextureop.c b/gsk/vulkan/gskvulkantextureop.c index b40031a105..ee9b1aecca 100644 --- a/gsk/vulkan/gskvulkantextureop.c +++ b/gsk/vulkan/gskvulkantextureop.c @@ -66,7 +66,7 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp *op, static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = { { GSK_VULKAN_OP_SIZE (GskVulkanTextureOp), - GSK_VULKAN_STAGE_COMMAND, + GSK_VULKAN_STAGE_SHADER, gsk_vulkan_shader_op_finish, gsk_vulkan_texture_op_print, gsk_vulkan_shader_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanuploadop.c b/gsk/vulkan/gskvulkanuploadop.c index aa85688a84..7c7d6132f0 100644 --- a/gsk/vulkan/gskvulkanuploadop.c +++ b/gsk/vulkan/gskvulkanuploadop.c @@ -48,7 +48,7 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op, gsk_vulkan_buffer_unmap (*buffer); vkCmdPipelineBarrier (command_buffer, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, @@ -62,27 +62,12 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op, .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_PIPELINE_STAGE_TRANSFER_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT); + 0, NULL); + gsk_vulkan_image_transition (image, + command_buffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_ACCESS_TRANSFER_WRITE_BIT); vkCmdCopyBufferToImage (command_buffer, gsk_vulkan_buffer_get_buffer (*buffer), @@ -113,35 +98,6 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op, } }); - 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 - }, - }); - - gsk_vulkan_image_set_vk_image_layout (image, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_SHADER_READ_BIT); - return op->next; } @@ -164,11 +120,6 @@ gsk_vulkan_upload_op_command (GskVulkanOp *op, gsk_vulkan_image_unmap (image); *buffer = NULL; - gsk_vulkan_image_set_vk_image_layout (image, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_SHADER_READ_BIT); - return op->next; }