diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 652463473a..564d568cae 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -191,6 +191,9 @@ void GLGSRender::begin() init_buffers(); + if (!draw_fbo.check()) + return; + std::chrono::time_point then = steady_clock::now(); bool color_mask_b = rsx::method_registers.color_mask_b(); @@ -377,7 +380,7 @@ namespace void GLGSRender::end() { - if (!draw_fbo) + if (!draw_fbo || !draw_fbo.check()) { rsx::thread::end(); return; diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.cpp b/rpcs3/Emu/RSX/GL/GLHelpers.cpp index d001fa72e9..4c735a0465 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.cpp +++ b/rpcs3/Emu/RSX/GL/GLHelpers.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "GLHelpers.h" +#include "Utilities/Log.h" namespace gl { @@ -84,15 +85,18 @@ namespace gl return m_id != 0; } - void fbo::check() const + bool fbo::check() const { save_binding_state save(*this); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { - fmt::throw_exception("0x%04x", status); + LOG_ERROR(RSX, "FBO check failed: 0x%04x", status); + return false; } + + return true; } void fbo::recreate() diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.h b/rpcs3/Emu/RSX/GL/GLHelpers.h index c50b22a7e8..953a753ca8 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.h +++ b/rpcs3/Emu/RSX/GL/GLHelpers.h @@ -1768,7 +1768,7 @@ namespace gl void bind_as(target target_) const; void remove(); bool created() const; - void check() const; + bool check() const; void recreate(); void draw_buffer(const attachment& buffer) const; diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index c3c3ee447b..ae3925a8b9 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -114,7 +114,8 @@ void GLGSRender::init_buffers(bool skip_reading) __glcheck draw_fbo.depth = *std::get<1>(m_rtts.m_bound_depth_stencil); } - __glcheck draw_fbo.check(); + if (!draw_fbo.check()) + return; //HACK: read_buffer shouldn't be there switch (rsx::method_registers.surface_color_target())