| // 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" | |
| namespace sw | |
| { | |
| struct Mipmap | |
| { | |
| const void *buffer[6]; | |
| union | |
| { | |
| struct | |
| { | |
| int64_t uInt; | |
| int64_t vInt; | |
| int64_t wInt; | |
| int64_t uFrac; | |
| int64_t vFrac; | |
| int64_t wFrac; | |
| }; | |
| struct | |
| { | |
| 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]; | |
| int sliceP[2]; | |
| }; | |
| 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 : unsigned int | |
| { | |
| TEXTURE_NULL, | |
| TEXTURE_2D, | |
| TEXTURE_CUBE, | |
| TEXTURE_3D, | |
| TEXTURE_2D_ARRAY, | |
| TEXTURE_LAST = TEXTURE_2D_ARRAY | |
| }; | |
| enum FilterType : 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 : unsigned int | |
| { | |
| MIPMAP_NONE, | |
| MIPMAP_POINT, | |
| MIPMAP_LINEAR, | |
| MIPMAP_LAST = MIPMAP_LINEAR | |
| }; | |
| enum AddressingMode : unsigned int | |
| { | |
| ADDRESSING_WRAP, | |
| ADDRESSING_CLAMP, | |
| ADDRESSING_MIRROR, | |
| ADDRESSING_MIRRORONCE, | |
| ADDRESSING_BORDER, | |
| ADDRESSING_LAYER, | |
| ADDRESSING_TEXELFETCH, | |
| ADDRESSING_LAST = ADDRESSING_TEXELFETCH | |
| }; | |
| enum SwizzleType : 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 hasNPOTTexture : 1; | |
| bool sRGB : 1; | |
| SwizzleType swizzleR : BITS(SWIZZLE_LAST); | |
| SwizzleType swizzleG : BITS(SWIZZLE_LAST); | |
| SwizzleType swizzleB : BITS(SWIZZLE_LAST); | |
| SwizzleType swizzleA : BITS(SWIZZLE_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 setSwizzleR(SwizzleType swizzleR); | |
| void setSwizzleG(SwizzleType swizzleG); | |
| void setSwizzleB(SwizzleType swizzleB); | |
| void setSwizzleA(SwizzleType swizzleA); | |
| void setBaseLevel(int baseLevel); | |
| void setMaxLevel(int maxLevel); | |
| void setMinLod(float minLod); | |
| void setMaxLod(float maxLod); | |
| 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; | |
| const Texture &getTextureData(); | |
| private: | |
| MipmapType mipmapFilter() const; | |
| bool hasNPOTTexture() const; | |
| TextureType getTextureType() const; | |
| FilterType getTextureFilter() const; | |
| AddressingMode getAddressingModeU() const; | |
| AddressingMode getAddressingModeV() const; | |
| AddressingMode getAddressingModeW() const; | |
| Format externalTextureFormat; | |
| Format internalTextureFormat; | |
| TextureType textureType; | |
| FilterType textureFilter; | |
| AddressingMode addressingModeU; | |
| AddressingMode addressingModeV; | |
| AddressingMode addressingModeW; | |
| MipmapType mipmapFilterState; | |
| bool sRGB; | |
| bool gather; | |
| SwizzleType swizzleR; | |
| SwizzleType swizzleG; | |
| SwizzleType swizzleB; | |
| SwizzleType swizzleA; | |
| Texture texture; | |
| float exp2LOD; | |
| static FilterType maximumTextureFilterQuality; | |
| static MipmapType maximumMipmapFilterQuality; | |
| }; | |
| } | |
| #endif // sw_Sampler_hpp |