FBStatus WebGLFramebuffer::CheckFramebufferStatus(nsCString* const out_info) const { if (mIsKnownFBComplete) return LOCAL_GL_FRAMEBUFFER_COMPLETE; FBStatus ret = PrecheckFramebufferStatus(out_info); if (ret != LOCAL_GL_FRAMEBUFFER_COMPLETE) return ret; // Looks good on our end. Let's ask the driver. mContext->MakeContextCurrent(); // Ok, attach our chosen flavor of {DEPTH, STENCIL, DEPTH_STENCIL}. FinalizeAttachments(); // TODO: This should not be unconditionally GL_FRAMEBUFFER. ret = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER); if (ret == LOCAL_GL_FRAMEBUFFER_COMPLETE) { mIsKnownFBComplete = true; } else { out_info->AssignLiteral("Bad status according to the driver"); } return ret; }
FBStatus WebGLFramebuffer::CheckFramebufferStatus() const { if (mStatus != 0) return mStatus; mStatus = PrecheckFramebufferStatus().get(); if (mStatus != LOCAL_GL_FRAMEBUFFER_COMPLETE) return mStatus; // Looks good on our end. Let's ask the driver. mContext->MakeContextCurrent(); // Ok, attach our chosen flavor of {DEPTH, STENCIL, DEPTH_STENCIL}. FinalizeAttachments(); // TODO: This should not be unconditionally GL_FRAMEBUFFER. mStatus = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER); return mStatus; }
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); }
FBStatus WebGLFramebuffer::CheckFramebufferStatus() const { if (mIsKnownFBComplete) return LOCAL_GL_FRAMEBUFFER_COMPLETE; FBStatus ret = PrecheckFramebufferStatus(); if (ret != LOCAL_GL_FRAMEBUFFER_COMPLETE) return ret; // Looks good on our end. Let's ask the driver. mContext->MakeContextCurrent(); // Ok, attach our chosen flavor of {DEPTH, STENCIL, DEPTH_STENCIL}. FinalizeAttachments(); // TODO: This should not be unconditionally GL_FRAMEBUFFER. ret = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER); if (ret == LOCAL_GL_FRAMEBUFFER_COMPLETE) mIsKnownFBComplete = true; return ret; }