GPU: Support clears that don't clear the color buffer.

master
Subv 2018-07-02 19:09:03 +07:00
parent be51120d23
commit c1811ed3d1
2 changed files with 17 additions and 6 deletions

@ -420,8 +420,9 @@ bool Maxwell3D::IsShaderStageEnabled(Regs::ShaderStage stage) const {
} }
void Maxwell3D::ProcessClearBuffers() { void Maxwell3D::ProcessClearBuffers() {
ASSERT(regs.clear_buffers.R && regs.clear_buffers.G && regs.clear_buffers.B && ASSERT(regs.clear_buffers.R == regs.clear_buffers.G &&
regs.clear_buffers.A); regs.clear_buffers.R == regs.clear_buffers.B &&
regs.clear_buffers.R == regs.clear_buffers.A);
VideoCore::g_renderer->Rasterizer()->Clear(); VideoCore::g_renderer->Rasterizer()->Clear();
} }

@ -300,6 +300,20 @@ bool RasterizerOpenGL::AccelerateDrawBatch(bool is_indexed) {
void RasterizerOpenGL::Clear() { void RasterizerOpenGL::Clear() {
const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs; const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
GLbitfield clear_mask = 0;
if (regs.clear_buffers.R && regs.clear_buffers.G && regs.clear_buffers.B &&
regs.clear_buffers.A) {
clear_mask |= GL_COLOR_BUFFER_BIT;
}
if (regs.clear_buffers.Z)
clear_mask |= GL_DEPTH_BUFFER_BIT;
if (clear_mask == 0)
return;
// Sync the depth test state before configuring the framebuffer surfaces.
SyncDepthTestState();
// TODO(bunnei): Implement these // TODO(bunnei): Implement these
const bool has_stencil = false; const bool has_stencil = false;
const bool using_color_fb = true; const bool using_color_fb = true;
@ -353,10 +367,6 @@ void RasterizerOpenGL::Clear() {
regs.clear_color[3]); regs.clear_color[3]);
glClearDepth(regs.clear_depth); glClearDepth(regs.clear_depth);
GLbitfield clear_mask = GL_COLOR_BUFFER_BIT;
if (regs.clear_buffers.Z)
clear_mask |= GL_DEPTH_BUFFER_BIT;
glClear(clear_mask); glClear(clear_mask);
// Mark framebuffer surfaces as dirty // Mark framebuffer surfaces as dirty