Fix GetFBAttach behavior for null attachments. draft
authorJeff Gilbert <jdashg@gmail.com>
Thu, 17 Dec 2015 16:16:53 -0800
changeset 316100 20518ef465a90d308707557cfb7d4f893a24e871
parent 316099 106ebb2afd44f652c38b697d537f70de99026b99
child 316101 033d8756c84bc8d0b07e6f9348210c2c6f3d8e99
push id8514
push userjgilbert@mozilla.com
push dateFri, 18 Dec 2015 00:24:33 +0000
milestone45.0a1
Fix GetFBAttach behavior for null attachments. Behavior diverges in GLES3 vs GLES2.
dom/canvas/WebGLFramebuffer.cpp
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -327,28 +327,49 @@ WebGLFBAttachPoint::FinalizeAttachment(g
 
 JS::Value
 WebGLFBAttachPoint::GetParameter(const char* funcName, WebGLContext* webgl, JSContext* cx,
                                  GLenum target, GLenum attachment, GLenum pname,
                                  ErrorResult* const out_error)
 {
     const bool hasAttachment = (mTexturePtr || mRenderbufferPtr);
     if (!hasAttachment) {
+        // Divergent between GLES 3 and 2.
+
+        // GLES 2.0.25 p127:
+        // "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is NONE, then querying any
+        //  other pname will generate INVALID_ENUM."
+
+        // GLES 3.0.4 p240:
+        // "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is NONE, no framebuffer is
+        //  bound to target. In this case querying pname
+        //  FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero, and all other queries
+        //  will generate an INVALID_OPERATION error."
         switch (pname) {
         case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
             return JS::Int32Value(LOCAL_GL_NONE);
 
         case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-            return JS::NullValue();
+            if (webgl->IsWebGL2())
+                return JS::NullValue();
+
+            break;
 
         default:
+            break;
+        }
+
+        if (webgl->IsWebGL2()) {
             webgl->ErrorInvalidOperation("%s: No attachment at %s.", funcName,
                                          webgl->EnumName(attachment));
-            return JS::NullValue();
+        } else {
+            webgl->ErrorInvalidEnum("%s: No attachment at %s.", funcName,
+                                    webgl->EnumName(attachment));
         }
+        return JS::NullValue();
     }
 
     bool isPNameValid = false;
     switch (pname) {
     case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
         return JS::Int32Value(mTexturePtr ? LOCAL_GL_TEXTURE
                                           : LOCAL_GL_RENDERBUFFER);