Home | History | Annotate | Download | only in Renderer
      1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef sw_Sampler_hpp
     16 #define sw_Sampler_hpp
     17 
     18 #include "Main/Config.hpp"
     19 #include "Renderer/Surface.hpp"
     20 #include "Common/Types.hpp"
     21 
     22 namespace sw
     23 {
     24 	struct Mipmap
     25 	{
     26 		const void *buffer[6];
     27 
     28 		float4 fWidth;
     29 		float4 fHeight;
     30 		float4 fDepth;
     31 
     32 		short uHalf[4];
     33 		short vHalf[4];
     34 		short wHalf[4];
     35 		short width[4];
     36 		short height[4];
     37 		short depth[4];
     38 		short onePitchP[4];
     39 		int4 pitchP;
     40 		int4 sliceP;
     41 	};
     42 
     43 	struct Texture
     44 	{
     45 		Mipmap mipmap[MIPMAP_LEVELS];
     46 
     47 		float LOD;
     48 		float4 widthHeightLOD;
     49 		float4 widthLOD;
     50 		float4 heightLOD;
     51 		float4 depthLOD;
     52 
     53 		word4 borderColor4[4];
     54 		float4 borderColorF[4];
     55 		float maxAnisotropy;
     56 		int baseLevel;
     57 		int maxLevel;
     58 		float minLod;
     59 		float maxLod;
     60 	};
     61 
     62 	enum SamplerType
     63 	{
     64 		SAMPLER_PIXEL,
     65 		SAMPLER_VERTEX
     66 	};
     67 
     68 	enum TextureType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
     69 	{
     70 		TEXTURE_NULL,
     71 		TEXTURE_2D,
     72 		TEXTURE_CUBE,
     73 		TEXTURE_3D,
     74 		TEXTURE_2D_ARRAY,
     75 
     76 		TEXTURE_LAST = TEXTURE_2D_ARRAY
     77 	};
     78 
     79 	enum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
     80 	{
     81 		FILTER_POINT,
     82 		FILTER_GATHER,
     83 		FILTER_MIN_POINT_MAG_LINEAR,
     84 		FILTER_MIN_LINEAR_MAG_POINT,
     85 		FILTER_LINEAR,
     86 		FILTER_ANISOTROPIC,
     87 
     88 		FILTER_LAST = FILTER_ANISOTROPIC
     89 	};
     90 
     91 	enum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
     92 	{
     93 		MIPMAP_NONE,
     94 		MIPMAP_POINT,
     95 		MIPMAP_LINEAR,
     96 
     97 		MIPMAP_LAST = MIPMAP_LINEAR
     98 	};
     99 
    100 	enum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT
    101 	{
    102 		ADDRESSING_WRAP,
    103 		ADDRESSING_CLAMP,
    104 		ADDRESSING_MIRROR,
    105 		ADDRESSING_MIRRORONCE,
    106 		ADDRESSING_BORDER,
    107 		ADDRESSING_LAYER,
    108 		ADDRESSING_TEXELFETCH,
    109 
    110 		ADDRESSING_LAST = ADDRESSING_TEXELFETCH
    111 	};
    112 
    113 	enum SwizzleType ENUM_UNDERLYING_TYPE_UNSIGNED_INT
    114 	{
    115 		SWIZZLE_RED,
    116 		SWIZZLE_GREEN,
    117 		SWIZZLE_BLUE,
    118 		SWIZZLE_ALPHA,
    119 		SWIZZLE_ZERO,
    120 		SWIZZLE_ONE,
    121 
    122 		SWIZZLE_LAST = SWIZZLE_ONE
    123 	};
    124 
    125 	class Sampler
    126 	{
    127 	public:
    128 		struct State
    129 		{
    130 			State();
    131 
    132 			TextureType textureType        : BITS(TEXTURE_LAST);
    133 			Format textureFormat           : BITS(FORMAT_LAST);
    134 			FilterType textureFilter       : BITS(FILTER_LAST);
    135 			AddressingMode addressingModeU : BITS(ADDRESSING_LAST);
    136 			AddressingMode addressingModeV : BITS(ADDRESSING_LAST);
    137 			AddressingMode addressingModeW : BITS(ADDRESSING_LAST);
    138 			MipmapType mipmapFilter        : BITS(FILTER_LAST);
    139 			bool sRGB                      : 1;
    140 			SwizzleType swizzleR           : BITS(SWIZZLE_LAST);
    141 			SwizzleType swizzleG           : BITS(SWIZZLE_LAST);
    142 			SwizzleType swizzleB           : BITS(SWIZZLE_LAST);
    143 			SwizzleType swizzleA           : BITS(SWIZZLE_LAST);
    144 			bool highPrecisionFiltering    : 1;
    145 
    146 			#if PERF_PROFILE
    147 			bool compressedFormat          : 1;
    148 			#endif
    149 		};
    150 
    151 		Sampler();
    152 
    153 		~Sampler();
    154 
    155 		State samplerState() const;
    156 
    157 		void setTextureLevel(int face, int level, Surface *surface, TextureType type);
    158 
    159 		void setTextureFilter(FilterType textureFilter);
    160 		void setMipmapFilter(MipmapType mipmapFilter);
    161 		void setGatherEnable(bool enable);
    162 		void setAddressingModeU(AddressingMode addressingMode);
    163 		void setAddressingModeV(AddressingMode addressingMode);
    164 		void setAddressingModeW(AddressingMode addressingMode);
    165 		void setReadSRGB(bool sRGB);
    166 		void setBorderColor(const Color<float> &borderColor);
    167 		void setMaxAnisotropy(float maxAnisotropy);
    168 		void setHighPrecisionFiltering(bool highPrecisionFiltering);
    169 		void setSwizzleR(SwizzleType swizzleR);
    170 		void setSwizzleG(SwizzleType swizzleG);
    171 		void setSwizzleB(SwizzleType swizzleB);
    172 		void setSwizzleA(SwizzleType swizzleA);
    173 		void setBaseLevel(int baseLevel);
    174 		void setMaxLevel(int maxLevel);
    175 		void setMinLod(float minLod);
    176 		void setMaxLod(float maxLod);
    177 
    178 		static void setFilterQuality(FilterType maximumFilterQuality);
    179 		static void setMipmapQuality(MipmapType maximumFilterQuality);
    180 		void setMipmapLOD(float lod);
    181 
    182 		bool hasTexture() const;
    183 		bool hasUnsignedTexture() const;
    184 		bool hasCubeTexture() const;
    185 		bool hasVolumeTexture() const;
    186 
    187 		const Texture &getTextureData();
    188 
    189 	private:
    190 		MipmapType mipmapFilter() const;
    191 		TextureType getTextureType() const;
    192 		FilterType getTextureFilter() const;
    193 		AddressingMode getAddressingModeU() const;
    194 		AddressingMode getAddressingModeV() const;
    195 		AddressingMode getAddressingModeW() const;
    196 
    197 		Format externalTextureFormat;
    198 		Format internalTextureFormat;
    199 		TextureType textureType;
    200 
    201 		FilterType textureFilter;
    202 		AddressingMode addressingModeU;
    203 		AddressingMode addressingModeV;
    204 		AddressingMode addressingModeW;
    205 		MipmapType mipmapFilterState;
    206 		bool sRGB;
    207 		bool gather;
    208 		bool highPrecisionFiltering;
    209 
    210 		SwizzleType swizzleR;
    211 		SwizzleType swizzleG;
    212 		SwizzleType swizzleB;
    213 		SwizzleType swizzleA;
    214 		Texture texture;
    215 		float exp2LOD;
    216 
    217 		static FilterType maximumTextureFilterQuality;
    218 		static MipmapType maximumMipmapFilterQuality;
    219 	};
    220 }
    221 
    222 #endif   // sw_Sampler_hpp
    223