diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 087e74b099..55743139cc 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -371,7 +371,7 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, * We would also need to optionally maintain extra textures due to * changes in resolution, so this seems like the sanest and * simplest solution. */ - vulkan_image_layout_transition(vk, cmd, dynamic->image, + VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, dynamic->image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, @@ -396,7 +396,7 @@ void vulkan_copy_staging_to_dynamic(vk_t *vk, VkCommandBuffer cmd, dynamic->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); - vulkan_image_layout_transition(vk, cmd, + VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, dynamic->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, @@ -895,7 +895,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, * mess around with lots of extra transitions at * per-level granularity. */ - vulkan_image_layout_transition(vk, + VULKAN_IMAGE_LAYOUT_TRANSITION( staging, tex.image, VK_IMAGE_LAYOUT_UNDEFINED, @@ -959,7 +959,8 @@ struct vk_texture vulkan_create_texture(vk_t *vk, /* Only injects execution and memory barriers, * not actual transition. */ - vulkan_image_layout_transition(vk, staging, tex.image, + VULKAN_IMAGE_LAYOUT_TRANSITION( + staging, tex.image, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, VK_ACCESS_TRANSFER_WRITE_BIT, @@ -975,7 +976,7 @@ struct vk_texture vulkan_create_texture(vk_t *vk, } /* Complete our texture. */ - vulkan_image_layout_transition(vk, staging, tex.image, + VULKAN_IMAGE_LAYOUT_TRANSITION(staging, tex.image, tex.mipmap ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL @@ -1120,7 +1121,7 @@ void vulkan_transition_texture(vk_t *vk, VkCommandBuffer cmd, struct vk_texture switch (texture->type) { case VULKAN_TEXTURE_STREAMED: - vulkan_image_layout_transition(vk, cmd, texture->image, + VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, texture->image, texture->layout, VK_IMAGE_LAYOUT_GENERAL, VK_ACCESS_HOST_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_HOST_BIT, @@ -1302,39 +1303,6 @@ void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad) vkCmdDraw(vk->cmd, 6, 1, 0, 0); } -void vulkan_image_layout_transition( - vk_t *vk, - VkCommandBuffer cmd, VkImage image, - VkImageLayout old_layout, - VkImageLayout new_layout, - VkAccessFlags srcAccess, - VkAccessFlags dstAccess, - VkPipelineStageFlags srcStages, - VkPipelineStageFlags dstStages) -{ - VkImageMemoryBarrier barrier = - { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }; - - barrier.srcAccessMask = srcAccess; - barrier.dstAccessMask = dstAccess; - barrier.oldLayout = old_layout; - barrier.newLayout = new_layout; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - vkCmdPipelineBarrier(cmd, - srcStages, - dstStages, - 0, - 0, NULL, - 0, NULL, - 1, &barrier); -} - struct vk_buffer vulkan_create_buffer( const struct vulkan_context *context, size_t size, VkBufferUsageFlags usage) diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 291d15e11e..258fcdb302 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -494,11 +494,24 @@ void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad); */ void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call); -void vulkan_image_layout_transition(vk_t *vk, - VkCommandBuffer cmd, VkImage image, - VkImageLayout old_layout, VkImageLayout new_layout, - VkAccessFlags srcAccess, VkAccessFlags dstAccess, - VkPipelineStageFlags srcStages, VkPipelineStageFlags dstStages); +#define VULKAN_IMAGE_LAYOUT_TRANSITION(cmd, img, old_layout, new_layout, srcAccess, dstAccess, srcStages, dstStages) \ +{ \ + VkImageMemoryBarrier barrier; \ + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; \ + barrier.pNext = NULL; \ + barrier.srcAccessMask = srcAccess; \ + barrier.dstAccessMask = dstAccess; \ + barrier.oldLayout = old_layout; \ + barrier.newLayout = new_layout; \ + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; \ + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; \ + barrier.image = img; \ + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; \ + barrier.subresourceRange.baseMipLevel = 0; \ + barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; \ + barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; \ + vkCmdPipelineBarrier(cmd, srcStages, dstStages, 0, 0, NULL, 0, NULL, 1, &barrier); \ +} #define VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, img, levels, old_layout, new_layout, src_access, dst_access, src_stages, dst_stages) \ { \ @@ -516,7 +529,7 @@ void vulkan_image_layout_transition(vk_t *vk, barrier.subresourceRange.baseMipLevel = 0; \ barrier.subresourceRange.levelCount = levels; \ barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; \ - vkCmdPipelineBarrier(cmd, src_stages, dst_stages, false, 0, NULL, 0, NULL, 1, &barrier); \ + vkCmdPipelineBarrier(cmd, src_stages, dst_stages, 0, 0, NULL, 0, NULL, 1, &barrier); \ } static INLINE unsigned vulkan_format_to_bpp(VkFormat format) diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 84be4a3c48..e09ac327f7 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1647,7 +1647,7 @@ static void vulkan_inject_black_frame(vk_t *vk, video_frame_info_t *video_info, vkResetCommandBuffer(vk->cmd, 0); vkBeginCommandBuffer(vk->cmd, &begin_info); - vulkan_image_layout_transition(vk, vk->cmd, backbuffer->image, + VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, @@ -1656,7 +1656,7 @@ static void vulkan_inject_black_frame(vk_t *vk, video_frame_info_t *video_info, vkCmdClearColorImage(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &range); - vulkan_image_layout_transition(vk, vk->cmd, backbuffer->image, + VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, @@ -1990,7 +1990,7 @@ static bool vulkan_frame(void *data, const void *frame, clear_color.color.float32[3] = 0.0f; /* Prepare backbuffer for rendering. */ - vulkan_image_layout_transition(vk, vk->cmd, backbuffer->image, + VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, @@ -2084,7 +2084,7 @@ static bool vulkan_frame(void *data, const void *frame, * * If we're reading back, perform the readback before presenting. */ - vulkan_image_layout_transition(vk, + VULKAN_IMAGE_LAYOUT_TRANSITION( vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, @@ -2096,7 +2096,7 @@ static bool vulkan_frame(void *data, const void *frame, vulkan_readback(vk); /* Prepare for presentation after transfers are complete. */ - vulkan_image_layout_transition(vk, vk->cmd, + VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, @@ -2111,7 +2111,7 @@ static bool vulkan_frame(void *data, const void *frame, vk->context->has_acquired_swapchain) { /* Prepare backbuffer for presentation. */ - vulkan_image_layout_transition(vk, vk->cmd, + VULKAN_IMAGE_LAYOUT_TRANSITION(vk->cmd, backbuffer->image, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,