Sending magnification filter info to the sampler

Currently, the magnification filter information is ignored
by SwiftShader. In order to fix it, the 1st step is simply
to make the sampler aware of this information. After this,
a subsequent cl using the duvdxy computed in computeLod
will choose which filter to use (if they are different).

Change-Id: Idc8636c3d981c944815094f23e443725bed4cf27
Reviewed-on: https://swiftshader-review.googlesource.com/4382
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index 2f382e5..4d65d64 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -2096,21 +2096,15 @@
             {

                 GLenum wrapS = texture->getWrapS();

                 GLenum wrapT = texture->getWrapT();

-                GLenum texFilter = texture->getMinFilter();

+                GLenum minFilter = texture->getMinFilter();

                 GLenum magFilter = texture->getMagFilter();

 				GLfloat maxAnisotropy = texture->getMaxAnisotropy();

 

 				device->setAddressingModeU(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapS));

                 device->setAddressingModeV(samplerType, samplerIndex, es2sw::ConvertTextureWrap(wrapT));

 

-				sw::FilterType minFilter;

-				sw::MipmapType mipFilter;

-                es2sw::ConvertMinFilter(texFilter, &minFilter, &mipFilter, maxAnisotropy);

-			//	ASSERT(minFilter == es2sw::ConvertMagFilter(magFilter));

-

-				device->setTextureFilter(samplerType, samplerIndex, minFilter);

-			//	device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertMagFilter(magFilter));

-				device->setMipmapFilter(samplerType, samplerIndex, mipFilter);

+				device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy));

+				device->setMipmapFilter(samplerType, samplerIndex, es2sw::ConvertMipMapFilter(minFilter));

 				device->setMaxAnisotropy(samplerType, samplerIndex, maxAnisotropy);

 

 				applyTexture(samplerType, samplerIndex, texture);

diff --git a/src/OpenGL/libGL/utilities.cpp b/src/OpenGL/libGL/utilities.cpp
index 7483fad..e80b630 100644
--- a/src/OpenGL/libGL/utilities.cpp
+++ b/src/OpenGL/libGL/utilities.cpp
@@ -591,55 +591,56 @@
 			   (alpha ? 0x00000008 : 0);

 	}

 

-	sw::FilterType ConvertMagFilter(GLenum magFilter)

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter)

 	{

+		switch(minFilter)

+		{

+		case GL_NEAREST:

+		case GL_LINEAR:

+			return sw::MIPMAP_NONE;

+			break;

+		case GL_NEAREST_MIPMAP_NEAREST:

+		case GL_LINEAR_MIPMAP_NEAREST:

+			return sw::MIPMAP_POINT;

+			break;

+		case GL_NEAREST_MIPMAP_LINEAR:

+		case GL_LINEAR_MIPMAP_LINEAR:

+			return sw::MIPMAP_LINEAR;

+			break;

+		default:

+			UNREACHABLE(minFilter);

+			return sw::MIPMAP_NONE;

+		}

+	}

+

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)

+	{

+		if(maxAnisotropy > 1.0f)

+		{

+			return sw::FILTER_ANISOTROPIC;

+		}

+

+		sw::FilterType magFilterType = sw::FILTER_POINT;

 		switch(magFilter)

 		{

-		case GL_NEAREST: return sw::FILTER_POINT;

-		case GL_LINEAR:  return sw::FILTER_LINEAR;

+		case GL_NEAREST: magFilterType = sw::FILTER_POINT;  break;

+		case GL_LINEAR:  magFilterType = sw::FILTER_LINEAR; break;

 		default: UNREACHABLE(magFilter);

 		}

 

-		return sw::FILTER_POINT;

-	}

-

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy)

-	{

-		switch(texFilter)

+		switch(minFilter)

 		{

 		case GL_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

-		case GL_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

 		case GL_NEAREST_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

-		case GL_LINEAR_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

 		case GL_NEAREST_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

+		case GL_LINEAR:

+		case GL_LINEAR_MIPMAP_NEAREST:

 		case GL_LINEAR_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR;

 		default:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE(texFilter);

-		}

-

-		if(maxAnisotropy > 1.0f)

-		{

-			*minFilter = sw::FILTER_ANISOTROPIC;

+			UNREACHABLE(minFilter);

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

 		}

 	}

 

diff --git a/src/OpenGL/libGL/utilities.h b/src/OpenGL/libGL/utilities.h
index 66b30a8..28f9989 100644
--- a/src/OpenGL/libGL/utilities.h
+++ b/src/OpenGL/libGL/utilities.h
@@ -66,8 +66,8 @@
 	sw::AddressingMode ConvertTextureWrap(GLenum wrap);

 	sw::CullMode ConvertCullMode(GLenum cullFace, GLenum frontFace);

 	unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);

-	sw::FilterType ConvertMagFilter(GLenum magFilter);

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter);

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);

 	bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount,  gl::PrimitiveType &swPrimitiveType, int &primitiveCount);

 	sw::Format ConvertRenderbufferFormat(GLenum format);

 }

diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 7a76adc..d2ea101 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -2063,21 +2063,15 @@
 

             GLenum wrapS = texture->getWrapS();

             GLenum wrapT = texture->getWrapT();

-            GLenum texFilter = texture->getMinFilter();

+            GLenum minFilter = texture->getMinFilter();

             GLenum magFilter = texture->getMagFilter();

 			GLfloat maxAnisotropy = texture->getMaxAnisotropy();

 

 			device->setAddressingModeU(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureWrap(wrapS));

             device->setAddressingModeV(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureWrap(wrapT));

 

-			sw::FilterType minFilter;

-			sw::MipmapType mipFilter;

-            es2sw::ConvertMinFilter(texFilter, &minFilter, &mipFilter, maxAnisotropy);

-		//	ASSERT(minFilter == es2sw::ConvertMagFilter(magFilter));

-

-			device->setTextureFilter(sw::SAMPLER_PIXEL, unit, minFilter);

-		//	device->setTextureFilter(sw::SAMPLER_PIXEL, unit, es2sw::ConvertMagFilter(magFilter));

-			device->setMipmapFilter(sw::SAMPLER_PIXEL, unit, mipFilter);

+			device->setTextureFilter(sw::SAMPLER_PIXEL, unit, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy));

+			device->setMipmapFilter(sw::SAMPLER_PIXEL, unit, es2sw::ConvertMipMapFilter(minFilter));

 			device->setMaxAnisotropy(sw::SAMPLER_PIXEL, unit, maxAnisotropy);

 

 			applyTexture(unit, texture);

diff --git a/src/OpenGL/libGLES_CM/utilities.cpp b/src/OpenGL/libGLES_CM/utilities.cpp
index 729c9ef..07ac08c 100644
--- a/src/OpenGL/libGLES_CM/utilities.cpp
+++ b/src/OpenGL/libGLES_CM/utilities.cpp
@@ -381,55 +381,56 @@
 			   (alpha ? 0x00000008 : 0);

 	}

 

-	sw::FilterType ConvertMagFilter(GLenum magFilter)

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter)

 	{

+		switch(minFilter)

+		{

+		case GL_NEAREST:

+		case GL_LINEAR:

+			return sw::MIPMAP_NONE;

+			break;

+		case GL_NEAREST_MIPMAP_NEAREST:

+		case GL_LINEAR_MIPMAP_NEAREST:

+			return sw::MIPMAP_POINT;

+			break;

+		case GL_NEAREST_MIPMAP_LINEAR:

+		case GL_LINEAR_MIPMAP_LINEAR:

+			return sw::MIPMAP_LINEAR;

+			break;

+		default:

+			UNREACHABLE(minFilter);

+			return sw::MIPMAP_NONE;

+		}

+	}

+

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)

+	{

+		if(maxAnisotropy > 1.0f)

+		{

+			return sw::FILTER_ANISOTROPIC;

+		}

+

+		sw::FilterType magFilterType = sw::FILTER_POINT;

 		switch(magFilter)

 		{

-		case GL_NEAREST: return sw::FILTER_POINT;

-		case GL_LINEAR:  return sw::FILTER_LINEAR;

+		case GL_NEAREST: magFilterType = sw::FILTER_POINT;  break;

+		case GL_LINEAR:  magFilterType = sw::FILTER_LINEAR; break;

 		default: UNREACHABLE(magFilter);

 		}

 

-		return sw::FILTER_POINT;

-	}

-

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy)

-	{

-		switch(texFilter)

+		switch(minFilter)

 		{

 		case GL_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

-		case GL_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

 		case GL_NEAREST_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

-		case GL_LINEAR_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

 		case GL_NEAREST_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

+		case GL_LINEAR:

+		case GL_LINEAR_MIPMAP_NEAREST:

 		case GL_LINEAR_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR;

 		default:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE(texFilter);

-		}

-

-		if(maxAnisotropy > 1.0f)

-		{

-			*minFilter = sw::FILTER_ANISOTROPIC;

+			UNREACHABLE(minFilter);

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

 		}

 	}

 

diff --git a/src/OpenGL/libGLES_CM/utilities.h b/src/OpenGL/libGLES_CM/utilities.h
index a25ede3..665f23c 100644
--- a/src/OpenGL/libGLES_CM/utilities.h
+++ b/src/OpenGL/libGLES_CM/utilities.h
@@ -57,9 +57,9 @@
 	sw::AddressingMode ConvertTextureWrap(GLenum wrap);

 	sw::CullMode ConvertCullMode(GLenum cullFace, GLenum frontFace);

 	unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);

-	sw::FilterType ConvertMagFilter(GLenum magFilter);

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);

-	bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount,  es1::PrimitiveType &swPrimitiveType, int &primitiveCount);

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter);

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);

+	bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount, es1::PrimitiveType &swPrimitiveType, int &primitiveCount);

 	sw::Format ConvertRenderbufferFormat(GLenum format);

 	sw::TextureStage::StageOperation ConvertCombineOperation(GLenum operation);

 	sw::TextureStage::SourceArgument ConvertSourceArgument(GLenum argument);

diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index a87da2d..3795da1 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -3078,7 +3078,7 @@
 

 			if(texture->isSamplerComplete())

             {

-				GLenum wrapS, wrapT, wrapR, texFilter, magFilter;

+				GLenum wrapS, wrapT, wrapR, minFilter, magFilter;

 

 				Sampler *samplerObject = mState.sampler[textureUnit];

 				if(samplerObject)

@@ -3086,7 +3086,7 @@
 					wrapS = samplerObject->getWrapS();

 					wrapT = samplerObject->getWrapT();

 					wrapR = samplerObject->getWrapR();

-					texFilter = samplerObject->getMinFilter();

+					minFilter = samplerObject->getMinFilter();

 					magFilter = samplerObject->getMagFilter();

 				}

 				else

@@ -3094,7 +3094,7 @@
 					wrapS = texture->getWrapS();

 					wrapT = texture->getWrapT();

 					wrapR = texture->getWrapR();

-					texFilter = texture->getMinFilter();

+					minFilter = texture->getMinFilter();

 					magFilter = texture->getMagFilter();

 				}

 				GLfloat maxAnisotropy = texture->getMaxAnisotropy();

@@ -3112,15 +3112,9 @@
 				device->setSwizzleB(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleB));

 				device->setSwizzleA(samplerType, samplerIndex, es2sw::ConvertSwizzleType(swizzleA));

 

-				sw::FilterType minFilter;

-				sw::MipmapType mipFilter;

-                es2sw::ConvertMinFilter(texFilter, &minFilter, &mipFilter, maxAnisotropy);

-			//	ASSERT(minFilter == es2sw::ConvertMagFilter(magFilter));

-

-				device->setTextureFilter(samplerType, samplerIndex, minFilter);

-			//	device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertMagFilter(magFilter));

-				device->setMipmapFilter(samplerType, samplerIndex, mipFilter);

-				device->setMaxAnisotropy(samplerType, samplerIndex, maxAnisotropy);                

+				device->setTextureFilter(samplerType, samplerIndex, es2sw::ConvertTextureFilter(minFilter, magFilter, maxAnisotropy));

+				device->setMipmapFilter(samplerType, samplerIndex, es2sw::ConvertMipMapFilter(minFilter));

+				device->setMaxAnisotropy(samplerType, samplerIndex, maxAnisotropy);

 

 				applyTexture(samplerType, samplerIndex, texture);

             }

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 0b83802..68a0950 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -1181,55 +1181,56 @@
 			   (alpha ? 0x00000008 : 0);

 	}

 

-	sw::FilterType ConvertMagFilter(GLenum magFilter)

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter)

 	{

+		switch(minFilter)

+		{

+		case GL_NEAREST:

+		case GL_LINEAR:

+			return sw::MIPMAP_NONE;

+			break;

+		case GL_NEAREST_MIPMAP_NEAREST:

+		case GL_LINEAR_MIPMAP_NEAREST:

+			return sw::MIPMAP_POINT;

+			break;

+		case GL_NEAREST_MIPMAP_LINEAR:

+		case GL_LINEAR_MIPMAP_LINEAR:

+			return sw::MIPMAP_LINEAR;

+			break;

+		default:

+			UNREACHABLE(minFilter);

+			return sw::MIPMAP_NONE;

+		}

+	}

+

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy)

+	{

+		if(maxAnisotropy > 1.0f)

+		{

+			return sw::FILTER_ANISOTROPIC;

+		}

+

+		sw::FilterType magFilterType = sw::FILTER_POINT;

 		switch(magFilter)

 		{

-		case GL_NEAREST: return sw::FILTER_POINT;

-		case GL_LINEAR:  return sw::FILTER_LINEAR;

+		case GL_NEAREST: magFilterType = sw::FILTER_POINT;  break;

+		case GL_LINEAR:  magFilterType = sw::FILTER_LINEAR; break;

 		default: UNREACHABLE(magFilter);

 		}

 

-		return sw::FILTER_POINT;

-	}

-

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy)

-	{

-		switch(texFilter)

+		switch(minFilter)

 		{

 		case GL_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

-		case GL_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_NONE;

-			break;

 		case GL_NEAREST_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

-		case GL_LINEAR_MIPMAP_NEAREST:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_POINT;

-			break;

 		case GL_NEAREST_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

+		case GL_LINEAR:

+		case GL_LINEAR_MIPMAP_NEAREST:

 		case GL_LINEAR_MIPMAP_LINEAR:

-			*minFilter = sw::FILTER_LINEAR;

-			*mipFilter = sw::MIPMAP_LINEAR;

-			break;

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_MIN_LINEAR_MAG_POINT : sw::FILTER_LINEAR;

 		default:

-			*minFilter = sw::FILTER_POINT;

-			*mipFilter = sw::MIPMAP_NONE;

-			UNREACHABLE(texFilter);

-		}

-

-		if(maxAnisotropy > 1.0f)

-		{

-			*minFilter = sw::FILTER_ANISOTROPIC;

+			UNREACHABLE(minFilter);

+			return (magFilterType == sw::FILTER_POINT) ? sw::FILTER_POINT : sw::FILTER_MIN_POINT_MAG_LINEAR;

 		}

 	}

 

diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index db4930d..01b75a6 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -75,8 +75,8 @@
 	sw::SwizzleType ConvertSwizzleType(GLenum swizzleType);

 	sw::CullMode ConvertCullMode(GLenum cullFace, GLenum frontFace);

 	unsigned int ConvertColorMask(bool red, bool green, bool blue, bool alpha);

-	sw::FilterType ConvertMagFilter(GLenum magFilter);

-	void ConvertMinFilter(GLenum texFilter, sw::FilterType *minFilter, sw::MipmapType *mipFilter, float maxAnisotropy);

+	sw::MipmapType ConvertMipMapFilter(GLenum minFilter);

+	sw::FilterType ConvertTextureFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy);

 	bool ConvertPrimitiveType(GLenum primitiveType, GLsizei elementCount,  es2::PrimitiveType &swPrimitiveType, int &primitiveCount);

 	sw::Format ConvertRenderbufferFormat(GLenum format);

 }

diff --git a/src/Renderer/Sampler.hpp b/src/Renderer/Sampler.hpp
index a41bb29..7a888ca 100644
--- a/src/Renderer/Sampler.hpp
+++ b/src/Renderer/Sampler.hpp
@@ -87,6 +87,8 @@
 	{
 		FILTER_POINT,
 		FILTER_GATHER,
+		FILTER_MIN_POINT_MAG_LINEAR,
+		FILTER_MIN_LINEAR_MAG_POINT,
 		FILTER_LINEAR,
 		FILTER_ANISOTROPIC,
 
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp
index 6fb8fda..f05d83c 100644
--- a/src/Shader/SamplerCore.cpp
+++ b/src/Shader/SamplerCore.cpp
@@ -770,7 +770,7 @@
 		address(uuuu, u, state.addressingModeU);
 		address(vvvv, v, state.addressingModeV);
 
-		if(state.textureFilter == FILTER_POINT)
+		if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
 		{
 			sampleTexel(c, uuuu, vvvv, vvvv, mipmap, buffer);
 		}
@@ -979,7 +979,7 @@
 		address(vvvv, v_, state.addressingModeV);
 		addressW(wwww, w_, mipmap);
 
-		if(state.textureFilter <= FILTER_POINT)
+		if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
 		{
 			sampleTexel(c_, uuuu, vvvv, wwww, mipmap, buffer);
 		}
@@ -1255,7 +1255,7 @@
 		address(uuuu, u, state.addressingModeU);
 		address(vvvv, v, state.addressingModeV);
 
-		if(state.textureFilter == FILTER_POINT)
+		if(state.textureFilter == FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
 		{
 			sampleTexel(c, uuuu, vvvv, vvvv, z, mipmap, buffer);
 		}
@@ -1325,7 +1325,7 @@
 		address(vvvv, v, state.addressingModeV);
 		addressW(wwww, w, mipmap);
 
-		if(state.textureFilter <= FILTER_POINT)
+		if(state.textureFilter <= FILTER_POINT || state.textureFilter == FILTER_MIN_POINT_MAG_LINEAR)
 		{
 			sampleTexel(c, uuuu, vvvv, wwww, w, mipmap, buffer);
 		}