void WebGLFramebuffer::Attachment::FinalizeAttachment(gl::GLContext* gl, FBAttachment attachmentLoc) const { if (!mNeedsFinalize) return; mNeedsFinalize = false; if (!HasImage()) { if (attachmentLoc == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, LOCAL_GL_RENDERBUFFER, 0); gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, LOCAL_GL_RENDERBUFFER, 0); } else { gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(), LOCAL_GL_RENDERBUFFER, 0); } return; } MOZ_ASSERT(HasImage()); if (Texture()) { MOZ_ASSERT(gl == Texture()->Context()->GL()); const GLenum imageTarget = ImageTarget().get(); const GLint mipLevel = MipLevel(); const GLuint glName = Texture()->GLName(); if (attachmentLoc == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, imageTarget, glName, mipLevel); gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, imageTarget, glName, mipLevel); } else { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(), imageTarget, glName, mipLevel); } return; } if (Renderbuffer()) { Renderbuffer()->FramebufferRenderbuffer(attachmentLoc); return; } MOZ_ASSERT(false, "Should not get here."); }
void WebGLFramebuffer::AttachPoint::FinalizeAttachment(gl::GLContext* gl, FBAttachment attachmentLoc) const { if (!HasImage()) { switch (attachmentLoc.get()) { case LOCAL_GL_DEPTH_ATTACHMENT: case LOCAL_GL_STENCIL_ATTACHMENT: case LOCAL_GL_DEPTH_STENCIL_ATTACHMENT: break; default: gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(), LOCAL_GL_RENDERBUFFER, 0); break; } return; } MOZ_ASSERT(HasImage()); if (Texture()) { MOZ_ASSERT(gl == Texture()->Context()->GL()); const GLenum imageTarget = ImageTarget().get(); const GLint mipLevel = MipLevel(); const GLuint glName = Texture()->GLName(); if (attachmentLoc == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, imageTarget, glName, mipLevel); gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, imageTarget, glName, mipLevel); } else { gl->fFramebufferTexture2D(LOCAL_GL_FRAMEBUFFER, attachmentLoc.get(), imageTarget, glName, mipLevel); } return; } if (Renderbuffer()) { Renderbuffer()->FramebufferRenderbuffer(attachmentLoc); return; } MOZ_CRASH(); }
void WebGLRenderbuffer::FramebufferRenderbuffer(FBAttachment attachment) const { gl::GLContext* gl = mContext->gl; if (attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, attachment.get(), LOCAL_GL_RENDERBUFFER, mPrimaryRB); return; } GLuint stencilRB = mPrimaryRB; if (NeedsDepthStencilEmu(mContext->gl, InternalFormatForGL())) { MOZ_ASSERT(mSecondaryRB); stencilRB = mSecondaryRB; } gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_DEPTH_ATTACHMENT, LOCAL_GL_RENDERBUFFER, mPrimaryRB); gl->fFramebufferRenderbuffer(LOCAL_GL_FRAMEBUFFER, LOCAL_GL_STENCIL_ATTACHMENT, LOCAL_GL_RENDERBUFFER, stencilRB); }