mirror of
https://github.com/libretro/RetroArch
synced 2025-03-22 07:21:15 +00:00
(Vulkan) Turn vulkan_image_layout_transition into macro
This commit is contained in:
parent
7a22eb1f44
commit
25f682249f
gfx
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user