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:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user