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();
|
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());
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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);
|
||||||
|
@@ -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,14 +581,14 @@ 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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user