diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index f6d7493f46..28a82404f0 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -2092,6 +2092,10 @@ void OpenGLDriver::beginRenderPass(Handle rth, params.clearColor, params.clearDepth, params.clearStencil); } + // we need to reset those after we call clearWithRasterPipe() + mRenderPassColorWrite = any(clearFlags & TargetBufferFlags::COLOR_ALL); + mRenderPassDepthWrite = any(clearFlags & TargetBufferFlags::DEPTH); + gl.viewport(params.viewport.left, params.viewport.bottom, params.viewport.width, params.viewport.height); @@ -2112,11 +2116,18 @@ void OpenGLDriver::endRenderPass(int) { GLRenderTarget const* const rt = handle_cast(mRenderPassTarget); - const TargetBufferFlags discardFlags = mRenderPassParams.flags.discardEnd & rt->targets; + TargetBufferFlags discardFlags = mRenderPassParams.flags.discardEnd & rt->targets; if (rt->gl.fbo_read) { resolvePass(ResolveAction::STORE, rt, discardFlags); } + if (!mRenderPassColorWrite) { + discardFlags &= ~TargetBufferFlags::COLOR_ALL; + } + if (!mRenderPassDepthWrite) { + discardFlags &= ~TargetBufferFlags::DEPTH; + } + // glInvalidateFramebuffer appeared on GLES 3.0 and GL4.3, for simplicity we just // ignore it on GL (rather than having to do a runtime check). if (GLES30_HEADERS) { diff --git a/filament/backend/src/opengl/OpenGLDriver.h b/filament/backend/src/opengl/OpenGLDriver.h index 34e950950f..cae46bddc8 100644 --- a/filament/backend/src/opengl/OpenGLDriver.h +++ b/filament/backend/src/opengl/OpenGLDriver.h @@ -316,6 +316,8 @@ private: void setRasterStateSlow(backend::RasterState rs) noexcept; void setRasterState(backend::RasterState rs) noexcept { + mRenderPassColorWrite |= rs.colorWrite; + mRenderPassDepthWrite |= rs.depthWrite; if (UTILS_UNLIKELY(rs != mRasterState)) { setRasterStateSlow(rs); } @@ -374,6 +376,8 @@ private: // state required to represent the current render pass backend::Handle mRenderPassTarget; backend::RenderPassParams mRenderPassParams; + GLboolean mRenderPassColorWrite{}; + GLboolean mRenderPassDepthWrite{}; void clearWithRasterPipe(backend::TargetBufferFlags clearFlags, math::float4 const& linearColor, GLfloat depth, GLint stencil) noexcept;