// 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 vk { class Image; } namespace sw { struct Mipmap { const void *buffer; short4 uHalf; short4 vHalf; short4 wHalf; int4 width; int4 height; int4 depth; short4 onePitchP; int4 pitchP; int4 sliceP; int4 samplePitchP; int4 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; 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 = 0.0f; float maxLod = 0.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; } }; } // namespace sw #endif // sw_Sampler_hpp