renderer_vulkan: Fix renderpass issues

* The cache didn't take into account the framebuffer and render area used, so if these changed the renderpass wouldn't restart. This caused graphical bugs in Pokemon X/Y
This commit is contained in:
emufan4568
2022-10-15 01:34:26 +03:00
committed by GPUCode
parent 5b6e99b194
commit a5351bc596
4 changed files with 9 additions and 9 deletions

View File

@ -996,6 +996,7 @@ void RendererVulkan::SwapBuffers() {
void RendererVulkan::FlushBuffers() { void RendererVulkan::FlushBuffers() {
vertex_buffer.Flush(); vertex_buffer.Flush();
rasterizer->FlushBuffers(); rasterizer->FlushBuffers();
renderpass_cache.ExitRenderpass();
} }
void RendererVulkan::OnSlotSwitch() { void RendererVulkan::OnSlotSwitch() {

View File

@ -844,8 +844,7 @@ bool RasterizerVulkan::Draw(bool accelerate, bool is_indexed) {
} }
const vk::RenderPassBeginInfo renderpass_begin = { const vk::RenderPassBeginInfo renderpass_begin = {
.renderPass = renderpass_cache.GetRenderpass(pipeline_info.color_attachment, .renderPass = framebuffer_info.renderpass,
pipeline_info.depth_attachment, false),
.framebuffer = it->second, .framebuffer = it->second,
.renderArea = vk::Rect2D{.offset = {static_cast<s32>(draw_rect.left), .renderArea = vk::Rect2D{.offset = {static_cast<s32>(draw_rect.left),
static_cast<s32>(draw_rect.bottom)}, static_cast<s32>(draw_rect.bottom)},

View File

@ -89,27 +89,27 @@ RenderpassCache::~RenderpassCache() {
} }
void RenderpassCache::EnterRenderpass(const vk::RenderPassBeginInfo begin_info) { void RenderpassCache::EnterRenderpass(const vk::RenderPassBeginInfo begin_info) {
if (active_renderpass == begin_info.renderPass) { if (active_begin == begin_info) {
return; return;
} }
vk::CommandBuffer command_buffer = scheduler.GetRenderCommandBuffer(); vk::CommandBuffer command_buffer = scheduler.GetRenderCommandBuffer();
if (active_renderpass) { if (active_begin.renderPass) {
command_buffer.endRenderPass(); command_buffer.endRenderPass();
} }
command_buffer.beginRenderPass(begin_info, vk::SubpassContents::eInline); command_buffer.beginRenderPass(begin_info, vk::SubpassContents::eInline);
active_renderpass = begin_info.renderPass; active_begin = begin_info;
} }
void RenderpassCache::ExitRenderpass() { void RenderpassCache::ExitRenderpass() {
if (!active_renderpass) { if (!active_begin.renderPass) {
return; return;
} }
vk::CommandBuffer command_buffer = scheduler.GetRenderCommandBuffer(); vk::CommandBuffer command_buffer = scheduler.GetRenderCommandBuffer();
command_buffer.endRenderPass(); command_buffer.endRenderPass();
active_renderpass = VK_NULL_HANDLE; active_begin = vk::RenderPassBeginInfo{};
} }
void RenderpassCache::CreatePresentRenderpass(vk::Format format) { void RenderpassCache::CreatePresentRenderpass(vk::Format format) {

View File

@ -39,7 +39,7 @@ public:
/// Invalidates the currently active renderpass /// Invalidates the currently active renderpass
void OnSlotSwitch() { void OnSlotSwitch() {
active_renderpass = VK_NULL_HANDLE; active_begin = vk::RenderPassBeginInfo{};
} }
private: private:
@ -52,7 +52,7 @@ private:
const Instance& instance; const Instance& instance;
TaskScheduler& scheduler; TaskScheduler& scheduler;
vk::RenderPass active_renderpass = VK_NULL_HANDLE; vk::RenderPassBeginInfo active_begin{};
vk::RenderPass present_renderpass{}; vk::RenderPass present_renderpass{};
vk::RenderPass cached_renderpasses[MAX_COLOR_FORMATS + 1][MAX_DEPTH_FORMATS + 1][2]; vk::RenderPass cached_renderpasses[MAX_COLOR_FORMATS + 1][MAX_DEPTH_FORMATS + 1][2];
}; };