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/18908
Reviewed-by: Alexis Hétu <sugoi@google.com>
Tested-by: Krzysztof Kosiński <krzysio@google.com>
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index 2f8dec2..81d1149 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -11,12 +11,12 @@
 

 Google Inc.

  Nicolas Capens <capn@google.com>

- Alexis Hétu <sugoi@google.com>

+ Alexis Hétu <sugoi@google.com>

  Shannon Woods <shannonwoods@google.com>

  Corentin Wallez <cwallez@google.com>

  Greg Hartman <ghartman@google.com>

  Ping-Hao Wu <pinghao@google.com>

- Maxime Grégoire <mgregoire@google.com>

+ Maxime Grégoire <mgregoire@google.com>

  Veranika Liaukevich <veranika@google.com>

  John Bauman <jbauman@google.com>

  Keun Soo Yim <yim@google.com>

@@ -24,6 +24,7 @@
  Philippe Hamel <hamelphi@google.com>

  Daniel Toyama <kenjitoyama@google.com>

  Meng-Lin Wu <marleymoo@google.com>

+ Krzysztof Kosiński <krzysio@google.com>

 

 TransGaming Inc.

  Nicolas Capens

@@ -31,4 +32,4 @@
  Jim MacArthur

  Daniel Koch

  Luther Johnson

- Rob Stepinski
\ No newline at end of file
+ Rob Stepinski

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 11541e7..7bd9fea 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1734,16 +1734,17 @@
 
 	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 @@
 
 	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 @@
 
 	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 @@
 
 	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 @@
 			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 @@
 					maxLOD = samplerObject->getMaxLod();
 					compFunc = samplerObject->getCompareFunc();
 					compMode = samplerObject->getCompareMode();
+					maxAnisotropy = samplerObject->getMaxAnisotropy();
 				}
 				else
 				{
@@ -3149,9 +3154,9 @@
 					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();
diff --git a/src/OpenGL/libGLESv2/Sampler.h b/src/OpenGL/libGLESv2/Sampler.h
index 0dbf8c9..91185da 100644
--- a/src/OpenGL/libGLESv2/Sampler.h
+++ b/src/OpenGL/libGLESv2/Sampler.h
@@ -41,6 +41,7 @@
 		mMaxLod = 1000.0f;
 		mCompareMode = GL_NONE;
 		mCompareFunc = GL_LEQUAL;
+		mMaxAnisotropy = 1.0f;
 	}
 
 	void setMinFilter(GLenum minFilter) { mMinFilter = minFilter; }
@@ -52,6 +53,7 @@
 	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 @@
 	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 @@
 	GLfloat mMaxLod;
 	GLenum mCompareMode;
 	GLenum mCompareFunc;
+	GLfloat mMaxAnisotropy;
 };
 
 }