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,
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,
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,
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,
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,
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,
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),
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;
}
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,
gsize height,
VkImageTiling tiling,
VkImageUsageFlags usage,
+ VkPipelineStageFlags stage,
VkImageLayout layout,
VkAccessFlags access,
VkMemoryPropertyFlags memory)
self->width = width;
self->height = height;
self->vk_usage = usage;
+ self->vk_pipeline_stage = stage;
self->vk_image_layout = layout;
self->vk_access = access;
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);
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);
}
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) {
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);
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);
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)
{
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);
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,
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,
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,
{
GSK_VULKAN_STAGE_UPLOAD,
GSK_VULKAN_STAGE_COMMAND,
+ GSK_VULKAN_STAGE_SHADER,
/* magic ones */
GSK_VULKAN_STAGE_BEGIN_PASS,
GSK_VULKAN_STAGE_END_PASS
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,
break;
case GSK_VULKAN_STAGE_COMMAND:
+ case GSK_VULKAN_STAGE_SHADER:
if (sort_data->command.first == NULL)
sort_data->command.first = op;
else
.pDepthStencilAttachment = NULL,
}
},
- .dependencyCount = 0
+ .dependencyCount = 0,
},
NULL,
&render_pass);
#include "gskrendernodeprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "gdk/gdkvulkancontextprivate.h"
{
}
+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,
/* 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,
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;
}
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,
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,
.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),
}
});
- 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;
}
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;
}