Bug 1285676 - Don't call into GL for GetFramebufferAttachmentParameter. - r=ethlin
MozReview-Commit-ID: G7ub5GG7bJ
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -464,84 +464,136 @@ WebGLFBAttachPoint::GetParameter(const c
return JS::Int32Value(mTexturePtr ? LOCAL_GL_TEXTURE
: LOCAL_GL_RENDERBUFFER);
case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
return (mTexturePtr ? webgl->WebGLObjectAsJSValue(cx, mTexturePtr.get(),
*out_error)
: webgl->WebGLObjectAsJSValue(cx, mRenderbufferPtr.get(),
*out_error));
- ////////////////
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
- isPNameValid = true;
- break;
-
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
- MOZ_ASSERT(attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT);
- isPNameValid = true;
- break;
-
- case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
- if (webgl->IsWebGL2() ||
- webgl->IsExtensionEnabled(WebGLExtensionID::EXT_sRGB))
- {
- const auto format = Format();
- if (!format)
- return JS::NullValue();
- return JS::Int32Value(format->format->isSRGB ? LOCAL_GL_SRGB
- : LOCAL_GL_LINEAR);
- }
- break;
-
- ////////////////
+ //////
case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
if (mTexturePtr)
return JS::Int32Value(MipLevel());
break;
case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
if (mTexturePtr) {
GLenum face = 0;
if (mTexturePtr->Target() == LOCAL_GL_TEXTURE_CUBE_MAP) {
face = ImageTarget().get();
}
return JS::Int32Value(face);
}
break;
+ //////
+
case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
- if (mTexturePtr) {
+ if (webgl->IsWebGL2() && mTexturePtr) {
int32_t layer = 0;
if (ImageTarget() == LOCAL_GL_TEXTURE_2D_ARRAY ||
ImageTarget() == LOCAL_GL_TEXTURE_3D)
{
layer = Layer();
}
return JS::Int32Value(layer);
}
break;
+
+ //////
+
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
+ isPNameValid = webgl->IsWebGL2();
+ break;
+
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
+ isPNameValid = (webgl->IsWebGL2() ||
+ webgl->IsExtensionEnabled(WebGLExtensionID::EXT_sRGB));
+ break;
}
if (!isPNameValid) {
webgl->ErrorInvalidEnum("%s: Invalid pname: 0x%04x", funcName, pname);
return JS::NullValue();
}
- gl::GLContext* gl = webgl->GL();
- gl->MakeCurrent();
+ const auto usage = Format();
+ if (!usage)
+ return JS::NullValue();
+
+ const auto format = usage->format;
GLint ret = 0;
- gl->fGetFramebufferAttachmentParameteriv(target, attachment, pname, &ret);
+ switch (pname) {
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
+ ret = format->r;
+ break;
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
+ ret = format->g;
+ break;
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
+ ret = format->b;
+ break;
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
+ ret = format->a;
+ break;
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
+ ret = format->d;
+ break;
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
+ ret = format->s;
+ break;
+
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
+ ret = (format->isSRGB ? LOCAL_GL_SRGB
+ : LOCAL_GL_LINEAR);
+ break;
+
+ case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
+ MOZ_ASSERT(attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT);
+
+ switch (format->componentType) {
+ case webgl::ComponentType::Special:
+ MOZ_ASSERT(false, "Should never happen.");
+ MOZ_FALLTHROUGH;
+ case webgl::ComponentType::None:
+ ret = LOCAL_GL_NONE;
+ break;
+ case webgl::ComponentType::Int:
+ ret = LOCAL_GL_INT;
+ break;
+ case webgl::ComponentType::UInt:
+ ret = LOCAL_GL_UNSIGNED_INT;
+ break;
+ case webgl::ComponentType::NormInt:
+ ret = LOCAL_GL_SIGNED_NORMALIZED;
+ break;
+ case webgl::ComponentType::NormUInt:
+ ret = LOCAL_GL_UNSIGNED_NORMALIZED;
+ break;
+ case webgl::ComponentType::Float:
+ ret = LOCAL_GL_FLOAT;
+ break;
+ }
+ break;
+
+ default:
+ MOZ_ASSERT(false, "Missing case.");
+ break;
+ }
+
return JS::Int32Value(ret);
}
////////////////////////////////////////////////////////////////////////////////
// WebGLFramebuffer
WebGLFramebuffer::WebGLFramebuffer(WebGLContext* webgl, GLuint fbo)
: WebGLContextBoundObject(webgl)