| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //    http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 |  | 
 | #ifndef sw_Sampler_hpp | 
 | #define sw_Sampler_hpp | 
 |  | 
 | #include "Main/Config.hpp" | 
 | #include "Renderer/Surface.hpp" | 
 | #include "Common/Types.hpp" | 
 |  | 
 | namespace sw | 
 | { | 
 | 	struct Mipmap | 
 | 	{ | 
 | 		const void *buffer[6]; | 
 |  | 
 | 		float4 fWidth; | 
 | 		float4 fHeight; | 
 | 		float4 fDepth; | 
 |  | 
 | 		short uHalf[4]; | 
 | 		short vHalf[4]; | 
 | 		short wHalf[4]; | 
 | 		short width[4]; | 
 | 		short height[4]; | 
 | 		short depth[4]; | 
 | 		short onePitchP[4]; | 
 | 		int4 pitchP; | 
 | 		int4 sliceP; | 
 | 	}; | 
 |  | 
 | 	struct Texture | 
 | 	{ | 
 | 		Mipmap mipmap[MIPMAP_LEVELS]; | 
 |  | 
 | 		float LOD; | 
 | 		float4 widthHeightLOD; | 
 | 		float4 widthLOD; | 
 | 		float4 heightLOD; | 
 | 		float4 depthLOD; | 
 |  | 
 | 		word4 borderColor4[4]; | 
 | 		float4 borderColorF[4]; | 
 | 		float maxAnisotropy; | 
 | 		int baseLevel; | 
 | 		int maxLevel; | 
 | 		float minLod; | 
 | 		float maxLod; | 
 | 	}; | 
 |  | 
 | 	enum SamplerType | 
 | 	{ | 
 | 		SAMPLER_PIXEL, | 
 | 		SAMPLER_VERTEX | 
 | 	}; | 
 |  | 
 | 	enum TextureType ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		TEXTURE_NULL, | 
 | 		TEXTURE_2D, | 
 | 		TEXTURE_RECTANGLE, | 
 | 		TEXTURE_CUBE, | 
 | 		TEXTURE_3D, | 
 | 		TEXTURE_2D_ARRAY, | 
 |  | 
 | 		TEXTURE_LAST = TEXTURE_2D_ARRAY | 
 | 	}; | 
 |  | 
 | 	enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		FILTER_POINT, | 
 | 		FILTER_GATHER, | 
 | 		FILTER_MIN_POINT_MAG_LINEAR, | 
 | 		FILTER_MIN_LINEAR_MAG_POINT, | 
 | 		FILTER_LINEAR, | 
 | 		FILTER_ANISOTROPIC, | 
 |  | 
 | 		FILTER_LAST = FILTER_ANISOTROPIC | 
 | 	}; | 
 |  | 
 | 	enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		MIPMAP_NONE, | 
 | 		MIPMAP_POINT, | 
 | 		MIPMAP_LINEAR, | 
 |  | 
 | 		MIPMAP_LAST = MIPMAP_LINEAR | 
 | 	}; | 
 |  | 
 | 	enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		ADDRESSING_WRAP, | 
 | 		ADDRESSING_CLAMP, | 
 | 		ADDRESSING_MIRROR, | 
 | 		ADDRESSING_MIRRORONCE, | 
 | 		ADDRESSING_BORDER,     // Single color | 
 | 		ADDRESSING_SEAMLESS,   // Border of pixels | 
 | 		ADDRESSING_LAYER, | 
 | 		ADDRESSING_TEXELFETCH, | 
 |  | 
 | 		ADDRESSING_LAST = ADDRESSING_TEXELFETCH | 
 | 	}; | 
 |  | 
 | 	enum CompareFunc ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		COMPARE_BYPASS, | 
 | 		COMPARE_LESSEQUAL, | 
 | 		COMPARE_GREATEREQUAL, | 
 | 		COMPARE_LESS, | 
 | 		COMPARE_GREATER, | 
 | 		COMPARE_EQUAL, | 
 | 		COMPARE_NOTEQUAL, | 
 | 		COMPARE_ALWAYS, | 
 | 		COMPARE_NEVER, | 
 |  | 
 | 		COMPARE_LAST = COMPARE_NEVER | 
 | 	}; | 
 |  | 
 | 	enum SwizzleType ENUM_UNDERLYING_TYPE_UNSIGNED_INT | 
 | 	{ | 
 | 		SWIZZLE_RED, | 
 | 		SWIZZLE_GREEN, | 
 | 		SWIZZLE_BLUE, | 
 | 		SWIZZLE_ALPHA, | 
 | 		SWIZZLE_ZERO, | 
 | 		SWIZZLE_ONE, | 
 |  | 
 | 		SWIZZLE_LAST = SWIZZLE_ONE | 
 | 	}; | 
 |  | 
 | 	class Sampler | 
 | 	{ | 
 | 	public: | 
 | 		struct State | 
 | 		{ | 
 | 			State(); | 
 |  | 
 | 			TextureType textureType        : BITS(TEXTURE_LAST); | 
 | 			Format textureFormat           : BITS(FORMAT_LAST); | 
 | 			FilterType textureFilter       : BITS(FILTER_LAST); | 
 | 			AddressingMode addressingModeU : BITS(ADDRESSING_LAST); | 
 | 			AddressingMode addressingModeV : BITS(ADDRESSING_LAST); | 
 | 			AddressingMode addressingModeW : BITS(ADDRESSING_LAST); | 
 | 			MipmapType mipmapFilter        : BITS(FILTER_LAST); | 
 | 			bool sRGB                      : 1; | 
 | 			SwizzleType swizzleR           : BITS(SWIZZLE_LAST); | 
 | 			SwizzleType swizzleG           : BITS(SWIZZLE_LAST); | 
 | 			SwizzleType swizzleB           : BITS(SWIZZLE_LAST); | 
 | 			SwizzleType swizzleA           : BITS(SWIZZLE_LAST); | 
 | 			bool highPrecisionFiltering    : 1; | 
 | 			CompareFunc compare            : BITS(COMPARE_LAST); | 
 |  | 
 | 			#if PERF_PROFILE | 
 | 			bool compressedFormat          : 1; | 
 | 			#endif | 
 | 		}; | 
 |  | 
 | 		Sampler(); | 
 |  | 
 | 		~Sampler(); | 
 |  | 
 | 		State samplerState() const; | 
 |  | 
 | 		void setTextureLevel(int face, int level, Surface *surface, TextureType type); | 
 |  | 
 | 		void setTextureFilter(FilterType textureFilter); | 
 | 		void setMipmapFilter(MipmapType mipmapFilter); | 
 | 		void setGatherEnable(bool enable); | 
 | 		void setAddressingModeU(AddressingMode addressingMode); | 
 | 		void setAddressingModeV(AddressingMode addressingMode); | 
 | 		void setAddressingModeW(AddressingMode addressingMode); | 
 | 		void setReadSRGB(bool sRGB); | 
 | 		void setBorderColor(const Color<float> &borderColor); | 
 | 		void setMaxAnisotropy(float maxAnisotropy); | 
 | 		void setHighPrecisionFiltering(bool highPrecisionFiltering); | 
 | 		void setSwizzleR(SwizzleType swizzleR); | 
 | 		void setSwizzleG(SwizzleType swizzleG); | 
 | 		void setSwizzleB(SwizzleType swizzleB); | 
 | 		void setSwizzleA(SwizzleType swizzleA); | 
 | 		void setCompareFunc(CompareFunc compare); | 
 | 		void setBaseLevel(int baseLevel); | 
 | 		void setMaxLevel(int maxLevel); | 
 | 		void setMinLod(float minLod); | 
 | 		void setMaxLod(float maxLod); | 
 | 		void setSyncRequired(bool isSincRequired); | 
 |  | 
 | 		static void setFilterQuality(FilterType maximumFilterQuality); | 
 | 		static void setMipmapQuality(MipmapType maximumFilterQuality); | 
 | 		void setMipmapLOD(float lod); | 
 |  | 
 | 		bool hasTexture() const; | 
 | 		bool hasUnsignedTexture() const; | 
 | 		bool hasCubeTexture() const; | 
 | 		bool hasVolumeTexture() const; | 
 | 		bool requiresSync() const; | 
 |  | 
 | 		const Texture &getTextureData(); | 
 |  | 
 | 	private: | 
 | 		MipmapType mipmapFilter() const; | 
 | 		TextureType getTextureType() const; | 
 | 		FilterType getTextureFilter() const; | 
 | 		AddressingMode getAddressingModeU() const; | 
 | 		AddressingMode getAddressingModeV() const; | 
 | 		AddressingMode getAddressingModeW() const; | 
 | 		CompareFunc getCompareFunc() const; | 
 |  | 
 | 		Format externalTextureFormat; | 
 | 		Format internalTextureFormat; | 
 | 		TextureType textureType; | 
 |  | 
 | 		FilterType textureFilter; | 
 | 		AddressingMode addressingModeU; | 
 | 		AddressingMode addressingModeV; | 
 | 		AddressingMode addressingModeW; | 
 | 		MipmapType mipmapFilterState; | 
 | 		bool sRGB; | 
 | 		bool gather; | 
 | 		bool highPrecisionFiltering; | 
 | 		bool syncRequired; | 
 | 		int border; | 
 |  | 
 | 		SwizzleType swizzleR; | 
 | 		SwizzleType swizzleG; | 
 | 		SwizzleType swizzleB; | 
 | 		SwizzleType swizzleA; | 
 | 		CompareFunc compare; | 
 |  | 
 | 		Texture texture; | 
 | 		float exp2LOD; | 
 |  | 
 | 		static FilterType maximumTextureFilterQuality; | 
 | 		static MipmapType maximumMipmapFilterQuality; | 
 | 	}; | 
 | } | 
 |  | 
 | #endif   // sw_Sampler_hpp |