Fix conformance2/textures/misc/tex-storage-compressed-formats. draft
authorJeff Gilbert <jdashg@gmail.com>
Thu, 17 Dec 2015 16:16:53 -0800
changeset 316095 c536f648af8eababfaedd548bc4d85e95f5b1408
parent 316094 29ed303d6ede7ce878e821a3c0c3959a9ee63e55
child 316096 f6ad7cb0c6cfcb66c73bb90f1a5218b08dab099d
push id8514
push userjgilbert@mozilla.com
push dateFri, 18 Dec 2015 00:24:33 +0000
milestone45.0a1
Fix conformance2/textures/misc/tex-storage-compressed-formats. Really the test is wrong, but I updated the tests to check that TEXTURE_3D doesn't work for ES3 formats, but that TEXTURE_2D_ARRAY does.
dom/canvas/WebGL2ContextTextures.cpp
dom/canvas/WebGLContext.h
dom/canvas/WebGLContextTextures.cpp
--- a/dom/canvas/WebGL2ContextTextures.cpp
+++ b/dom/canvas/WebGL2ContextTextures.cpp
@@ -5,72 +5,42 @@
 
 #include "GLContext.h"
 #include "WebGL2Context.h"
 #include "WebGLContextUtils.h"
 #include "WebGLTexture.h"
 
 namespace mozilla {
 
-static bool
-ValidateTargetMatchesFuncDims(WebGLContext* webgl, const char* funcName, uint8_t funcDims,
-                              GLenum rawTexTarget)
-{
-    uint8_t targetDims = 0;
-    switch (rawTexTarget) {
-    case LOCAL_GL_TEXTURE_2D:
-    case LOCAL_GL_TEXTURE_CUBE_MAP:
-        targetDims = 2;
-        break;
-
-    case LOCAL_GL_TEXTURE_3D:
-        targetDims = 3;
-        break;
-    }
-
-    if (targetDims != funcDims) {
-        webgl->ErrorInvalidEnum("%s: Invalid texTarget.", funcName);
-        return false;
-    }
-
-    return true;
-}
-
 void
 WebGL2Context::TexStorage2D(GLenum rawTexTarget, GLsizei levels, GLenum internalFormat,
                             GLsizei width, GLsizei height)
 {
     const char funcName[] = "TexStorage2D";
     const uint8_t funcDims = 2;
 
-    if (!ValidateTargetMatchesFuncDims(this, funcName, funcDims, rawTexTarget))
-        return;
-
     TexTarget target;
     WebGLTexture* tex;
-    if (!ValidateTexTarget(this, funcName, rawTexTarget, &target, &tex))
+    if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &target, &tex))
         return;
 
     const GLsizei depth = 1;
     tex->TexStorage(funcName, target, levels, internalFormat, width, height, depth);
 }
 
 void
 WebGL2Context::TexStorage3D(GLenum rawTexTarget, GLsizei levels, GLenum internalFormat,
                             GLsizei width, GLsizei height, GLsizei depth)
 {
     const char funcName[] = "texStorage3D";
     const uint8_t funcDims = 3;
 
-    if (!ValidateTargetMatchesFuncDims(this, funcName, funcDims, rawTexTarget))
-        return;
-
     TexTarget target;
     WebGLTexture* tex;
-    if (!ValidateTexTarget(this, funcName, rawTexTarget, &target, &tex))
+    if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &target, &tex))
         return;
 
     tex->TexStorage(funcName, target, levels, internalFormat, width, height, depth);
 }
 
 void
 WebGL2Context::TexImage3D(GLenum rawTexImageTarget, GLint level, GLenum internalFormat,
                           GLsizei width, GLsizei height, GLsizei depth, GLint border,
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -1684,18 +1684,19 @@ WebGLContext::ValidateObject(const char*
 template<typename V, typename M>
 V
 RoundUpToMultipleOf(const V& value, const M& multiple)
 {
     return ((value + multiple - 1) / multiple) * multiple;
 }
 
 bool
-ValidateTexTarget(WebGLContext* webgl, const char* funcName, GLenum rawTexTarget,
-                  TexTarget* const out_texTarget, WebGLTexture** const out_tex);
+ValidateTexTarget(WebGLContext* webgl, const char* funcName, uint8_t funcDims,
+                  GLenum rawTexTarget, TexTarget* const out_texTarget,
+                  WebGLTexture** const out_tex);
 bool
 ValidateTexImageTarget(WebGLContext* webgl, const char* funcName, uint8_t funcDims,
                        GLenum rawTexImageTarget, TexImageTarget* const out_texImageTarget,
                        WebGLTexture** const out_tex);
 
 class UniqueBuffer
 {
     // Like UniquePtr<>, but for void* and malloc/calloc/free.
--- a/dom/canvas/WebGLContextTextures.cpp
+++ b/dom/canvas/WebGLContextTextures.cpp
@@ -47,35 +47,43 @@
 #include "mozilla/dom/BindingUtils.h"
 #include "mozilla/dom/ImageData.h"
 #include "mozilla/dom/ToJSValue.h"
 #include "mozilla/Endian.h"
 
 namespace mozilla {
 
 static bool
-IsValidTexTarget(WebGLContext* webgl, GLenum rawTexTarget,
+IsValidTexTarget(WebGLContext* webgl, uint8_t funcDims, GLenum rawTexTarget,
                  TexTarget* const out)
 {
+    uint8_t targetDims;
+
     switch (rawTexTarget) {
     case LOCAL_GL_TEXTURE_2D:
     case LOCAL_GL_TEXTURE_CUBE_MAP:
+        targetDims = 2;
         break;
 
     case LOCAL_GL_TEXTURE_3D:
     case LOCAL_GL_TEXTURE_2D_ARRAY:
         if (!webgl->IsWebGL2())
             return false;
 
+        targetDims = 3;
         break;
 
     default:
         return false;
     }
 
+    // Some funcs (like GenerateMipmap) doesn't know the dimension, so don't check it.
+    if (funcDims && targetDims != funcDims)
+        return false;
+
     *out = rawTexTarget;
     return true;
 }
 
 static bool
 IsValidTexImageTarget(WebGLContext* webgl, uint8_t funcDims, GLenum rawTexImageTarget,
                       TexImageTarget* const out)
 {
@@ -107,24 +115,25 @@ IsValidTexImageTarget(WebGLContext* webg
     if (targetDims != funcDims)
         return false;
 
     *out = rawTexImageTarget;
     return true;
 }
 
 bool
-ValidateTexTarget(WebGLContext* webgl, const char* funcName, GLenum rawTexTarget,
-                  TexTarget* const out_texTarget, WebGLTexture** const out_tex)
+ValidateTexTarget(WebGLContext* webgl, const char* funcName, uint8_t funcDims,
+                  GLenum rawTexTarget, TexTarget* const out_texTarget,
+                  WebGLTexture** const out_tex)
 {
     if (webgl->IsContextLost())
         return false;
 
     TexTarget texTarget;
-    if (!IsValidTexTarget(webgl, rawTexTarget, &texTarget)) {
+    if (!IsValidTexTarget(webgl, funcDims, rawTexTarget, &texTarget)) {
         webgl->ErrorInvalidEnum("%s: Invalid texTarget.", funcName);
         return false;
     }
 
     WebGLTexture* tex = webgl->ActiveBoundTextureForTarget(texTarget);
     if (!tex) {
         webgl->ErrorInvalidOperation("%s: No texture is bound to this target.", funcName);
         return false;
@@ -231,33 +240,35 @@ WebGLContext::BindTexture(GLenum rawTarg
 
     *currentTexPtr = newTex;
 }
 
 void
 WebGLContext::GenerateMipmap(GLenum rawTexTarget)
 {
     const char funcName[] = "generateMipmap";
+    const uint8_t funcDims = 0;
 
     TexTarget texTarget;
     WebGLTexture* tex;
-    if (!ValidateTexTarget(this, funcName, rawTexTarget, &texTarget, &tex))
+    if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &texTarget, &tex))
         return;
 
     tex->GenerateMipmap(texTarget);
 }
 
 JS::Value
 WebGLContext::GetTexParameter(GLenum rawTexTarget, GLenum pname)
 {
     const char funcName[] = "getTexParameter";
+    const uint8_t funcDims = 0;
 
     TexTarget texTarget;
     WebGLTexture* tex;
-    if (!ValidateTexTarget(this, funcName, rawTexTarget, &texTarget, &tex))
+    if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &texTarget, &tex))
         return JS::NullValue();
 
     if (!IsTexParamValid(pname)) {
         ErrorInvalidEnumInfo("getTexParameter: pname", pname);
         return JS::NullValue();
     }
 
     return tex->GetTexParameter(texTarget, pname);
@@ -277,20 +288,21 @@ WebGLContext::IsTexture(WebGLTexture* te
 
 void
 WebGLContext::TexParameter_base(GLenum rawTexTarget, GLenum pname, GLint* maybeIntParam,
                                 GLfloat* maybeFloatParam)
 {
     MOZ_ASSERT(maybeIntParam || maybeFloatParam);
 
     const char funcName[] = "texParameter";
+    const uint8_t funcDims = 0;
 
     TexTarget texTarget;
     WebGLTexture* tex;
-    if (!ValidateTexTarget(this, funcName, rawTexTarget, &texTarget, &tex))
+    if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &texTarget, &tex))
         return;
 
     tex->TexParameter(texTarget, pname, maybeIntParam, maybeFloatParam);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////
 // Uploads