Commit cbb80f5f by Krzysztof Kosiński

Accept GL_TEXTURE_MAX_ANISOTROPY_EXT for samplers.

This usage is not explicitly specified in EXT_texture_filter_anisotropic, but in practice all notable ES 3.0 implementations treat maximum anisotropy as sampler state. Furthermore, it's already accepted as a valid sampler parameter by ValidateSamplerObjectParameter in Context.cpp. This avoids a crash when calling glSamplerParameteri(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f); Bug: b/79951966 Change-Id: I4013f621781fc74a0fbfbf14ab326871fbb87b7c Reviewed-on: https://swiftshader-review.googlesource.com/18908Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Tested-by: 's avatarKrzysztof Kosiński <krzysio@google.com>
parent 607771b4
...@@ -11,12 +11,12 @@ ...@@ -11,12 +11,12 @@
Google Inc. Google Inc.
Nicolas Capens <capn@google.com> Nicolas Capens <capn@google.com>
Alexis Htu <sugoi@google.com> Alexis Hétu <sugoi@google.com>
Shannon Woods <shannonwoods@google.com> Shannon Woods <shannonwoods@google.com>
Corentin Wallez <cwallez@google.com> Corentin Wallez <cwallez@google.com>
Greg Hartman <ghartman@google.com> Greg Hartman <ghartman@google.com>
Ping-Hao Wu <pinghao@google.com> Ping-Hao Wu <pinghao@google.com>
Maxime Grgoire <mgregoire@google.com> Maxime Grégoire <mgregoire@google.com>
Veranika Liaukevich <veranika@google.com> Veranika Liaukevich <veranika@google.com>
John Bauman <jbauman@google.com> John Bauman <jbauman@google.com>
Keun Soo Yim <yim@google.com> Keun Soo Yim <yim@google.com>
...@@ -24,6 +24,7 @@ Google Inc. ...@@ -24,6 +24,7 @@ Google Inc.
Philippe Hamel <hamelphi@google.com> Philippe Hamel <hamelphi@google.com>
Daniel Toyama <kenjitoyama@google.com> Daniel Toyama <kenjitoyama@google.com>
Meng-Lin Wu <marleymoo@google.com> Meng-Lin Wu <marleymoo@google.com>
Krzysztof Kosiński <krzysio@google.com>
TransGaming Inc. TransGaming Inc.
Nicolas Capens Nicolas Capens
...@@ -31,4 +32,4 @@ TransGaming Inc. ...@@ -31,4 +32,4 @@ TransGaming Inc.
Jim MacArthur Jim MacArthur
Daniel Koch Daniel Koch
Luther Johnson Luther Johnson
Rob Stepinski Rob Stepinski
\ No newline at end of file
...@@ -1734,16 +1734,17 @@ void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param) ...@@ -1734,16 +1734,17 @@ void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
switch(pname) switch(pname)
{ {
case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break; case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(param)); break;
case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break; case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(param)); break;
case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break; case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(param)); break;
case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break; case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(param)); break;
case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break; case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(param)); break;
case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break; case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(static_cast<GLfloat>(param)); break;
case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break; case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(static_cast<GLfloat>(param)); break;
case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break; case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break; case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
default: UNREACHABLE(pname); break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(static_cast<GLfloat>(param)); break;
default: UNREACHABLE(pname); break;
} }
} }
...@@ -1756,16 +1757,17 @@ void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param) ...@@ -1756,16 +1757,17 @@ void Context::samplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
switch(pname) switch(pname)
{ {
case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_MIN_FILTER: samplerObject->setMinFilter(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_MAG_FILTER: samplerObject->setMagFilter(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_WRAP_S: samplerObject->setWrapS(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_WRAP_T: samplerObject->setWrapT(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_WRAP_R: samplerObject->setWrapR(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break; case GL_TEXTURE_MIN_LOD: samplerObject->setMinLod(param); break;
case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break; case GL_TEXTURE_MAX_LOD: samplerObject->setMaxLod(param); break;
case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(roundf(param))); break;
case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(roundf(param))); break; case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(roundf(param))); break;
default: UNREACHABLE(pname); break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: samplerObject->setMaxAnisotropy(param); break;
default: UNREACHABLE(pname); break;
} }
} }
...@@ -1778,16 +1780,17 @@ GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname) ...@@ -1778,16 +1780,17 @@ GLint Context::getSamplerParameteri(GLuint sampler, GLenum pname)
switch(pname) switch(pname)
{ {
case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter()); case GL_TEXTURE_MIN_FILTER: return static_cast<GLint>(samplerObject->getMinFilter());
case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter()); case GL_TEXTURE_MAG_FILTER: return static_cast<GLint>(samplerObject->getMagFilter());
case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS()); case GL_TEXTURE_WRAP_S: return static_cast<GLint>(samplerObject->getWrapS());
case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT()); case GL_TEXTURE_WRAP_T: return static_cast<GLint>(samplerObject->getWrapT());
case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR()); case GL_TEXTURE_WRAP_R: return static_cast<GLint>(samplerObject->getWrapR());
case GL_TEXTURE_MIN_LOD: return static_cast<GLint>(roundf(samplerObject->getMinLod())); case GL_TEXTURE_MIN_LOD: return static_cast<GLint>(roundf(samplerObject->getMinLod()));
case GL_TEXTURE_MAX_LOD: return static_cast<GLint>(roundf(samplerObject->getMaxLod())); case GL_TEXTURE_MAX_LOD: return static_cast<GLint>(roundf(samplerObject->getMaxLod()));
case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode()); case GL_TEXTURE_COMPARE_MODE: return static_cast<GLint>(samplerObject->getCompareMode());
case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc()); case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
default: UNREACHABLE(pname); return 0; case GL_TEXTURE_MAX_ANISOTROPY_EXT: return static_cast<GLint>(samplerObject->getMaxAnisotropy());
default: UNREACHABLE(pname); return 0;
} }
} }
...@@ -1800,16 +1803,17 @@ GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname) ...@@ -1800,16 +1803,17 @@ GLfloat Context::getSamplerParameterf(GLuint sampler, GLenum pname)
switch(pname) switch(pname)
{ {
case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter()); case GL_TEXTURE_MIN_FILTER: return static_cast<GLfloat>(samplerObject->getMinFilter());
case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter()); case GL_TEXTURE_MAG_FILTER: return static_cast<GLfloat>(samplerObject->getMagFilter());
case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS()); case GL_TEXTURE_WRAP_S: return static_cast<GLfloat>(samplerObject->getWrapS());
case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT()); case GL_TEXTURE_WRAP_T: return static_cast<GLfloat>(samplerObject->getWrapT());
case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR()); case GL_TEXTURE_WRAP_R: return static_cast<GLfloat>(samplerObject->getWrapR());
case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod(); case GL_TEXTURE_MIN_LOD: return samplerObject->getMinLod();
case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod(); case GL_TEXTURE_MAX_LOD: return samplerObject->getMaxLod();
case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode()); case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc()); case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
default: UNREACHABLE(pname); return 0; case GL_TEXTURE_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
default: UNREACHABLE(pname); return 0;
} }
} }
...@@ -3123,7 +3127,7 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -3123,7 +3127,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
if(texture->isSamplerComplete()) if(texture->isSamplerComplete())
{ {
GLenum wrapS, wrapT, wrapR, minFilter, magFilter, compFunc, compMode; GLenum wrapS, wrapT, wrapR, minFilter, magFilter, compFunc, compMode;
GLfloat minLOD, maxLOD; GLfloat minLOD, maxLOD, maxAnisotropy;
Sampler *samplerObject = mState.sampler[textureUnit]; Sampler *samplerObject = mState.sampler[textureUnit];
if(samplerObject) if(samplerObject)
...@@ -3137,6 +3141,7 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -3137,6 +3141,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
maxLOD = samplerObject->getMaxLod(); maxLOD = samplerObject->getMaxLod();
compFunc = samplerObject->getCompareFunc(); compFunc = samplerObject->getCompareFunc();
compMode = samplerObject->getCompareMode(); compMode = samplerObject->getCompareMode();
maxAnisotropy = samplerObject->getMaxAnisotropy();
} }
else else
{ {
...@@ -3149,9 +3154,9 @@ void Context::applyTextures(sw::SamplerType samplerType) ...@@ -3149,9 +3154,9 @@ void Context::applyTextures(sw::SamplerType samplerType)
maxLOD = texture->getMaxLOD(); maxLOD = texture->getMaxLOD();
compFunc = texture->getCompareFunc(); compFunc = texture->getCompareFunc();
compMode = texture->getCompareMode(); compMode = texture->getCompareMode();
maxAnisotropy = texture->getMaxAnisotropy();
} }
GLfloat maxAnisotropy = texture->getMaxAnisotropy();
GLint baseLevel = texture->getBaseLevel(); GLint baseLevel = texture->getBaseLevel();
GLint maxLevel = texture->getMaxLevel(); GLint maxLevel = texture->getMaxLevel();
GLenum swizzleR = texture->getSwizzleR(); GLenum swizzleR = texture->getSwizzleR();
......
...@@ -41,6 +41,7 @@ public: ...@@ -41,6 +41,7 @@ public:
mMaxLod = 1000.0f; mMaxLod = 1000.0f;
mCompareMode = GL_NONE; mCompareMode = GL_NONE;
mCompareFunc = GL_LEQUAL; mCompareFunc = GL_LEQUAL;
mMaxAnisotropy = 1.0f;
} }
void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; } void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; }
...@@ -52,6 +53,7 @@ public: ...@@ -52,6 +53,7 @@ public:
void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; } void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; }
void setCompareMode(GLenum compareMode) { mCompareMode = compareMode; } void setCompareMode(GLenum compareMode) { mCompareMode = compareMode; }
void setCompareFunc(GLenum compareFunc) { mCompareFunc = compareFunc; } void setCompareFunc(GLenum compareFunc) { mCompareFunc = compareFunc; }
void setMaxAnisotropy(GLfloat maxAnisotropy) { mMaxAnisotropy = maxAnisotropy; }
GLenum getMinFilter() const { return mMinFilter; } GLenum getMinFilter() const { return mMinFilter; }
GLenum getMagFilter() const { return mMagFilter; } GLenum getMagFilter() const { return mMagFilter; }
...@@ -62,6 +64,7 @@ public: ...@@ -62,6 +64,7 @@ public:
GLfloat getMaxLod() const { return mMaxLod; } GLfloat getMaxLod() const { return mMaxLod; }
GLenum getCompareMode() const { return mCompareMode; } GLenum getCompareMode() const { return mCompareMode; }
GLenum getCompareFunc() const { return mCompareFunc; } GLenum getCompareFunc() const { return mCompareFunc; }
GLfloat getMaxAnisotropy() const { return mMaxAnisotropy; }
private: private:
GLenum mMinFilter; GLenum mMinFilter;
...@@ -75,6 +78,7 @@ private: ...@@ -75,6 +78,7 @@ private:
GLfloat mMaxLod; GLfloat mMaxLod;
GLenum mCompareMode; GLenum mCompareMode;
GLenum mCompareFunc; GLenum mCompareFunc;
GLfloat mMaxAnisotropy;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment