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