Optimize good FB status instead of bad, and mark depth24 renderable.
draft
Optimize good FB status instead of bad, and mark depth24 renderable.
--- a/dom/canvas/WebGLExtensionDepthTexture.cpp
+++ b/dom/canvas/WebGLExtensionDepthTexture.cpp
@@ -14,16 +14,18 @@ WebGLExtensionDepthTexture::WebGLExtensi
: WebGLExtensionBase(webgl)
{
auto& fua = webgl->mFormatUsage;
const auto fnAdd = [&fua](webgl::EffectiveFormat effFormat, GLenum unpackFormat,
GLenum unpackType)
{
auto usage = fua->EditUsage(effFormat);
+ usage->isRenderable = true;
+
const webgl::PackingInfo pi = {unpackFormat, unpackType};
const webgl::DriverUnpackInfo dui = {unpackFormat, unpackFormat, unpackType};
fua->AddUnsizedTexFormat(pi, usage);
usage->AddUnpack(pi, dui);
};
fnAdd(webgl::EffectiveFormat::DEPTH_COMPONENT16, LOCAL_GL_DEPTH_COMPONENT,
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -397,17 +397,17 @@ WebGLFBAttachPoint::GetParameter(WebGLCo
}
////////////////////////////////////////////////////////////////////////////////
// WebGLFramebuffer
WebGLFramebuffer::WebGLFramebuffer(WebGLContext* webgl, GLuint fbo)
: WebGLContextBoundObject(webgl)
, mGLName(fbo)
- , mStatus(0)
+ , mIsKnownFBComplete(false)
, mReadBufferMode(LOCAL_GL_COLOR_ATTACHMENT0)
, mColorAttachment0(this, LOCAL_GL_COLOR_ATTACHMENT0)
, mDepthAttachment(this, LOCAL_GL_DEPTH_ATTACHMENT)
, mStencilAttachment(this, LOCAL_GL_STENCIL_ATTACHMENT)
, mDepthStencilAttachment(this, LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
#ifdef ANDROID
, mIsFB(false)
#endif
@@ -679,32 +679,36 @@ WebGLFramebuffer::PrecheckFramebufferSta
return LOCAL_GL_FRAMEBUFFER_UNSUPPORTED;
return LOCAL_GL_FRAMEBUFFER_COMPLETE;
}
FBStatus
WebGLFramebuffer::CheckFramebufferStatus() const
{
- if (mStatus != 0)
- return mStatus;
+ if (mIsKnownFBComplete)
+ return LOCAL_GL_FRAMEBUFFER_COMPLETE;
- mStatus = PrecheckFramebufferStatus().get();
- if (mStatus != LOCAL_GL_FRAMEBUFFER_COMPLETE)
- return mStatus;
+ 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.
- mStatus = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
- return mStatus;
+ ret = mContext->gl->fCheckFramebufferStatus(LOCAL_GL_FRAMEBUFFER);
+
+ if (ret == LOCAL_GL_FRAMEBUFFER_COMPLETE)
+ mIsKnownFBComplete = true;
+
+ return ret;
}
bool
WebGLFramebuffer::HasCompletePlanes(GLbitfield mask)
{
if (CheckFramebufferStatus() != LOCAL_GL_FRAMEBUFFER_COMPLETE)
return false;
@@ -859,18 +863,16 @@ FinalizeDrawAndReadBuffers(gl::GLContext
}
void
WebGLFramebuffer::FinalizeAttachments() const
{
MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
mContext->mBoundReadFramebuffer == this);
- MOZ_ASSERT(mStatus == LOCAL_GL_FRAMEBUFFER_COMPLETE);
-
gl::GLContext* gl = mContext->gl;
// Nuke the depth and stencil attachment points.
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);
--- a/dom/canvas/WebGLFramebuffer.h
+++ b/dom/canvas/WebGLFramebuffer.h
@@ -108,17 +108,17 @@ class WebGLFramebuffer final
friend class WebGLContext;
public:
MOZ_DECLARE_WEAKREFERENCE_TYPENAME(WebGLFramebuffer)
const GLuint mGLName;
private:
- mutable GLenum mStatus;
+ mutable bool mIsKnownFBComplete;
GLenum mReadBufferMode;
// No need to chase pointers for the oft-used color0.
WebGLFBAttachPoint mColorAttachment0;
WebGLFBAttachPoint mDepthAttachment;
WebGLFBAttachPoint mStencilAttachment;
WebGLFBAttachPoint mDepthStencilAttachment;
@@ -215,17 +215,17 @@ public:
bool CheckAndInitializeAttachments();
bool CheckColorAttachmentNumber(FBAttachment attachment,
const char* funcName) const;
void EnsureColorAttachPoints(size_t colorAttachmentId);
void InvalidateFramebufferStatus() const {
- mStatus = 0;
+ mIsKnownFBComplete = false;
}
bool ValidateForRead(const char* info,
const webgl::FormatUsageInfo** const out_format,
uint32_t* const out_width, uint32_t* const out_height);
JS::Value GetAttachmentParameter(JSContext* cx, GLenum target, GLenum attachment,
GLenum pname, ErrorResult* const out_error);