Bug 1236787 - Check internalformat to pass getInternalformatParameter in gl-object-get-calls.html (2.0); r?jgilbert draft
authorDaosheng Mu <daoshengmu@gmail.com>
Thu, 14 Jul 2016 11:27:27 +0800
changeset 387494 1e3997b8b8d608497d48976549ceea3344ef49f9
parent 386893 04821a70c739a00d12e12df651c0989441e22728
child 525356 95cb89809f961e879239370aa24735a4bef6d31e
push id22965
push userbmo:dmu@mozilla.com
push dateThu, 14 Jul 2016 04:49:40 +0000
reviewersjgilbert
bugs1236787
milestone50.0a1
Bug 1236787 - Check internalformat to pass getInternalformatParameter in gl-object-get-calls.html (2.0); r?jgilbert MozReview-Commit-ID: ALsgs1MSmtj
dom/canvas/WebGL2ContextRenderbuffers.cpp
--- a/dom/canvas/WebGL2ContextRenderbuffers.cpp
+++ b/dom/canvas/WebGL2ContextRenderbuffers.cpp
@@ -13,28 +13,53 @@ namespace mozilla {
 
 void
 WebGL2Context::GetInternalformatParameter(JSContext* cx, GLenum target,
                                           GLenum internalformat, GLenum pname,
                                           JS::MutableHandleValue retval,
                                           ErrorResult& out_rv)
 {
     const char funcName[] = "getInternalfomratParameter";
+    retval.setObjectOrNull(nullptr);
+
     if (IsContextLost())
         return;
 
     if (target != LOCAL_GL_RENDERBUFFER) {
         ErrorInvalidEnum("%s: `target` must be RENDERBUFFER, was: 0x%04x.", funcName,
                          target);
         return;
     }
 
-    // GL_INVALID_ENUM is generated if internalformat is not color-, depth-, or
-    // stencil-renderable.
-    // TODO: When format table queries lands.
+    // GLES 3.0.4 $4.4.4 p212:
+    // "An internal format is color-renderable if it is one of the formats from table 3.13
+    //  noted as color-renderable or if it is unsized format RGBA or RGB."
+
+    GLenum sizedFormat;
+    switch (internalformat) {
+    case LOCAL_GL_RGB:
+        sizedFormat = LOCAL_GL_RGB8;
+        break;
+    case LOCAL_GL_RGBA:
+        sizedFormat = LOCAL_GL_RGBA8;
+        break;
+    default:
+        sizedFormat = internalformat;
+        break;
+    }
+
+    // In RenderbufferStorage, we allow DEPTH_STENCIL. Therefore, it is accepted for
+    // internalformat as well. Please ignore the conformance test fail for DEPTH_STENCIL.
+
+    const auto usage = mFormatUsage->GetRBUsage(sizedFormat);
+    if (!usage) {
+        ErrorInvalidEnum("%s: `internalformat` must be color-, depth-, or stencil-renderable, was: 0x%04x.",
+                         funcName, internalformat);
+        return;
+    }
 
     if (pname != LOCAL_GL_SAMPLES) {
         ErrorInvalidEnumInfo("%s: `pname` must be SAMPLES, was 0x%04x.", funcName, pname);
         return;
     }
 
     GLint* samples = nullptr;
     GLint sampleCount = 0;