1cb93a386Sopenharmony_ci// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2cb93a386Sopenharmony_ci// 3cb93a386Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4cb93a386Sopenharmony_ci// you may not use this file except in compliance with the License. 5cb93a386Sopenharmony_ci// You may obtain a copy of the License at 6cb93a386Sopenharmony_ci// 7cb93a386Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8cb93a386Sopenharmony_ci// 9cb93a386Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10cb93a386Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11cb93a386Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cb93a386Sopenharmony_ci// See the License for the specific language governing permissions and 13cb93a386Sopenharmony_ci// limitations under the License. 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#ifndef sw_Sampler_hpp 16cb93a386Sopenharmony_ci#define sw_Sampler_hpp 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include "Device/Config.hpp" 19cb93a386Sopenharmony_ci#include "System/Types.hpp" 20cb93a386Sopenharmony_ci#include "Vulkan/VkFormat.hpp" 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cinamespace vk { 23cb93a386Sopenharmony_ciclass Image; 24cb93a386Sopenharmony_ci} 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_cinamespace sw { 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_cistruct Mipmap 29cb93a386Sopenharmony_ci{ 30cb93a386Sopenharmony_ci const void *buffer; 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci short4 uHalf; 33cb93a386Sopenharmony_ci short4 vHalf; 34cb93a386Sopenharmony_ci short4 wHalf; 35cb93a386Sopenharmony_ci int4 width; 36cb93a386Sopenharmony_ci int4 height; 37cb93a386Sopenharmony_ci int4 depth; 38cb93a386Sopenharmony_ci short4 onePitchP; 39cb93a386Sopenharmony_ci int4 pitchP; 40cb93a386Sopenharmony_ci int4 sliceP; 41cb93a386Sopenharmony_ci int4 samplePitchP; 42cb93a386Sopenharmony_ci int4 sampleMax; 43cb93a386Sopenharmony_ci}; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_cistruct Texture 46cb93a386Sopenharmony_ci{ 47cb93a386Sopenharmony_ci Mipmap mipmap[MIPMAP_LEVELS]; 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci float4 widthWidthHeightHeight; 50cb93a386Sopenharmony_ci float4 width; 51cb93a386Sopenharmony_ci float4 height; 52cb93a386Sopenharmony_ci float4 depth; 53cb93a386Sopenharmony_ci}; 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_cienum FilterType ENUM_UNDERLYING_TYPE_UNSIGNED_INT 56cb93a386Sopenharmony_ci{ 57cb93a386Sopenharmony_ci FILTER_POINT, 58cb93a386Sopenharmony_ci FILTER_GATHER, 59cb93a386Sopenharmony_ci FILTER_MIN_POINT_MAG_LINEAR, 60cb93a386Sopenharmony_ci FILTER_MIN_LINEAR_MAG_POINT, 61cb93a386Sopenharmony_ci FILTER_LINEAR, 62cb93a386Sopenharmony_ci FILTER_ANISOTROPIC, 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci FILTER_LAST = FILTER_ANISOTROPIC 65cb93a386Sopenharmony_ci}; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_cienum MipmapType ENUM_UNDERLYING_TYPE_UNSIGNED_INT 68cb93a386Sopenharmony_ci{ 69cb93a386Sopenharmony_ci MIPMAP_NONE, 70cb93a386Sopenharmony_ci MIPMAP_POINT, 71cb93a386Sopenharmony_ci MIPMAP_LINEAR, 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci MIPMAP_LAST = MIPMAP_LINEAR 74cb93a386Sopenharmony_ci}; 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_cienum AddressingMode ENUM_UNDERLYING_TYPE_UNSIGNED_INT 77cb93a386Sopenharmony_ci{ 78cb93a386Sopenharmony_ci ADDRESSING_UNUSED, 79cb93a386Sopenharmony_ci ADDRESSING_WRAP, 80cb93a386Sopenharmony_ci ADDRESSING_CLAMP, 81cb93a386Sopenharmony_ci ADDRESSING_MIRROR, 82cb93a386Sopenharmony_ci ADDRESSING_MIRRORONCE, 83cb93a386Sopenharmony_ci ADDRESSING_BORDER, // Single color 84cb93a386Sopenharmony_ci ADDRESSING_SEAMLESS, // Border of pixels 85cb93a386Sopenharmony_ci ADDRESSING_CUBEFACE, // Cube face layer 86cb93a386Sopenharmony_ci ADDRESSING_TEXELFETCH, 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ci ADDRESSING_LAST = ADDRESSING_TEXELFETCH 89cb93a386Sopenharmony_ci}; 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_cistruct Sampler 92cb93a386Sopenharmony_ci{ 93cb93a386Sopenharmony_ci VkImageViewType textureType; 94cb93a386Sopenharmony_ci vk::Format textureFormat; 95cb93a386Sopenharmony_ci FilterType textureFilter; 96cb93a386Sopenharmony_ci AddressingMode addressingModeU; 97cb93a386Sopenharmony_ci AddressingMode addressingModeV; 98cb93a386Sopenharmony_ci AddressingMode addressingModeW; 99cb93a386Sopenharmony_ci MipmapType mipmapFilter; 100cb93a386Sopenharmony_ci VkComponentMapping swizzle; 101cb93a386Sopenharmony_ci int gatherComponent; 102cb93a386Sopenharmony_ci bool highPrecisionFiltering; 103cb93a386Sopenharmony_ci bool compareEnable; 104cb93a386Sopenharmony_ci VkCompareOp compareOp; 105cb93a386Sopenharmony_ci VkBorderColor border; 106cb93a386Sopenharmony_ci VkClearColorValue customBorder; 107cb93a386Sopenharmony_ci bool unnormalizedCoordinates; 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci VkSamplerYcbcrModelConversion ycbcrModel; 110cb93a386Sopenharmony_ci bool studioSwing; // Narrow range 111cb93a386Sopenharmony_ci bool swappedChroma; // Cb/Cr components in reverse order 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci float mipLodBias = 0.0f; 114cb93a386Sopenharmony_ci float maxAnisotropy = 0.0f; 115cb93a386Sopenharmony_ci float minLod = -1000.0f; 116cb93a386Sopenharmony_ci float maxLod = 1000.0f; 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ci bool is1D() const 119cb93a386Sopenharmony_ci { 120cb93a386Sopenharmony_ci switch(textureType) 121cb93a386Sopenharmony_ci { 122cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 123cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 124cb93a386Sopenharmony_ci return true; 125cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 126cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 127cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 128cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 129cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 130cb93a386Sopenharmony_ci return false; 131cb93a386Sopenharmony_ci default: 132cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 133cb93a386Sopenharmony_ci return false; 134cb93a386Sopenharmony_ci } 135cb93a386Sopenharmony_ci } 136cb93a386Sopenharmony_ci 137cb93a386Sopenharmony_ci bool is2D() const 138cb93a386Sopenharmony_ci { 139cb93a386Sopenharmony_ci switch(textureType) 140cb93a386Sopenharmony_ci { 141cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 142cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 143cb93a386Sopenharmony_ci return true; 144cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 145cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 146cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 147cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 148cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 149cb93a386Sopenharmony_ci return false; 150cb93a386Sopenharmony_ci default: 151cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 152cb93a386Sopenharmony_ci return false; 153cb93a386Sopenharmony_ci } 154cb93a386Sopenharmony_ci } 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci bool is3D() const 157cb93a386Sopenharmony_ci { 158cb93a386Sopenharmony_ci switch(textureType) 159cb93a386Sopenharmony_ci { 160cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 161cb93a386Sopenharmony_ci return true; 162cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 163cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 164cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 165cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 166cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 167cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 168cb93a386Sopenharmony_ci return false; 169cb93a386Sopenharmony_ci default: 170cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 171cb93a386Sopenharmony_ci return false; 172cb93a386Sopenharmony_ci } 173cb93a386Sopenharmony_ci } 174cb93a386Sopenharmony_ci 175cb93a386Sopenharmony_ci bool isCube() const 176cb93a386Sopenharmony_ci { 177cb93a386Sopenharmony_ci switch(textureType) 178cb93a386Sopenharmony_ci { 179cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 180cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 181cb93a386Sopenharmony_ci return true; 182cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 183cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 184cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 185cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 186cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 187cb93a386Sopenharmony_ci return false; 188cb93a386Sopenharmony_ci default: 189cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 190cb93a386Sopenharmony_ci return false; 191cb93a386Sopenharmony_ci } 192cb93a386Sopenharmony_ci } 193cb93a386Sopenharmony_ci 194cb93a386Sopenharmony_ci bool isArrayed() const 195cb93a386Sopenharmony_ci { 196cb93a386Sopenharmony_ci switch(textureType) 197cb93a386Sopenharmony_ci { 198cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 199cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 200cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 201cb93a386Sopenharmony_ci return true; 202cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 203cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 204cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 205cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 206cb93a386Sopenharmony_ci return false; 207cb93a386Sopenharmony_ci default: 208cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 209cb93a386Sopenharmony_ci return false; 210cb93a386Sopenharmony_ci } 211cb93a386Sopenharmony_ci } 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ci // Returns the number of coordinates required to sample the image, 214cb93a386Sopenharmony_ci // not including any array coordinate, which is indicated by isArrayed(). 215cb93a386Sopenharmony_ci unsigned int dimensionality() const 216cb93a386Sopenharmony_ci { 217cb93a386Sopenharmony_ci switch(textureType) 218cb93a386Sopenharmony_ci { 219cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D: 220cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_1D_ARRAY: 221cb93a386Sopenharmony_ci return 1; 222cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D: 223cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 224cb93a386Sopenharmony_ci return 2; 225cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_3D: 226cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE: 227cb93a386Sopenharmony_ci case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: 228cb93a386Sopenharmony_ci return 3; 229cb93a386Sopenharmony_ci default: 230cb93a386Sopenharmony_ci UNSUPPORTED("VkImageViewType %d", (int)textureType); 231cb93a386Sopenharmony_ci return 0; 232cb93a386Sopenharmony_ci } 233cb93a386Sopenharmony_ci } 234cb93a386Sopenharmony_ci}; 235cb93a386Sopenharmony_ci 236cb93a386Sopenharmony_ci} // namespace sw 237cb93a386Sopenharmony_ci 238cb93a386Sopenharmony_ci#endif // sw_Sampler_hpp 239