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; }