renderer_vulkan: Proper barriers on renderpass clear
This commit is contained in:
@@ -907,16 +907,11 @@ void RendererVulkan::SwapBuffers() {
|
||||
const auto& layout = render_window.GetFramebufferLayout();
|
||||
PrepareRendertarget();
|
||||
|
||||
const auto RecreateSwapchain = [&] {
|
||||
scheduler.Finish();
|
||||
swapchain.Create();
|
||||
};
|
||||
|
||||
do {
|
||||
if (swapchain.NeedsRecreation()) {
|
||||
RecreateSwapchain();
|
||||
scheduler.Finish();
|
||||
swapchain.Create();
|
||||
}
|
||||
scheduler.WaitWorker();
|
||||
swapchain.AcquireNextImage();
|
||||
} while (swapchain.NeedsRecreation());
|
||||
|
||||
|
@@ -179,7 +179,7 @@ private:
|
||||
std::size_t recorded_counts = 0;
|
||||
std::size_t command_offset = 0;
|
||||
bool submit = false;
|
||||
alignas(std::max_align_t) std::array<u8, 0x80000> data{};
|
||||
alignas(std::max_align_t) std::array<u8, 0x8000> data{};
|
||||
};
|
||||
|
||||
private:
|
||||
|
@@ -15,7 +15,7 @@ class Scheduler;
|
||||
class RenderpassCache;
|
||||
|
||||
class Swapchain {
|
||||
static constexpr u32 PREFERRED_IMAGE_COUNT = 8;
|
||||
static constexpr u32 PREFERRED_IMAGE_COUNT = 9;
|
||||
|
||||
public:
|
||||
Swapchain(const Instance& instance, Scheduler& scheduler, RenderpassCache& renderpass_cache);
|
||||
|
@@ -493,6 +493,16 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||
const bool is_color = surface.type != VideoCore::SurfaceType::Depth &&
|
||||
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 =
|
||||
is_color ? renderpass_cache.GetRenderpass(surface.pixel_format,
|
||||
VideoCore::PixelFormat::Invalid, true)
|
||||
@@ -535,10 +545,10 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||
.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 = {
|
||||
.srcAccessMask = params.src_access,
|
||||
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
|
||||
.dstAccessMask = access_flag,
|
||||
.oldLayout = vk::ImageLayout::eGeneral,
|
||||
.newLayout = vk::ImageLayout::eGeneral,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
@@ -546,23 +556,23 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||
.image = params.src_image,
|
||||
.subresourceRange{
|
||||
.aspectMask = params.aspect,
|
||||
.baseMipLevel = level,
|
||||
.baseMipLevel = 0,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = 0,
|
||||
.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);
|
||||
});
|
||||
|
||||
renderpass_cache.EnterRenderpass(clear_info);
|
||||
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 = {
|
||||
.srcAccessMask = vk::AccessFlagBits::eTransferWrite,
|
||||
.srcAccessMask = access_flag,
|
||||
.dstAccessMask = params.src_access,
|
||||
.oldLayout = vk::ImageLayout::eGeneral,
|
||||
.newLayout = vk::ImageLayout::eGeneral,
|
||||
@@ -571,14 +581,14 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
|
||||
.image = params.src_image,
|
||||
.subresourceRange{
|
||||
.aspectMask = params.aspect,
|
||||
.baseMipLevel = level,
|
||||
.baseMipLevel = 0,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = 0,
|
||||
.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);
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user