Bug 1325301 - Simplify EnumName behavior and usage and add ErrorInvalidEnumArg(). - r=daoshengmu
MozReview-Commit-ID: JMRR1Hlgxda
--- a/dom/canvas/WebGL2ContextFramebuffers.cpp
+++ b/dom/canvas/WebGL2ContextFramebuffers.cpp
@@ -316,18 +316,20 @@ WebGL2Context::ReadBuffer(GLenum mode)
mBoundReadFramebuffer->ReadBuffer(funcName, mode);
return;
}
// Operating on the default framebuffer.
if (mode != LOCAL_GL_NONE &&
mode != LOCAL_GL_BACK)
{
+ nsCString enumName;
+ EnumName(mode, &enumName);
ErrorInvalidOperation("%s: If READ_FRAMEBUFFER is null, `mode` must be BACK or"
- " NONE. Was %s",
- funcName, EnumName(mode));
+ " NONE. Was %s.",
+ funcName, enumName.BeginReading());
return;
}
gl->Screen()->SetReadBuffer(mode);
}
} // namespace mozilla
--- a/dom/canvas/WebGL2ContextSamplers.cpp
+++ b/dom/canvas/WebGL2ContextSamplers.cpp
@@ -134,14 +134,14 @@ WebGL2Context::GetSamplerParameter(JSCon
{
GLfloat param = 0;
gl->fGetSamplerParameterfv(sampler.mGLName, pname, ¶m);
retval.set(JS::Float32Value(param));
}
return;
default:
- ErrorInvalidEnum("%s: invalid pname: %s", funcName, EnumName(pname));
+ ErrorInvalidEnumArg(funcName, "pname", pname);
return;
}
}
} // namespace mozilla
--- a/dom/canvas/WebGL2ContextUniforms.cpp
+++ b/dom/canvas/WebGL2ContextUniforms.cpp
@@ -156,17 +156,17 @@ ValidateUniformEnum(WebGLContext* webgl,
case LOCAL_GL_UNIFORM_BLOCK_INDEX:
case LOCAL_GL_UNIFORM_OFFSET:
case LOCAL_GL_UNIFORM_ARRAY_STRIDE:
case LOCAL_GL_UNIFORM_MATRIX_STRIDE:
case LOCAL_GL_UNIFORM_IS_ROW_MAJOR:
return true;
default:
- webgl->ErrorInvalidEnum("%s: invalid pname: %s", info, webgl->EnumName(pname));
+ webgl->ErrorInvalidEnumArg(info, "pname", pname);
return false;
}
}
void
WebGL2Context::GetActiveUniforms(JSContext* cx, const WebGLProgram& program,
const dom::Sequence<GLuint>& uniformIndices,
GLenum pname, JS::MutableHandleValue retval)
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -377,27 +377,27 @@ public:
void ErrorInvalidValue(const char* fmt = 0, ...);
void ErrorInvalidFramebufferOperation(const char* fmt = 0, ...);
void ErrorInvalidEnumInfo(const char* info, GLenum enumValue);
void ErrorInvalidEnumInfo(const char* info, const char* funcName,
GLenum enumValue);
void ErrorOutOfMemory(const char* fmt = 0, ...);
void ErrorImplementationBug(const char* fmt = 0, ...);
+ void ErrorInvalidEnumArg(const char* funcName, const char* argName, GLenum val);
+
const char* ErrorName(GLenum error);
/**
* Return displayable name for GLenum.
* This version is like gl::GLenumToStr but with out the GL_ prefix to
* keep consistency with how errors are reported from WebGL.
+ * Returns hex formatted version of glenum if glenum is unknown.
*/
- // Returns nullptr if glenum is unknown.
- static const char* EnumName(GLenum glenum);
- // Returns hex formatted version of glenum if glenum is unknown.
- static void EnumName(GLenum glenum, nsACString* out_name);
+ static void EnumName(GLenum val, nsCString* out_name);
void DummyReadFramebufferOperation(const char* funcName);
WebGLTexture* ActiveBoundTextureForTarget(const TexTarget texTarget) const {
switch (texTarget.get()) {
case LOCAL_GL_TEXTURE_2D:
return mBound2DTextures[mActiveTexture];
case LOCAL_GL_TEXTURE_CUBE_MAP:
--- a/dom/canvas/WebGLContextDraw.cpp
+++ b/dom/canvas/WebGLContextDraw.cpp
@@ -402,20 +402,23 @@ public:
GLenum attribDataBaseType;
if (attribData.mEnabled) {
attribDataBaseType = attribData.BaseType();
} else {
attribDataBaseType = mWebGL->mGenericVertexAttribTypes[loc];
}
if (attribDataBaseType != progAttrib.mBaseType) {
- mWebGL->ErrorInvalidOperation("%s: Vertex attrib %u data should have type"
- " 0x04x, was 0x04x.",
- funcName, loc, progAttrib.mBaseType,
- attribDataBaseType);
+ nsCString progType, dataType;
+ WebGLContext::EnumName(progAttrib.mBaseType, &progType);
+ WebGLContext::EnumName(attribDataBaseType, &dataType);
+ mWebGL->ErrorInvalidOperation("%s: Vertex attrib %u requires data of type"
+ " %s, but is being supplied with type %s.",
+ funcName, loc, progType.BeginReading(),
+ dataType.BeginReading());
*out_error = true;
return;
}
}
////
mWebGL->RunContextLossTimer();
@@ -705,19 +708,21 @@ WebGLContext::DrawElements_check(const c
ErrorInvalidOperation("%s: bound vertex attribute buffers do not have sufficient "
"size for given indices from the bound element array",
funcName);
return false;
}
// Bug 1008310 - Check if buffer has been used with a different previous type
if (elemArrayBuffer.IsElementArrayUsedWithMultipleTypes()) {
+ nsCString typeName;
+ WebGLContext::EnumName(type, &typeName);
GenerateWarning("%s: bound element array buffer previously used with a type other than "
"%s, this will affect performance.",
- funcName, WebGLContext::EnumName(type));
+ funcName, typeName.BeginReading());
}
return true;
}
static void
HandleDrawElementsErrors(WebGLContext* webgl, const char* funcName,
gl::GLContext::LocalErrorScope& errorScope)
--- a/dom/canvas/WebGLContextUtils.cpp
+++ b/dom/canvas/WebGLContextUtils.cpp
@@ -241,22 +241,23 @@ WebGLContext::ErrorName(GLenum error)
case LOCAL_GL_NO_ERROR:
return "NO_ERROR";
default:
MOZ_ASSERT(false);
return "[unknown WebGL error]";
}
}
-// This version is 'fallible' and will return NULL if glenum is not recognized.
-const char*
-WebGLContext::EnumName(GLenum glenum)
+// This version is fallible and will return nullptr if unrecognized.
+static const char*
+GetEnumName(GLenum val)
{
- switch (glenum) {
+ switch (val) {
#define XX(x) case LOCAL_GL_##x: return #x
+ XX(NONE);
XX(ALPHA);
XX(ATC_RGB);
XX(ATC_RGBA_EXPLICIT_ALPHA);
XX(ATC_RGBA_INTERPOLATED_ALPHA);
XX(COMPRESSED_RGBA_PVRTC_2BPPV1);
XX(COMPRESSED_RGBA_PVRTC_4BPPV1);
XX(COMPRESSED_RGBA_S3TC_DXT1_EXT);
XX(COMPRESSED_RGBA_S3TC_DXT3_EXT);
@@ -268,16 +269,17 @@ WebGLContext::EnumName(GLenum glenum)
XX(DEPTH_COMPONENT);
XX(DEPTH_COMPONENT16);
XX(DEPTH_COMPONENT32);
XX(DEPTH_STENCIL);
XX(DEPTH24_STENCIL8);
XX(DRAW_FRAMEBUFFER);
XX(ETC1_RGB8_OES);
XX(FLOAT);
+ XX(INT);
XX(FRAMEBUFFER);
XX(HALF_FLOAT);
XX(LUMINANCE);
XX(LUMINANCE_ALPHA);
XX(READ_FRAMEBUFFER);
XX(RGB);
XX(RGB16F);
XX(RGB32F);
@@ -569,26 +571,34 @@ WebGLContext::EnumName(GLenum glenum)
XX(NUM_SAMPLE_COUNTS);
XX(TEXTURE_IMMUTABLE_LEVELS);
#undef XX
}
return nullptr;
}
-void
-WebGLContext::EnumName(GLenum glenum, nsACString* out_name)
+/*static*/ void
+WebGLContext::EnumName(GLenum val, nsCString* out_name)
{
- const char* name = EnumName(glenum);
+ const char* name = GetEnumName(val);
if (name) {
- *out_name = nsDependentCString(name);
- } else {
- nsPrintfCString enumAsHex("<enum 0x%04x>", glenum);
- *out_name = enumAsHex;
+ *out_name = name;
+ return;
}
+
+ *out_name = nsPrintfCString("<enum 0x%04x>", val);
+}
+
+void
+WebGLContext::ErrorInvalidEnumArg(const char* funcName, const char* argName, GLenum val)
+{
+ nsCString enumName;
+ EnumName(val, &enumName);
+ ErrorInvalidEnum("%s: Bad `%s`: %s", funcName, argName, enumName.BeginReading());
}
bool
IsCompressedTextureFormat(GLenum format)
{
switch (format) {
case LOCAL_GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
case LOCAL_GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
--- a/dom/canvas/WebGLContextValidate.cpp
+++ b/dom/canvas/WebGLContextValidate.cpp
@@ -795,14 +795,13 @@ WebGLContext::ValidateFramebufferTarget(
isValid = false;
break;
}
if (MOZ_LIKELY(isValid)) {
return true;
}
- ErrorInvalidEnum("%s: Invalid target: %s (0x%04x).", info, EnumName(target),
- target);
+ ErrorInvalidEnumArg(info, "target", target);
return false;
}
} // namespace mozilla
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -418,23 +418,24 @@ WebGLFBAttachPoint::GetParameter(const c
if (webgl->IsWebGL2())
return JS::NullValue();
break;
default:
break;
}
-
+ nsCString attachmentName;
+ WebGLContext::EnumName(attachment, &attachmentName);
if (webgl->IsWebGL2()) {
webgl->ErrorInvalidOperation("%s: No attachment at %s.", funcName,
- webgl->EnumName(attachment));
+ attachmentName.BeginReading());
} else {
webgl->ErrorInvalidEnum("%s: No attachment at %s.", funcName,
- webgl->EnumName(attachment));
+ attachmentName.BeginReading());
}
return JS::NullValue();
}
bool isPNameValid = false;
switch (pname) {
case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
return JS::Int32Value(mTexturePtr ? LOCAL_GL_TEXTURE
--- a/dom/canvas/WebGLQuery.cpp
+++ b/dom/canvas/WebGLQuery.cpp
@@ -131,18 +131,17 @@ WebGLQuery::GetQueryParameter(GLenum pna
const char funcName[] = "getQueryParameter";
switch (pname) {
case LOCAL_GL_QUERY_RESULT_AVAILABLE:
case LOCAL_GL_QUERY_RESULT:
break;
default:
- mContext->ErrorInvalidEnum("%s: Invalid pname: %s", funcName,
- mContext->EnumName(pname));
+ mContext->ErrorInvalidEnumArg(funcName, "pname", pname);
return;
}
if (!mTarget) {
mContext->ErrorInvalidOperation("%s: Query has never been active.", funcName);
return;
}
--- a/dom/canvas/WebGLSampler.cpp
+++ b/dom/canvas/WebGLSampler.cpp
@@ -126,22 +126,21 @@ ValidateSamplerParameterParams(WebGLCont
return true;
default:
break;
}
break;
default:
- webgl->ErrorInvalidEnum("%s: invalid pname: %s", funcName,
- webgl->EnumName(pname));
+ webgl->ErrorInvalidEnumArg(funcName, "pname", pname);
return false;
}
- webgl->ErrorInvalidEnum("%s: invalid param: %s", funcName, webgl->EnumName(paramInt));
+ webgl->ErrorInvalidEnumArg(funcName, "param", paramInt);
return false;
}
void
WebGLSampler::SamplerParameter(const char* funcName, GLenum pname, GLint paramInt)
{
if (!ValidateSamplerParameterParams(mContext, funcName, pname, paramInt))
return;