|
@@ -304,7 +304,8 @@ bool RasterizerOpenGL::AccelerateDrawBatch(bool is_indexed) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::pair<Surface, Surface> RasterizerOpenGL::ConfigureFramebuffers(bool using_color_fb,
|
|
std::pair<Surface, Surface> RasterizerOpenGL::ConfigureFramebuffers(bool using_color_fb,
|
|
|
- bool using_depth_fb) {
|
|
|
|
|
|
|
+ bool using_depth_fb,
|
|
|
|
|
+ bool preserve_contents) {
|
|
|
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
|
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
|
|
|
|
|
|
|
if (regs.rt[0].format == Tegra::RenderTargetFormat::NONE) {
|
|
if (regs.rt[0].format == Tegra::RenderTargetFormat::NONE) {
|
|
@@ -327,7 +328,7 @@ std::pair<Surface, Surface> RasterizerOpenGL::ConfigureFramebuffers(bool using_c
|
|
|
Surface depth_surface;
|
|
Surface depth_surface;
|
|
|
MathUtil::Rectangle<u32> surfaces_rect;
|
|
MathUtil::Rectangle<u32> surfaces_rect;
|
|
|
std::tie(color_surface, depth_surface, surfaces_rect) =
|
|
std::tie(color_surface, depth_surface, surfaces_rect) =
|
|
|
- res_cache.GetFramebufferSurfaces(using_color_fb, using_depth_fb);
|
|
|
|
|
|
|
+ res_cache.GetFramebufferSurfaces(using_color_fb, using_depth_fb, preserve_contents);
|
|
|
|
|
|
|
|
const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[0].GetRect()};
|
|
const MathUtil::Rectangle<s32> viewport_rect{regs.viewport_transform[0].GetRect()};
|
|
|
const MathUtil::Rectangle<u32> draw_rect{
|
|
const MathUtil::Rectangle<u32> draw_rect{
|
|
@@ -390,7 +391,7 @@ void RasterizerOpenGL::Clear() {
|
|
|
ScopeAcquireGLContext acquire_context{emu_window};
|
|
ScopeAcquireGLContext acquire_context{emu_window};
|
|
|
|
|
|
|
|
auto [dirty_color_surface, dirty_depth_surface] =
|
|
auto [dirty_color_surface, dirty_depth_surface] =
|
|
|
- ConfigureFramebuffers(use_color_fb, use_depth_fb);
|
|
|
|
|
|
|
+ ConfigureFramebuffers(use_color_fb, use_depth_fb, false);
|
|
|
|
|
|
|
|
// TODO(Subv): Support clearing only partial colors.
|
|
// TODO(Subv): Support clearing only partial colors.
|
|
|
glClearColor(regs.clear_color[0], regs.clear_color[1], regs.clear_color[2],
|
|
glClearColor(regs.clear_color[0], regs.clear_color[1], regs.clear_color[2],
|
|
@@ -445,7 +446,7 @@ void RasterizerOpenGL::DrawArrays() {
|
|
|
ScopeAcquireGLContext acquire_context{emu_window};
|
|
ScopeAcquireGLContext acquire_context{emu_window};
|
|
|
|
|
|
|
|
auto [dirty_color_surface, dirty_depth_surface] =
|
|
auto [dirty_color_surface, dirty_depth_surface] =
|
|
|
- ConfigureFramebuffers(true, regs.zeta.Address() != 0 && regs.zeta_enable != 0);
|
|
|
|
|
|
|
+ ConfigureFramebuffers(true, regs.zeta.Address() != 0 && regs.zeta_enable != 0, true);
|
|
|
|
|
|
|
|
SyncDepthTestState();
|
|
SyncDepthTestState();
|
|
|
SyncBlendState();
|
|
SyncBlendState();
|