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