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));
GSK_VULKAN_READ);
vkCmdPipelineBarrier (command_buffer,
- VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ stage,
VK_PIPELINE_STAGE_TRANSFER_BIT,
0,
0, NULL,
},
});
gsk_vulkan_image_set_vk_image_layout (image,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_ACCESS_TRANSFER_READ_BIT);
vkCmdPipelineBarrier (command_buffer,
VK_PIPELINE_STAGE_TRANSFER_BIT,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ stage,
0,
0, NULL,
0, NULL,
},
});
- gsk_vulkan_image_set_vk_image_layout (image, image_layout, access);
+ gsk_vulkan_image_set_vk_image_layout (image, stage, image_layout, access);
return op->next;
}
VkImageView vk_image_view;
VkFramebuffer vk_framebuffer;
+ VkPipelineStageFlags vk_pipeline_stage;
VkImageLayout vk_image_layout;
VkAccessFlags vk_access;
return self->vk_image_view;
}
+VkPipelineStageFlags
+gsk_vulkan_image_get_vk_pipeline_stage (GskVulkanImage *self)
+{
+ return self->vk_pipeline_stage;
+}
+
VkImageLayout
gsk_vulkan_image_get_vk_image_layout (GskVulkanImage *self)
{
}
void
-gsk_vulkan_image_set_vk_image_layout (GskVulkanImage *self,
- VkImageLayout image_layout,
- VkAccessFlags access)
+gsk_vulkan_image_set_vk_image_layout (GskVulkanImage *self,
+ VkPipelineStageFlags stage,
+ VkImageLayout image_layout,
+ VkAccessFlags access)
{
+ self->vk_pipeline_stage = stage;
self->vk_image_layout = image_layout;
self->vk_access = access;
}
gsize gsk_vulkan_image_get_width (GskVulkanImage *self);
gsize gsk_vulkan_image_get_height (GskVulkanImage *self);
+VkPipelineStageFlags gsk_vulkan_image_get_vk_pipeline_stage (GskVulkanImage *self);
VkImageLayout gsk_vulkan_image_get_vk_image_layout (GskVulkanImage *self);
VkAccessFlags gsk_vulkan_image_get_vk_access (GskVulkanImage *self);
void gsk_vulkan_image_set_vk_image_layout (GskVulkanImage *self,
+ VkPipelineStageFlags stage,
VkImageLayout image_layout,
VkAccessFlags access);
VkImage gsk_vulkan_image_get_vk_image (GskVulkanImage *self);
vkCmdEndRenderPass (command_buffer);
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));
return op->next;
},
});
gsk_vulkan_image_set_vk_image_layout (image,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_ACCESS_TRANSFER_WRITE_BIT);
});
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);
*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);