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.
This commit is contained in:
Benjamin Otte
2023-07-15 22:19:20 +02:00
parent fee497f9e1
commit e7549f3359
19 changed files with 130 additions and 132 deletions

View 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,

View 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,

View 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,

View 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,

View 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,

View 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,

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

View 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,

View 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)
{

View 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);

View 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,

View 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,

View 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,

View 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

View 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,

View 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);

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

View 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,

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