diff options
| author | 2018-07-02 19:09:03 -0500 | |
|---|---|---|
| committer | 2018-07-03 16:56:47 -0500 | |
| commit | c1811ed3d1805e0d0ab536762692e7c0e80f14dc (patch) | |
| tree | 620e2bd9d9ce15cbc0faaf3bc634ea00824c57b4 | |
| parent | GPU: Bind and clear the render target when the CLEAR_BUFFERS register is writ... (diff) | |
| download | yuzu-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.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 18 |
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 | ||
| 422 | void Maxwell3D::ProcessClearBuffers() { | 422 | void 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) { | |||
| 300 | void RasterizerOpenGL::Clear() { | 300 | void 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 |