| // 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 "Device/Config.hpp" |
| #include "System/Types.hpp" |
| #include "Vulkan/VkFormat.hpp" |
| |
| namespace sw { |
| |
| struct Mipmap |
| { |
| const void *buffer; |
| |
| ushort4 uHalf; |
| ushort4 vHalf; |
| ushort4 wHalf; |
| uint4 width; |
| uint4 height; |
| uint4 depth; |
| short4 onePitchP; |
| uint4 pitchP; |
| uint4 sliceP; |
| uint4 samplePitchP; |
| uint4 sampleMax; |
| }; |
| |
| struct Texture |
| { |
| Mipmap mipmap[MIPMAP_LEVELS]; |
| |
| float4 widthWidthHeightHeight; |
| float4 width; |
| float4 height; |
| float4 depth; |
| }; |
| |
| 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_UNUSED, |
| ADDRESSING_WRAP, |
| ADDRESSING_CLAMP, |
| ADDRESSING_MIRROR, |
| ADDRESSING_MIRRORONCE, |
| ADDRESSING_BORDER, // Single color |
| ADDRESSING_SEAMLESS, // Border of pixels |
| ADDRESSING_CUBEFACE, // Cube face layer |
| ADDRESSING_TEXELFETCH, |
| |
| ADDRESSING_LAST = ADDRESSING_TEXELFETCH |
| }; |
| |
| struct Sampler |
| { |
| VkImageViewType textureType; |
| vk::Format textureFormat; |
| FilterType textureFilter; |
| AddressingMode addressingModeU; |
| AddressingMode addressingModeV; |
| AddressingMode addressingModeW; |
| MipmapType mipmapFilter; |
| VkComponentMapping swizzle; |
| int gatherComponent; |
| bool highPrecisionFiltering; |
| bool compareEnable; |
| VkCompareOp compareOp; |
| VkBorderColor border; |
| VkClearColorValue customBorder; |
| bool unnormalizedCoordinates; |
| |
| VkSamplerYcbcrModelConversion ycbcrModel; |
| bool studioSwing; // Narrow range |
| bool swappedChroma; // Cb/Cr components in reverse order |
| |
| float mipLodBias = 0.0f; |
| float maxAnisotropy = 0.0f; |
| float minLod = -1000.0f; |
| float maxLod = 1000.0f; |
| |
| bool is1D() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| return true; |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_3D: |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return false; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return false; |
| } |
| } |
| |
| bool is2D() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| return true; |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_3D: |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return false; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return false; |
| } |
| } |
| |
| bool is3D() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_3D: |
| return true; |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return false; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return false; |
| } |
| } |
| |
| bool isCube() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return true; |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_3D: |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| return false; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return false; |
| } |
| } |
| |
| bool isArrayed() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return true; |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_3D: |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| return false; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return false; |
| } |
| } |
| |
| // Returns the number of coordinates required to sample the image, |
| // not including any array coordinate, which is indicated by isArrayed(). |
| unsigned int dimensionality() const |
| { |
| switch(textureType) |
| { |
| case VK_IMAGE_VIEW_TYPE_1D: |
| case VK_IMAGE_VIEW_TYPE_1D_ARRAY: |
| return 1; |
| case VK_IMAGE_VIEW_TYPE_2D: |
| case VK_IMAGE_VIEW_TYPE_2D_ARRAY: |
| return 2; |
| case VK_IMAGE_VIEW_TYPE_3D: |
| case VK_IMAGE_VIEW_TYPE_CUBE: |
| case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: |
| return 3; |
| default: |
| UNSUPPORTED("VkImageViewType %d", (int)textureType); |
| return 0; |
| } |
| } |
| }; |
| |
| } // namespace sw |
| |
| #endif // sw_Sampler_hpp |