Bug 1285676 - Don't call into GL for GetFramebufferAttachmentParameter. - r=ethlin draft
authorJeff Gilbert <jgilbert@mozilla.com>
Fri, 08 Jul 2016 15:48:36 -0700
changeset 385658 f9ce96600efbb976c48740c690cb842395c356f0
parent 385657 607f4275b71b551ed5bd345ef0f5223e73eade75
child 524993 a9ddb830259f24ca63b8285ff78d22a530e84096
push id22570
push userbmo:jgilbert@mozilla.com
push dateFri, 08 Jul 2016 22:48:58 +0000
reviewersethlin
bugs1285676
milestone50.0a1
Bug 1285676 - Don't call into GL for GetFramebufferAttachmentParameter. - r=ethlin MozReview-Commit-ID: G7ub5GG7bJ
dom/canvas/WebGLFramebuffer.cpp
--- 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)