vk: Lazy evaluate renderpass scope

- Spamming the driver with renderpass open/close cycles is bad for performance.
This commit is contained in:
kd-11 2020-03-10 14:05:50 +03:00 committed by Ivan
parent 7025985c0d
commit d25ba03e82
10 changed files with 160 additions and 51 deletions

View file

@ -6,6 +6,7 @@
#include "../rsx_utils.h"
#include "VKFormats.h"
#include "VKCompute.h"
#include "VKRenderPass.h"
namespace vk
{
@ -62,6 +63,11 @@ namespace vk
verify("Invalid image layout!" HERE),
src->current_layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL || src->current_layout == VK_IMAGE_LAYOUT_GENERAL;
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
switch (src->format())
{
default:
@ -142,6 +148,11 @@ namespace vk
verify("Invalid image layout!" HERE),
dst->current_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || dst->current_layout == VK_IMAGE_LAYOUT_GENERAL;
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
switch (dst->format())
{
default:
@ -211,6 +222,11 @@ namespace vk
return;
}
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
if (src != dst) [[likely]]
{
src->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
@ -331,6 +347,11 @@ namespace vk
auto preferred_src_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
auto preferred_dst_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
if (srcLayout != preferred_src_format)
change_image_layout(cmd, src, srcLayout, preferred_src_format, vk::get_image_subresource_range(0, 0, 1, 1, src_aspect));
@ -370,6 +391,11 @@ namespace vk
auto preferred_src_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
auto preferred_dst_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
//TODO: Use an array of offsets/dimensions for mipmapped blits (mipmap count > 1) since subimages will have different dimensions
if (srcLayout != preferred_src_format)
change_image_layout(cmd, src, srcLayout, preferred_src_format, vk::get_image_subresource_range(0, 0, 1, 1, aspect));
@ -713,6 +739,11 @@ namespace vk
std::vector<VkBufferCopy> buffer_copies;
copy_regions.reserve(subresource_layout.size());
if (vk::is_renderpass_open(cmd))
{
vk::end_renderpass(cmd);
}
for (const rsx_subresource_layout &layout : subresource_layout)
{
if (!heap_align) [[likely]]