Bug 1303879 - Explicitly nuke attachment points. - r=mtseng
MozReview-Commit-ID: Gd9tFq3ZAtm
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -339,31 +339,18 @@ WebGLFBAttachPoint::IsComplete(WebGLCont
}
return true;
}
void
WebGLFBAttachPoint::Resolve(gl::GLContext* gl, FBTarget target) const
{
- if (!HasImage()) {
- switch (mAttachmentPoint) {
- case LOCAL_GL_DEPTH_ATTACHMENT:
- case LOCAL_GL_STENCIL_ATTACHMENT:
- case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT:
- break;
-
- default:
- gl->fFramebufferRenderbuffer(target.get(), mAttachmentPoint,
- LOCAL_GL_RENDERBUFFER, 0);
- break;
- }
-
+ if (!HasImage())
return;
- }
if (Renderbuffer()) {
Renderbuffer()->DoFramebufferRenderbuffer(target, mAttachmentPoint);
return;
}
MOZ_ASSERT(Texture());
MOZ_ASSERT(gl == Texture()->mContext->GL());
@@ -907,29 +894,34 @@ WebGLFramebuffer::ValidateForRead(const
// Resolution and caching
void
WebGLFramebuffer::ResolveAttachments(FBTarget target) const
{
const auto& gl = mContext->gl;
////
+ // Nuke attachment points.
+
+ for (uint32_t i = 0; i < mContext->mImplMaxColorAttachments; i++) {
+ const GLenum attachEnum = LOCAL_GL_COLOR_ATTACHMENT0 + i;
+ gl->fFramebufferRenderbuffer(target.get(), attachEnum, LOCAL_GL_RENDERBUFFER, 0);
+ }
+
+ gl->fFramebufferRenderbuffer(target.get(), LOCAL_GL_DEPTH_ATTACHMENT,
+ LOCAL_GL_RENDERBUFFER, 0);
+ gl->fFramebufferRenderbuffer(target.get(), LOCAL_GL_STENCIL_ATTACHMENT,
+ LOCAL_GL_RENDERBUFFER, 0);
+
+ ////
for (const auto& attach : mColorAttachments) {
attach.Resolve(gl, target);
}
- ////
-
- // Nuke the depth and stencil attachment points.
- gl->fFramebufferRenderbuffer(target.get(), LOCAL_GL_DEPTH_ATTACHMENT,
- LOCAL_GL_RENDERBUFFER, 0);
- gl->fFramebufferRenderbuffer(target.get(), LOCAL_GL_STENCIL_ATTACHMENT,
- LOCAL_GL_RENDERBUFFER, 0);
-
mDepthAttachment.Resolve(gl, target);
mStencilAttachment.Resolve(gl, target);
mDepthStencilAttachment.Resolve(gl, target);
}
bool
WebGLFramebuffer::ResolveAttachmentData(const char* funcName) const
{