renderer_vulkan: Proper barriers on renderpass clear

This commit is contained in:
GPUCode
2023-01-07 23:12:56 +02:00
parent 11061f36e6
commit 4ee36e05b6
4 changed files with 24 additions and 19 deletions

View File

@@ -907,16 +907,11 @@ void RendererVulkan::SwapBuffers() {
const auto& layout = render_window.GetFramebufferLayout(); const auto& layout = render_window.GetFramebufferLayout();
PrepareRendertarget(); PrepareRendertarget();
const auto RecreateSwapchain = [&] {
scheduler.Finish();
swapchain.Create();
};
do { do {
if (swapchain.NeedsRecreation()) { if (swapchain.NeedsRecreation()) {
RecreateSwapchain(); scheduler.Finish();
swapchain.Create();
} }
scheduler.WaitWorker();
swapchain.AcquireNextImage(); swapchain.AcquireNextImage();
} while (swapchain.NeedsRecreation()); } while (swapchain.NeedsRecreation());

View File

@@ -179,7 +179,7 @@ private:
std::size_t recorded_counts = 0; std::size_t recorded_counts = 0;
std::size_t command_offset = 0; std::size_t command_offset = 0;
bool submit = false; bool submit = false;
alignas(std::max_align_t) std::array<u8, 0x80000> data{}; alignas(std::max_align_t) std::array<u8, 0x8000> data{};
}; };
private: private:

View File

@@ -15,7 +15,7 @@ class Scheduler;
class RenderpassCache; class RenderpassCache;
class Swapchain { class Swapchain {
static constexpr u32 PREFERRED_IMAGE_COUNT = 8; static constexpr u32 PREFERRED_IMAGE_COUNT = 9;
public: public:
Swapchain(const Instance& instance, Scheduler& scheduler, RenderpassCache& renderpass_cache); Swapchain(const Instance& instance, Scheduler& scheduler, RenderpassCache& renderpass_cache);

View File

@@ -493,6 +493,16 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
const bool is_color = surface.type != VideoCore::SurfaceType::Depth && const bool is_color = surface.type != VideoCore::SurfaceType::Depth &&
surface.type != VideoCore::SurfaceType::DepthStencil; surface.type != VideoCore::SurfaceType::DepthStencil;
const vk::AccessFlags access_flag =
is_color ? vk::AccessFlagBits::eColorAttachmentRead |
vk::AccessFlagBits::eColorAttachmentWrite
: vk::AccessFlagBits::eDepthStencilAttachmentRead |
vk::AccessFlagBits::eDepthStencilAttachmentWrite;
const vk::PipelineStageFlags pipeline_flags =
is_color ? vk::PipelineStageFlagBits::eColorAttachmentOutput
: vk::PipelineStageFlagBits::eNone;
const vk::RenderPass clear_renderpass = const vk::RenderPass clear_renderpass =
is_color ? renderpass_cache.GetRenderpass(surface.pixel_format, is_color ? renderpass_cache.GetRenderpass(surface.pixel_format,
VideoCore::PixelFormat::Invalid, true) VideoCore::PixelFormat::Invalid, true)
@@ -535,10 +545,10 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.src_image = surface.alloc.image, .src_image = surface.alloc.image,
}; };
scheduler.Record([params, level = clear.texture_level](vk::CommandBuffer cmdbuf) { scheduler.Record([params, access_flag, pipeline_flags](vk::CommandBuffer cmdbuf) {
const vk::ImageMemoryBarrier pre_barrier = { const vk::ImageMemoryBarrier pre_barrier = {
.srcAccessMask = params.src_access, .srcAccessMask = params.src_access,
.dstAccessMask = vk::AccessFlagBits::eTransferWrite, .dstAccessMask = access_flag,
.oldLayout = vk::ImageLayout::eGeneral, .oldLayout = vk::ImageLayout::eGeneral,
.newLayout = vk::ImageLayout::eGeneral, .newLayout = vk::ImageLayout::eGeneral,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
@@ -546,23 +556,23 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.image = params.src_image, .image = params.src_image,
.subresourceRange{ .subresourceRange{
.aspectMask = params.aspect, .aspectMask = params.aspect,
.baseMipLevel = level, .baseMipLevel = 0,
.levelCount = 1, .levelCount = 1,
.baseArrayLayer = 0, .baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS, .layerCount = VK_REMAINING_ARRAY_LAYERS,
}, },
}; };
cmdbuf.pipelineBarrier(params.pipeline_flags, vk::PipelineStageFlagBits::eTransfer, cmdbuf.pipelineBarrier(params.pipeline_flags, pipeline_flags,
vk::DependencyFlagBits::eByRegion, {}, {}, pre_barrier); vk::DependencyFlagBits::eByRegion, {}, {}, pre_barrier);
}); });
renderpass_cache.EnterRenderpass(clear_info); renderpass_cache.EnterRenderpass(clear_info);
renderpass_cache.ExitRenderpass(); renderpass_cache.ExitRenderpass();
scheduler.Record([params, level = clear.texture_level](vk::CommandBuffer cmdbuf) { scheduler.Record([params, access_flag, pipeline_flags](vk::CommandBuffer cmdbuf) {
const vk::ImageMemoryBarrier post_barrier = { const vk::ImageMemoryBarrier post_barrier = {
.srcAccessMask = vk::AccessFlagBits::eTransferWrite, .srcAccessMask = access_flag,
.dstAccessMask = params.src_access, .dstAccessMask = params.src_access,
.oldLayout = vk::ImageLayout::eGeneral, .oldLayout = vk::ImageLayout::eGeneral,
.newLayout = vk::ImageLayout::eGeneral, .newLayout = vk::ImageLayout::eGeneral,
@@ -571,15 +581,15 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.image = params.src_image, .image = params.src_image,
.subresourceRange{ .subresourceRange{
.aspectMask = params.aspect, .aspectMask = params.aspect,
.baseMipLevel = level, .baseMipLevel = 0,
.levelCount = 1, .levelCount = 1,
.baseArrayLayer = 0, .baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS, .layerCount = VK_REMAINING_ARRAY_LAYERS,
}, },
}; };
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, params.pipeline_flags, cmdbuf.pipelineBarrier(pipeline_flags, params.pipeline_flags,
vk::DependencyFlagBits::eByRegion, {}, {}, post_barrier); vk::DependencyFlagBits::eByRegion, {}, {}, post_barrier);
}); });
} }