Bug 1325476 - Use helper for Parameter[fi] funcs instead of maybeFloat/IntParam. - r=daoshengmu

MozReview-Commit-ID: 3jGFXfDNkPt
This commit is contained in:
Jeff Gilbert 2016-12-22 13:52:53 -08:00
parent 02fcc3f257
commit ac2df6af8a
7 changed files with 89 additions and 66 deletions

View File

@ -72,7 +72,7 @@ WebGL2Context::BindSampler(GLuint unit, WebGLSampler* sampler)
}
void
WebGL2Context::SamplerParameteri(WebGLSampler& sampler, GLenum pname, GLint paramInt)
WebGL2Context::SamplerParameteri(WebGLSampler& sampler, GLenum pname, GLint param)
{
const char funcName[] = "samplerParameteri";
if (IsContextLost())
@ -81,11 +81,11 @@ WebGL2Context::SamplerParameteri(WebGLSampler& sampler, GLenum pname, GLint para
if (!ValidateObject(funcName, sampler))
return;
sampler.SamplerParameter(funcName, pname, paramInt);
sampler.SamplerParameter(funcName, pname, FloatOrInt(param));
}
void
WebGL2Context::SamplerParameterf(WebGLSampler& sampler, GLenum pname, GLfloat paramFloat)
WebGL2Context::SamplerParameterf(WebGLSampler& sampler, GLenum pname, GLfloat param)
{
const char funcName[] = "samplerParameterf";
if (IsContextLost())
@ -94,7 +94,7 @@ WebGL2Context::SamplerParameterf(WebGLSampler& sampler, GLenum pname, GLfloat pa
if (!ValidateObject(funcName, sampler))
return;
sampler.SamplerParameter(funcName, pname, WebGLIntOrFloat(paramFloat).AsInt());
sampler.SamplerParameter(funcName, pname, FloatOrInt(param));
}
void

View File

@ -195,6 +195,32 @@ struct IndexedBufferBinding
uint64_t ByteCount() const;
};
////
struct FloatOrInt final // For TexParameter[fi] and friends.
{
const bool isFloat;
const GLfloat f;
const GLint i;
explicit FloatOrInt(GLint x)
: isFloat(false)
, f(x)
, i(x)
{ }
explicit FloatOrInt(GLfloat x)
: isFloat(true)
, f(x)
, i(roundf(x))
{ }
FloatOrInt& operator =(const FloatOrInt& x) {
memcpy(this, &x, sizeof(x));
return *this;
}
};
////////////////////////////////////
struct TexImageSource
@ -1002,17 +1028,16 @@ public:
bool IsTexture(WebGLTexture* tex);
void TexParameterf(GLenum texTarget, GLenum pname, GLfloat param) {
TexParameter_base(texTarget, pname, nullptr, &param);
TexParameter_base(texTarget, pname, FloatOrInt(param));
}
void TexParameteri(GLenum texTarget, GLenum pname, GLint param) {
TexParameter_base(texTarget, pname, &param, nullptr);
TexParameter_base(texTarget, pname, FloatOrInt(param));
}
protected:
JS::Value GetTexParameter(GLenum texTarget, GLenum pname);
void TexParameter_base(GLenum texTarget, GLenum pname, GLint* maybeIntParam,
GLfloat* maybeFloatParam);
void TexParameter_base(GLenum texTarget, GLenum pname, const FloatOrInt& param);
virtual bool IsTexParamValid(GLenum pname) const;

View File

@ -297,11 +297,9 @@ WebGLContext::IsTexture(WebGLTexture* tex)
}
void
WebGLContext::TexParameter_base(GLenum rawTexTarget, GLenum pname, GLint* maybeIntParam,
GLfloat* maybeFloatParam)
WebGLContext::TexParameter_base(GLenum rawTexTarget, GLenum pname,
const FloatOrInt& param)
{
MOZ_ASSERT(maybeIntParam || maybeFloatParam);
const char funcName[] = "texParameter";
const uint8_t funcDims = 0;
@ -310,7 +308,7 @@ WebGLContext::TexParameter_base(GLenum rawTexTarget, GLenum pname, GLint* maybeI
if (!ValidateTexTarget(this, funcName, funcDims, rawTexTarget, &texTarget, &tex))
return;
tex->TexParameter(texTarget, pname, maybeIntParam, maybeFloatParam);
tex->TexParameter(texTarget, pname, param);
}
//////////////////////////////////////////////////////////////////////////////////////////

View File

@ -55,8 +55,10 @@ WebGLSampler::WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto)
static bool
ValidateSamplerParameterParams(WebGLContext* webgl, const char* funcName, GLenum pname,
GLint paramInt)
const FloatOrInt& param)
{
const auto& paramInt = param.i;
switch (pname) {
case LOCAL_GL_TEXTURE_MIN_FILTER:
switch (paramInt) {
@ -141,46 +143,47 @@ ValidateSamplerParameterParams(WebGLContext* webgl, const char* funcName, GLenum
}
void
WebGLSampler::SamplerParameter(const char* funcName, GLenum pname, GLint paramInt)
WebGLSampler::SamplerParameter(const char* funcName, GLenum pname,
const FloatOrInt& param)
{
if (!ValidateSamplerParameterParams(mContext, funcName, pname, paramInt))
if (!ValidateSamplerParameterParams(mContext, funcName, pname, param))
return;
switch (pname) {
case LOCAL_GL_TEXTURE_MIN_FILTER:
mMinFilter = paramInt;
mMinFilter = param.i;
break;
case LOCAL_GL_TEXTURE_MAG_FILTER:
mMagFilter = paramInt;
mMagFilter = param.i;
break;
case LOCAL_GL_TEXTURE_WRAP_S:
mWrapS = paramInt;
mWrapS = param.i;
break;
case LOCAL_GL_TEXTURE_WRAP_T:
mWrapT = paramInt;
mWrapT = param.i;
break;
case LOCAL_GL_TEXTURE_WRAP_R:
mWrapR = paramInt;
mWrapR = param.i;
break;
case LOCAL_GL_TEXTURE_COMPARE_MODE:
mCompareMode = paramInt;
mCompareMode = param.i;
break;
case LOCAL_GL_TEXTURE_COMPARE_FUNC:
mCompareFunc = paramInt;
mCompareFunc = param.i;
break;
case LOCAL_GL_TEXTURE_MIN_LOD:
mMinLod = paramInt;
mMinLod = param.f;
break;
case LOCAL_GL_TEXTURE_MAX_LOD:
mMaxLod = paramInt;
mMaxLod = param.f;
break;
default:
@ -196,7 +199,11 @@ WebGLSampler::SamplerParameter(const char* funcName, GLenum pname, GLint paramIn
////
mContext->gl->MakeCurrent();
mContext->gl->fSamplerParameteri(mGLName, pname, paramInt);
if (param.isFloat) {
mContext->gl->fSamplerParameterf(mGLName, pname, param.f);
} else {
mContext->gl->fSamplerParameteri(mGLName, pname, param.i);
}
}
////

View File

@ -31,7 +31,7 @@ public:
virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) override;
void SamplerParameter(const char* funcName, GLenum pname, GLint paramInt);
void SamplerParameter(const char* funcName, GLenum pname, const FloatOrInt& param);
private:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGLSampler)
@ -42,8 +42,8 @@ private:
TexWrap mWrapS;
TexWrap mWrapT;
TexWrap mWrapR;
GLint mMinLod;
GLint mMaxLod;
GLfloat mMinLod;
GLfloat mMaxLod;
TexCompareMode mCompareMode;
TexCompareFunc mCompareFunc;

View File

@ -1005,14 +1005,8 @@ WebGLTexture::IsTexture() const
// See this discussion:
// https://www.khronos.org/webgl/public-mailing-list/archives/1008/msg00014.html
void
WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntParam,
GLfloat* maybeFloatParam)
WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, const FloatOrInt& param)
{
MOZ_ASSERT(maybeIntParam || maybeFloatParam);
GLint intParam = maybeIntParam ? *maybeIntParam : GLint(roundf(*maybeFloatParam));
GLfloat floatParam = maybeFloatParam ? *maybeFloatParam : GLfloat(*maybeIntParam);
bool isPNameValid = false;
switch (pname) {
// GLES 2.0.25 p76:
@ -1055,16 +1049,16 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
switch (pname) {
case LOCAL_GL_TEXTURE_BASE_LEVEL:
case LOCAL_GL_TEXTURE_MAX_LEVEL:
paramBadValue = (intParam < 0);
paramBadValue = (param.i < 0);
break;
case LOCAL_GL_TEXTURE_COMPARE_MODE:
paramBadValue = (intParam != LOCAL_GL_NONE &&
intParam != LOCAL_GL_COMPARE_REF_TO_TEXTURE);
paramBadValue = (param.i != LOCAL_GL_NONE &&
param.i != LOCAL_GL_COMPARE_REF_TO_TEXTURE);
break;
case LOCAL_GL_TEXTURE_COMPARE_FUNC:
switch (intParam) {
switch (param.i) {
case LOCAL_GL_LEQUAL:
case LOCAL_GL_GEQUAL:
case LOCAL_GL_LESS:
@ -1082,7 +1076,7 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
break;
case LOCAL_GL_TEXTURE_MIN_FILTER:
switch (intParam) {
switch (param.i) {
case LOCAL_GL_NEAREST:
case LOCAL_GL_LINEAR:
case LOCAL_GL_NEAREST_MIPMAP_NEAREST:
@ -1098,7 +1092,7 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
break;
case LOCAL_GL_TEXTURE_MAG_FILTER:
switch (intParam) {
switch (param.i) {
case LOCAL_GL_NEAREST:
case LOCAL_GL_LINEAR:
break;
@ -1112,7 +1106,7 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
case LOCAL_GL_TEXTURE_WRAP_S:
case LOCAL_GL_TEXTURE_WRAP_T:
case LOCAL_GL_TEXTURE_WRAP_R:
switch (intParam) {
switch (param.i) {
case LOCAL_GL_CLAMP_TO_EDGE:
case LOCAL_GL_MIRRORED_REPEAT:
case LOCAL_GL_REPEAT:
@ -1125,34 +1119,32 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
break;
case LOCAL_GL_TEXTURE_MAX_ANISOTROPY_EXT:
if (maybeFloatParam && floatParam < 1.0f)
paramBadValue = true;
else if (maybeIntParam && intParam < 1)
if (param.f < 1.0f)
paramBadValue = true;
break;
}
if (paramBadEnum) {
if (maybeIntParam) {
if (!param.isFloat) {
mContext->ErrorInvalidEnum("texParameteri: pname 0x%04x: Invalid param"
" 0x%04x.",
pname, intParam);
pname, param.i);
} else {
mContext->ErrorInvalidEnum("texParameterf: pname 0x%04x: Invalid param %g.",
pname, floatParam);
pname, param.f);
}
return;
}
if (paramBadValue) {
if (maybeIntParam) {
if (!param.isFloat) {
mContext->ErrorInvalidValue("texParameteri: pname 0x%04x: Invalid param %i"
" (0x%x).",
pname, intParam, intParam);
pname, param.i, param.i);
} else {
mContext->ErrorInvalidValue("texParameterf: pname 0x%04x: Invalid param %g.",
pname, floatParam);
pname, param.f);
}
return;
}
@ -1160,37 +1152,38 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
////////////////
// Store any needed values
FloatOrInt clamped = param;
switch (pname) {
case LOCAL_GL_TEXTURE_BASE_LEVEL:
mBaseMipmapLevel = intParam;
mBaseMipmapLevel = clamped.i;
ClampLevelBaseAndMax();
intParam = mBaseMipmapLevel;
clamped = FloatOrInt(GLint(mBaseMipmapLevel));
break;
case LOCAL_GL_TEXTURE_MAX_LEVEL:
mMaxMipmapLevel = intParam;
mMaxMipmapLevel = clamped.i;
ClampLevelBaseAndMax();
intParam = mMaxMipmapLevel;
clamped = FloatOrInt(GLint(mMaxMipmapLevel));
break;
case LOCAL_GL_TEXTURE_MIN_FILTER:
mMinFilter = intParam;
mMinFilter = clamped.i;
break;
case LOCAL_GL_TEXTURE_MAG_FILTER:
mMagFilter = intParam;
mMagFilter = clamped.i;
break;
case LOCAL_GL_TEXTURE_WRAP_S:
mWrapS = intParam;
mWrapS = clamped.i;
break;
case LOCAL_GL_TEXTURE_WRAP_T:
mWrapT = intParam;
mWrapT = clamped.i;
break;
case LOCAL_GL_TEXTURE_COMPARE_MODE:
mTexCompareMode = intParam;
mTexCompareMode = clamped.i;
break;
// We don't actually need to store the WRAP_R, since it doesn't change texture
@ -1211,10 +1204,10 @@ WebGLTexture::TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntPar
////////////////
mContext->MakeContextCurrent();
if (maybeIntParam)
mContext->gl->fTexParameteri(texTarget.get(), pname, intParam);
if (!clamped.isFloat)
mContext->gl->fTexParameteri(texTarget.get(), pname, clamped.i);
else
mContext->gl->fTexParameterf(texTarget.get(), pname, floatParam);
mContext->gl->fTexParameterf(texTarget.get(), pname, clamped.f);
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -25,6 +25,7 @@
namespace mozilla {
class ErrorResult;
class WebGLContext;
struct FloatOrInt;
struct TexImageSource;
namespace dom {
@ -226,8 +227,7 @@ public:
void GenerateMipmap(TexTarget texTarget);
JS::Value GetTexParameter(TexTarget texTarget, GLenum pname);
bool IsTexture() const;
void TexParameter(TexTarget texTarget, GLenum pname, GLint* maybeIntParam,
GLfloat* maybeFloatParam);
void TexParameter(TexTarget texTarget, GLenum pname, const FloatOrInt& param);
////////////////////////////////////
// WebGLTextureUpload.cpp