bool WebGLFramebuffer::HasCompletePlanes(GLbitfield mask) { if (CheckFramebufferStatus() != LOCAL_GL_FRAMEBUFFER_COMPLETE) return false; MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this || mContext->mBoundReadFramebuffer == this); bool hasPlanes = true; if (mask & LOCAL_GL_COLOR_BUFFER_BIT) { hasPlanes &= ColorAttachmentCount() && ColorAttachment(0).IsDefined(); } if (mask & LOCAL_GL_DEPTH_BUFFER_BIT) { hasPlanes &= DepthAttachment().IsDefined() || DepthStencilAttachment().IsDefined(); } if (mask & LOCAL_GL_STENCIL_BUFFER_BIT) { hasPlanes &= StencilAttachment().IsDefined() || DepthStencilAttachment().IsDefined(); } return hasPlanes; }
void WebGLFramebuffer::FinalizeAttachments() const { gl::GLContext* gl = mContext->gl; for (size_t i = 0; i < ColorAttachmentCount(); i++) { ColorAttachment(i).FinalizeAttachment(gl, LOCAL_GL_COLOR_ATTACHMENT0+i); } DepthAttachment().FinalizeAttachment(gl, LOCAL_GL_DEPTH_ATTACHMENT); StencilAttachment().FinalizeAttachment(gl, LOCAL_GL_STENCIL_ATTACHMENT); DepthStencilAttachment().FinalizeAttachment(gl, LOCAL_GL_DEPTH_STENCIL_ATTACHMENT); FinalizeDrawAndReadBuffers(gl, ColorAttachment(0).IsDefined()); }
JS::Value WebGLFramebuffer::GetAttachmentParameter(const char* funcName, JSContext* cx, GLenum target, GLenum attachment, GLenum pname, ErrorResult* const out_error) { auto attachPoint = GetAttachPoint(attachment); if (!attachPoint) { mContext->ErrorInvalidEnum("%s: Can only query COLOR_ATTACHMENTi," " DEPTH_ATTACHMENT, DEPTH_STENCIL_ATTACHMENT, or" " STENCIL_ATTACHMENT for a framebuffer.", funcName); return JS::NullValue(); } if (mContext->IsWebGL2() && attachment == LOCAL_GL_DEPTH_STENCIL_ATTACHMENT) { // There are a couple special rules for this one. if (pname == LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE) { mContext->ErrorInvalidOperation("%s: Querying" " FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" " against DEPTH_STENCIL_ATTACHMENT is an" " error.", funcName); return JS::NullValue(); } if (AttachmentsDontMatch(DepthAttachment(), StencilAttachment())) { mContext->ErrorInvalidOperation("%s: DEPTH_ATTACHMENT and STENCIL_ATTACHMENT" " have different objects bound.", funcName); return JS::NullValue(); } attachPoint = GetAttachPoint(LOCAL_GL_DEPTH_ATTACHMENT); } FinalizeAttachments(); return attachPoint->GetParameter(funcName, mContext, cx, target, attachment, pname, out_error); }