diff --git a/src/libANGLE/renderer/gl/BlitGL.cpp b/src/libANGLE/renderer/gl/BlitGL.cpp index 4901801bb7..fc2d0d959f 100644 --- a/src/libANGLE/renderer/gl/BlitGL.cpp +++ b/src/libANGLE/renderer/gl/BlitGL.cpp @@ -1078,7 +1078,29 @@ angle::Result BlitGL::clearRenderbuffer(const gl::Context *context, mFunctions->framebufferRenderbuffer( GL_FRAMEBUFFER, bindTarget, GL_RENDERBUFFER, source->getRenderbufferID())); } - ANGLE_GL_TRY(context, mFunctions->clear(clearMask)); + + // glClear's effect on integer color buffers is undefined (GL/ES spec); use + // glClearBuffer{i,ui}v for integer-format color renderbuffers so that + // robust-resource-init actually zeroes them. + const gl::InternalFormat &internalFormatInfo = + gl::GetSizedInternalFormatInfo(sizedInternalFormat); + if ((clearMask & GL_COLOR_BUFFER_BIT) && internalFormatInfo.componentType == GL_INT) + { + constexpr GLint kZero[4] = {0, 0, 0, 0}; + ANGLE_GL_TRY(context, mFunctions->clearBufferiv(GL_COLOR, 0, kZero)); + clearMask &= ~static_cast(GL_COLOR_BUFFER_BIT); + } + else if ((clearMask & GL_COLOR_BUFFER_BIT) && + internalFormatInfo.componentType == GL_UNSIGNED_INT) + { + constexpr GLuint kZero[4] = {0, 0, 0, 0}; + ANGLE_GL_TRY(context, mFunctions->clearBufferuiv(GL_COLOR, 0, kZero)); + clearMask &= ~static_cast(GL_COLOR_BUFFER_BIT); + } + if (clearMask != 0) + { + ANGLE_GL_TRY(context, mFunctions->clear(clearMask)); + } // Unbind for (GLenum bindTarget : bindTargets)