vulkan: Redo barriers
authorBenjamin Otte <otte@redhat.com>
Sat, 15 Jul 2023 20:19:20 +0000 (22:19 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 11:16:43 +0000 (13:16 +0200)
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.

19 files changed:
gsk/vulkan/gskvulkanblendmodeop.c
gsk/vulkan/gskvulkanblurop.c
gsk/vulkan/gskvulkanborderop.c
gsk/vulkan/gskvulkancolormatrixop.c
gsk/vulkan/gskvulkancolorop.c
gsk/vulkan/gskvulkancrossfadeop.c
gsk/vulkan/gskvulkandownloadop.c
gsk/vulkan/gskvulkanglyphop.c
gsk/vulkan/gskvulkanimage.c
gsk/vulkan/gskvulkanimageprivate.h
gsk/vulkan/gskvulkaninsetshadowop.c
gsk/vulkan/gskvulkanlineargradientop.c
gsk/vulkan/gskvulkanmaskop.c
gsk/vulkan/gskvulkanopprivate.h
gsk/vulkan/gskvulkanoutsetshadowop.c
gsk/vulkan/gskvulkanrender.c
gsk/vulkan/gskvulkanrenderpassop.c
gsk/vulkan/gskvulkantextureop.c
gsk/vulkan/gskvulkanuploadop.c

index e4ad4b5d6b13b4adb0c9c4898b0b56afd6704f29..6e8ec8d523e6d4c03e3748541cc365768000a477 100644 (file)
@@ -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,
index 6b121cdc08429bea9ccfe590d690903d174c0948..3c50affbb12a272ca45c7f21ba9f1c547c05db78 100644 (file)
@@ -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,
index f72827b54cb75d5bfc32bae9348f021166e7dd49..2266fdb2f14683be1c06539c57d7294b6e1fa42a 100644 (file)
@@ -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,
index 1a377fc726c5b0c0774cc1622788c2ed039cc870..670a139fa69545103a0f0005373ac35a304d54b0 100644 (file)
@@ -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,
index 4f6756d3024ea61b822648d420acf305db4b2d85..de85e5ebfed37c9be83763a3888faeceedfc05f6 100644 (file)
@@ -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,
index 2f0d3ea590e42b71242042a0337486b088793283..9201bca5607178fc741f36032bf706ae87271264 100644 (file)
@@ -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,
index 1647eb0f5520d8c47cba05bd2a572e988e6f0f7c..5d3aa9f7b77b4b8bcad393e5d2cc2234618b2681 100644 (file)
@@ -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;
 }
index 8b7effef9928639460af5552e6c1e50644ba2d2c..ba3fddf1c5e5f46db5a580e96641ee3950a8e016 100644 (file)
@@ -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,
index 232cf8cc33389a4ac81dccf5d111a9ee7211cc30..c9eff3f501392e9ca04bcca2deb83a06dd6ff0f3 100644 (file)
@@ -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)
 {
index f91ce8ff8ddc719628b14c5e06172db0cf108bdb..d0c9e6bc45491c06d8d73aa68d84da8de3a71f51 100644 (file)
@@ -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);
index 0a0ee89372c8572268e204ac820a07b3a393b4d5..baa7268cf3cfa81ebb71f455052860f05c3d58b5 100644 (file)
@@ -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,
index caa0b60dfd8c9a1be9b6f49c5b6ecd3db95e11ca..f798ad92d2bfd5dcb64aa16c3cc1940ff6e0ff15 100644 (file)
@@ -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,
index 71df86bdca8a02172b49875f45303bfbab00a4cc..401cc7ead8a641edc5dd1febc44ce9ce9dc9fb67 100644 (file)
@@ -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,
index 30bfc1ad8d302f66125b801f5f7d000bece3c93f..58d4642b9f83d3e8834229da47ad002aaa2d4bdd 100644 (file)
@@ -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
index aa3d0b5b92a132e2eae89ef5ae254ae7fbed7cbd..2fde9c2ad8964031e9f7ab562f8531908acf07fd 100644 (file)
@@ -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,
index 4f57fdedf2a78be89c039db36d61a6a0864f0e57..3fb7f46ff2765c5a9062b040fe9c05070fa17ed1 100644 (file)
@@ -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);
index 2cd99413d5891352b06d96919924d5704739b980..a85469cd8e37e65c57b8cb764984325885e86fc2 100644 (file)
@@ -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;
 }
 
index b40031a105436f644d7d06702c2cf64df478709c..ee9b1aeccaad38d0481191c0baffce3a0f1aade7 100644 (file)
@@ -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,
index aa85688a84a4a690f3f4de0e9392afbd1fe64f13..7c7d6132f0e3e0526097ba55820a9d99f18c2bd9 100644 (file)
@@ -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;
     }