From 84e0d58d9eb1ffb83fcc906d64d49356238eca68 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Mon, 21 Aug 2023 22:52:51 -0700 Subject: [PATCH] Add initial render-target layout transition, depth-stencil aspect fix Fixes a lot of the render-target validation error messages. We "might" change the default layout for render-targets to shader-read-only and only use attachment-optimal layouts when they are armed for a render-pass. Render-Textures more often need to be ready for shaders than they need to be ready for render-passes. --- src/core/renderer_vk/renderer_vk.cpp | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/core/renderer_vk/renderer_vk.cpp b/src/core/renderer_vk/renderer_vk.cpp index 2c2187a8..7cc7b492 100644 --- a/src/core/renderer_vk/renderer_vk.cpp +++ b/src/core/renderer_vk/renderer_vk.cpp @@ -309,6 +309,16 @@ RendererVK::Texture& RendererVK::getColorRenderTexture(u32 addr, PICA::ColorFmt Helpers::panic("Error creating color render-texture: %s\n", vk::to_string(createResult.result).c_str()); } + // Initial layout transition + getCurrentCommandBuffer().pipelineBarrier( + vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eAllCommands, vk::DependencyFlags{}, {}, {}, + {vk::ImageMemoryBarrier( + vk::AccessFlagBits::eMemoryWrite, vk::AccessFlagBits::eColorAttachmentRead, vk::ImageLayout::eUndefined, + vk::ImageLayout::eColorAttachmentOptimal, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, newTexture.image.get(), + viewInfo.subresourceRange + )} + ); + return newTexture; } @@ -352,9 +362,13 @@ RendererVK::Texture& RendererVK::getDepthRenderTexture(u32 addr, PICA::DepthFmt viewInfo.viewType = vk::ImageViewType::e2D; viewInfo.format = textureInfo.format; viewInfo.components = vk::ComponentMapping(); - //viewInfo.subresourceRange = vk::ImageSubresourceRange(vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, 0, 1, 0, 1); + // viewInfo.subresourceRange = vk::ImageSubresourceRange(vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil, 0, 1, 0, 1); viewInfo.subresourceRange = vk::ImageSubresourceRange(vk::ImageAspectFlagBits::eDepth, 0, 1, 0, 1); + if (PICA::hasStencil(format)) { + viewInfo.subresourceRange.aspectMask |= vk::ImageAspectFlagBits::eStencil; + } + if (auto [result, imageMemory] = Vulkan::commitImageHeap(device.get(), physicalDevice, {&newTexture.image.get(), 1}); result == vk::Result::eSuccess) { newTexture.imageMemory = std::move(imageMemory); @@ -368,6 +382,16 @@ RendererVK::Texture& RendererVK::getDepthRenderTexture(u32 addr, PICA::DepthFmt Helpers::panic("Error creating depth render-texture: %s\n", vk::to_string(createResult.result).c_str()); } + // Initial layout transition + getCurrentCommandBuffer().pipelineBarrier( + vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eAllCommands, vk::DependencyFlags{}, {}, {}, + {vk::ImageMemoryBarrier( + vk::AccessFlagBits::eMemoryWrite, vk::AccessFlagBits::eDepthStencilAttachmentRead, vk::ImageLayout::eUndefined, + vk::ImageLayout::eDepthStencilAttachmentOptimal, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, newTexture.image.get(), + viewInfo.subresourceRange + )} + ); + return newTexture; }