summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Subv2018-07-02 19:09:03 -0500
committerGravatar Subv2018-07-03 16:56:47 -0500
commitc1811ed3d1805e0d0ab536762692e7c0e80f14dc (patch)
tree620e2bd9d9ce15cbc0faaf3bc634ea00824c57b4 /src
parentGPU: Bind and clear the render target when the CLEAR_BUFFERS register is writ... (diff)
downloadyuzu-c1811ed3d1805e0d0ab536762692e7c0e80f14dc.tar.gz
yuzu-c1811ed3d1805e0d0ab536762692e7c0e80f14dc.tar.xz
yuzu-c1811ed3d1805e0d0ab536762692e7c0e80f14dc.zip
GPU: Support clears that don't clear the color buffer.
Diffstat (limited to '')
-rw-r--r--src/video_core/engines/maxwell_3d.cpp5
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp18
2 files changed, 17 insertions, 6 deletions
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp
index 78f1c0ea7..4d1a79c55 100644
--- a/src/video_core/engines/maxwell_3d.cpp
+++ b/src/video_core/engines/maxwell_3d.cpp
@@ -420,8 +420,9 @@ bool Maxwell3D::IsShaderStageEnabled(Regs::ShaderStage stage) const {
420} 420}
421 421
422void Maxwell3D::ProcessClearBuffers() { 422void Maxwell3D::ProcessClearBuffers() {
423 ASSERT(regs.clear_buffers.R && regs.clear_buffers.G && regs.clear_buffers.B && 423 ASSERT(regs.clear_buffers.R == regs.clear_buffers.G &&
424 regs.clear_buffers.A); 424 regs.clear_buffers.R == regs.clear_buffers.B &&
425 regs.clear_buffers.R == regs.clear_buffers.A);
425 426
426 VideoCore::g_renderer->Rasterizer()->Clear(); 427 VideoCore::g_renderer->Rasterizer()->Clear();
427} 428}
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 8e1171161..08c4df5dc 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -300,6 +300,20 @@ bool RasterizerOpenGL::AccelerateDrawBatch(bool is_indexed) {
300void RasterizerOpenGL::Clear() { 300void RasterizerOpenGL::Clear() {
301 const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; 301 const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
302 302
303 GLbitfield clear_mask = 0;
304 if (regs.clear_buffers.R && regs.clear_buffers.G && regs.clear_buffers.B &&
305 regs.clear_buffers.A) {
306 clear_mask |= GL_COLOR_BUFFER_BIT;
307 }
308 if (regs.clear_buffers.Z)
309 clear_mask |= GL_DEPTH_BUFFER_BIT;
310
311 if (clear_mask == 0)
312 return;
313
314 // Sync the depth test state before configuring the framebuffer surfaces.
315 SyncDepthTestState();
316
303 // TODO(bunnei): Implement these 317 // TODO(bunnei): Implement these
304 const bool has_stencil = false; 318 const bool has_stencil = false;
305 const bool using_color_fb = true; 319 const bool using_color_fb = true;
@@ -353,10 +367,6 @@ void RasterizerOpenGL::Clear() {
353 regs.clear_color[3]); 367 regs.clear_color[3]);
354 glClearDepth(regs.clear_depth); 368 glClearDepth(regs.clear_depth);
355 369
356 GLbitfield clear_mask = GL_COLOR_BUFFER_BIT;
357 if (regs.clear_buffers.Z)
358 clear_mask |= GL_DEPTH_BUFFER_BIT;
359
360 glClear(clear_mask); 370 glClear(clear_mask);
361 371
362 // Mark framebuffer surfaces as dirty 372 // Mark framebuffer surfaces as dirty