From dab1dda90344169e61672433c9d3218c87b491b3 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 6 Apr 2016 00:43:32 +0300 Subject: [PATCH] Specify buffers to read when blitting output to backbuffer --- rpcs3/Emu/RSX/GL/gl_helpers.cpp | 8 ++++++++ rpcs3/Emu/RSX/GL/gl_helpers.h | 2 ++ rpcs3/Emu/RSX/GL/gl_render_targets.cpp | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.cpp b/rpcs3/Emu/RSX/GL/gl_helpers.cpp index 6274d3b0d3..862773713e 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.cpp +++ b/rpcs3/Emu/RSX/GL/gl_helpers.cpp @@ -122,6 +122,14 @@ namespace gl __glcheck glDrawBuffers((GLsizei)ids.size(), ids.data()); } + void fbo::read_buffer(const attachment& buffer) const + { + save_binding_state save(*this); + GLenum buf = buffer.id(); + + __glcheck glReadBuffer(buf); + } + void fbo::draw_arrays(rsx::primitive_type mode, GLsizei count, GLint first) const { save_binding_state save(*this); diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.h b/rpcs3/Emu/RSX/GL/gl_helpers.h index 0dbb35dad2..d4ef6f883c 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.h +++ b/rpcs3/Emu/RSX/GL/gl_helpers.h @@ -1550,6 +1550,8 @@ namespace gl void recreate(); void draw_buffer(const attachment& buffer) const; void draw_buffers(const std::initializer_list& indexes) const; + + void read_buffer(const attachment& buffer) const; void draw_arrays(rsx::primitive_type mode, GLsizei count, GLint first = 0) const; void draw_arrays(const buffer& buffer, rsx::primitive_type mode, GLsizei count, GLint first = 0) const; diff --git a/rpcs3/Emu/RSX/GL/gl_render_targets.cpp b/rpcs3/Emu/RSX/GL/gl_render_targets.cpp index 453078841c..0aef73fc28 100644 --- a/rpcs3/Emu/RSX/GL/gl_render_targets.cpp +++ b/rpcs3/Emu/RSX/GL/gl_render_targets.cpp @@ -76,6 +76,7 @@ void GLGSRender::init_buffers(bool skip_reading) if (draw_fbo && !m_rtts_dirty) return; + m_rtts_dirty = false; m_rtts.prepare_render_target(nullptr, surface_format, clip_horizontal, clip_vertical, rsx::to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]), @@ -88,9 +89,12 @@ void GLGSRender::init_buffers(bool skip_reading) if (std::get<0>(m_rtts.m_bound_render_targets[i]) != 0) __glcheck draw_fbo.color[i] = *std::get<1>(m_rtts.m_bound_render_targets[i]); } + if (std::get<0>(m_rtts.m_bound_depth_stencil) != 0) __glcheck draw_fbo.depth = *std::get<1>(m_rtts.m_bound_depth_stencil); + __glcheck draw_fbo.check(); + __glcheck draw_fbo.read_buffer(draw_fbo.color[0]); switch (rsx::to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET])) @@ -102,8 +106,11 @@ void GLGSRender::init_buffers(bool skip_reading) break; case rsx::surface_target::surface_b: + { __glcheck draw_fbo.draw_buffer(draw_fbo.color[1]); + __glcheck draw_fbo.read_buffer(draw_fbo.color[1]); break; + } case rsx::surface_target::surfaces_a_b: __glcheck draw_fbo.draw_buffers({ draw_fbo.color[0], draw_fbo.color[1] });