Fix conformance2/textures/misc/tex-storage-compressed-formats.
draft
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.
--- 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