mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 12:50:09 +00:00
Bug 1325476 - Use helper for Parameter[fi] funcs instead of maybeFloat/IntParam. - r=daoshengmu
MozReview-Commit-ID: 3jGFXfDNkPt
This commit is contained in:
parent
02fcc3f257
commit
ac2df6af8a
@ -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
|
||||
|
@ -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, ¶m);
|
||||
TexParameter_base(texTarget, pname, FloatOrInt(param));
|
||||
}
|
||||
|
||||
void TexParameteri(GLenum texTarget, GLenum pname, GLint param) {
|
||||
TexParameter_base(texTarget, pname, ¶m, 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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
////
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user