OSDN Git Service

Accept GL_TEXTURE_MAX_ANISOTROPY_EXT for samplers.
authorKrzysztof Kosiński <krzysio@google.com>
Fri, 18 May 2018 02:20:47 +0000 (19:20 -0700)
committerKrzysztof Kosiński <krzysio@google.com>
Fri, 18 May 2018 15:07:53 +0000 (15:07 +0000)
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/18908
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Krzysztof Kosiński <krzysio@google.com>
CONTRIBUTORS.txt
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Sampler.h

index 2f8dec2..81d1149 100644 (file)
 \r
 Google Inc.\r
  Nicolas Capens <capn@google.com>\r
- Alexis Hétu <sugoi@google.com>\r
+ Alexis Hétu <sugoi@google.com>\r
  Shannon Woods <shannonwoods@google.com>\r
  Corentin Wallez <cwallez@google.com>\r
  Greg Hartman <ghartman@google.com>\r
  Ping-Hao Wu <pinghao@google.com>\r
- Maxime Grégoire <mgregoire@google.com>\r
+ Maxime Grégoire <mgregoire@google.com>\r
  Veranika Liaukevich <veranika@google.com>\r
  John Bauman <jbauman@google.com>\r
  Keun Soo Yim <yim@google.com>\r
@@ -24,6 +24,7 @@ Google Inc.
  Philippe Hamel <hamelphi@google.com>\r
  Daniel Toyama <kenjitoyama@google.com>\r
  Meng-Lin Wu <marleymoo@google.com>\r
+ Krzysztof Kosiński <krzysio@google.com>\r
 \r
 TransGaming Inc.\r
  Nicolas Capens\r
@@ -31,4 +32,4 @@ TransGaming Inc.
  Jim MacArthur\r
  Daniel Koch\r
  Luther Johnson\r
- Rob Stepinski
\ No newline at end of file
+ Rob Stepinski\r
index 11541e7..7bd9fea 100644 (file)
@@ -1734,16 +1734,17 @@ void Context::samplerParameteri(GLuint sampler, GLenum pname, GLint param)
 
        switch(pname)
        {
-       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_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_R:       samplerObject->setWrapR(static_cast<GLenum>(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_COMPARE_MODE: samplerObject->setCompareMode(static_cast<GLenum>(param)); break;
-       case GL_TEXTURE_COMPARE_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(param)); break;
-       default:                      UNREACHABLE(pname); 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_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_R:             samplerObject->setWrapR(static_cast<GLenum>(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_COMPARE_MODE:       samplerObject->setCompareMode(static_cast<GLenum>(param));    break;
+       case GL_TEXTURE_COMPARE_FUNC:       samplerObject->setCompareFunc(static_cast<GLenum>(param));    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)
 
        switch(pname)
        {
-       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_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_R:       samplerObject->setWrapR(static_cast<GLenum>(roundf(param)));       break;
-       case GL_TEXTURE_MIN_LOD:      samplerObject->setMinLod(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_FUNC: samplerObject->setCompareFunc(static_cast<GLenum>(roundf(param))); break;
-       default:                      UNREACHABLE(pname); 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_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_R:             samplerObject->setWrapR(static_cast<GLenum>(roundf(param)));       break;
+       case GL_TEXTURE_MIN_LOD:            samplerObject->setMinLod(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_FUNC:       samplerObject->setCompareFunc(static_cast<GLenum>(roundf(param))); 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)
 
        switch(pname)
        {
-       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_WRAP_S:       return static_cast<GLint>(samplerObject->getWrapS());
-       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_MIN_LOD:      return static_cast<GLint>(roundf(samplerObject->getMinLod()));
-       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_FUNC: return static_cast<GLint>(samplerObject->getCompareFunc());
-       default:                      UNREACHABLE(pname); return 0;
+       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_WRAP_S:             return static_cast<GLint>(samplerObject->getWrapS());
+       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_MIN_LOD:            return static_cast<GLint>(roundf(samplerObject->getMinLod()));
+       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_FUNC:       return static_cast<GLint>(samplerObject->getCompareFunc());
+       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)
 
        switch(pname)
        {
-       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_WRAP_S:       return static_cast<GLfloat>(samplerObject->getWrapS());
-       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_MIN_LOD:      return samplerObject->getMinLod();
-       case GL_TEXTURE_MAX_LOD:      return samplerObject->getMaxLod();
-       case GL_TEXTURE_COMPARE_MODE: return static_cast<GLfloat>(samplerObject->getCompareMode());
-       case GL_TEXTURE_COMPARE_FUNC: return static_cast<GLfloat>(samplerObject->getCompareFunc());
-       default:                      UNREACHABLE(pname); return 0;
+       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_WRAP_S:             return static_cast<GLfloat>(samplerObject->getWrapS());
+       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_MIN_LOD:            return samplerObject->getMinLod();
+       case GL_TEXTURE_MAX_LOD:            return samplerObject->getMaxLod();
+       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_MAX_ANISOTROPY_EXT: return samplerObject->getMaxAnisotropy();
+       default:                            UNREACHABLE(pname); return 0;
        }
 }
 
@@ -3123,7 +3127,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
                        if(texture->isSamplerComplete())
                        {
                                GLenum wrapS, wrapT, wrapR, minFilter, magFilter, compFunc, compMode;
-                               GLfloat minLOD, maxLOD;
+                               GLfloat minLOD, maxLOD, maxAnisotropy;
 
                                Sampler *samplerObject = mState.sampler[textureUnit];
                                if(samplerObject)
@@ -3137,6 +3141,7 @@ void Context::applyTextures(sw::SamplerType samplerType)
                                        maxLOD = samplerObject->getMaxLod();
                                        compFunc = samplerObject->getCompareFunc();
                                        compMode = samplerObject->getCompareMode();
+                                       maxAnisotropy = samplerObject->getMaxAnisotropy();
                                }
                                else
                                {
@@ -3149,9 +3154,9 @@ void Context::applyTextures(sw::SamplerType samplerType)
                                        maxLOD = texture->getMaxLOD();
                                        compFunc = texture->getCompareFunc();
                                        compMode = texture->getCompareMode();
+                                       maxAnisotropy = texture->getMaxAnisotropy();
                                }
 
-                               GLfloat maxAnisotropy = texture->getMaxAnisotropy();
                                GLint baseLevel = texture->getBaseLevel();
                                GLint maxLevel = texture->getMaxLevel();
                                GLenum swizzleR = texture->getSwizzleR();
index 0dbf8c9..91185da 100644 (file)
@@ -41,6 +41,7 @@ public:
                mMaxLod = 1000.0f;
                mCompareMode = GL_NONE;
                mCompareFunc = GL_LEQUAL;
+               mMaxAnisotropy = 1.0f;
        }
 
        void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; }
@@ -52,6 +53,7 @@ public:
        void setMaxLod(GLfloat maxLod) { mMaxLod = maxLod; }
        void setCompareMode(GLenum compareMode) { mCompareMode = compareMode; }
        void setCompareFunc(GLenum compareFunc) { mCompareFunc = compareFunc; }
+       void setMaxAnisotropy(GLfloat maxAnisotropy) { mMaxAnisotropy = maxAnisotropy; }
 
        GLenum getMinFilter() const { return mMinFilter; }
        GLenum getMagFilter() const { return mMagFilter; }
@@ -62,6 +64,7 @@ public:
        GLfloat getMaxLod() const { return mMaxLod; }
        GLenum getCompareMode() const { return mCompareMode; }
        GLenum getCompareFunc() const { return mCompareFunc; }
+       GLfloat getMaxAnisotropy() const { return mMaxAnisotropy; }
 
 private:
        GLenum mMinFilter;
@@ -75,6 +78,7 @@ private:
        GLfloat mMaxLod;
        GLenum mCompareMode;
        GLenum mCompareFunc;
+       GLfloat mMaxAnisotropy;
 };
 
 }