1 #ifndef _VKTSAMPLEVERIFIER_HPP 2 #define _VKTSAMPLEVERIFIER_HPP 3 /*------------------------------------------------------------------------- 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2016 Google Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief GPU image sample verification 24 *//*--------------------------------------------------------------------*/ 25 26 #include "vkDefs.hpp" 27 28 #include "deUniquePtr.hpp" 29 30 #include "tcuFloatFormat.hpp" 31 #include "tcuTexture.hpp" 32 #include "tcuVector.hpp" 33 34 #include <iostream> 35 #include <string> 36 #include <vector> 37 38 namespace vkt 39 { 40 namespace texture 41 { 42 43 struct SampleArguments 44 { 45 tcu::Vec4 coord; 46 tcu::Vec4 dPdx; 47 tcu::Vec4 dPdy; 48 float layer; 49 float lod; 50 float lodBias; 51 float dRef; 52 }; 53 54 enum LookupLodMode 55 { 56 LOOKUP_LOD_MODE_DERIVATIVES = 0, 57 LOOKUP_LOD_MODE_LOD, 58 59 LOOKUP_LOD_MODE_LAST 60 }; 61 62 struct SampleLookupSettings 63 { 64 LookupLodMode lookupLodMode; 65 bool hasLodBias; 66 bool isProjective; 67 }; 68 69 enum WrappingMode 70 { 71 WRAPPING_MODE_REPEAT = 0, 72 WRAPPING_MODE_MIRRORED_REPEAT, 73 WRAPPING_MODE_CLAMP_TO_EDGE, 74 WRAPPING_MODE_CLAMP_TO_BORDER, 75 WRAPPING_MODE_MIRROR_CLAMP_TO_EDGE, 76 77 WRAPPING_MODE_LAST 78 }; 79 80 struct SamplerParameters 81 { 82 vk::VkFilter magFilter; 83 vk::VkFilter minFilter; 84 vk::VkSamplerMipmapMode mipmapFilter; 85 86 vk::VkSamplerAddressMode wrappingModeU; 87 vk::VkSamplerAddressMode wrappingModeV; 88 vk::VkSamplerAddressMode wrappingModeW; 89 90 vk::VkBorderColor borderColor; 91 92 float lodBias; 93 float minLod; 94 float maxLod; 95 96 bool isUnnormalized; 97 bool isCompare; 98 }; 99 100 enum ImgDim 101 { 102 IMG_DIM_INVALID = 0, 103 IMG_DIM_1D, 104 IMG_DIM_2D, 105 IMG_DIM_3D, 106 IMG_DIM_CUBE, 107 108 IMG_DIM_LAST 109 }; 110 111 struct ImageViewParameters 112 { 113 ImgDim dim; 114 vk::VkFormat format; 115 tcu::IVec3 size; 116 int levels; 117 118 bool isArrayed; 119 int arrayLayers; 120 }; 121 122 class SampleVerifier 123 { 124 public: 125 SampleVerifier (const ImageViewParameters& imParams, 126 const SamplerParameters& samplerParams, 127 const SampleLookupSettings& sampleLookupSettings, 128 int coordBits, 129 int mipmapBits, 130 const tcu::FloatFormat& conversionPrecision, 131 const tcu::FloatFormat& filteringPrecision, 132 const std::vector<tcu::ConstPixelBufferAccess>& levels); 133 134 bool verifySample (const SampleArguments& args, 135 const tcu::Vec4& result) const; 136 137 bool verifySampleReport (const SampleArguments& args, 138 const tcu::Vec4& result, 139 std::string& report) const; 140 141 private: 142 143 bool verifySampleFiltered (const tcu::Vec4& result, 144 const tcu::IVec3& baseTexelHi, 145 const tcu::IVec3& baseTexelLo, 146 const tcu::IVec3& texelGridOffsetHi, 147 const tcu::IVec3& texelGridOffsetLo, 148 int layer, 149 int levelHi, 150 const tcu::Vec2& lodFracBounds, 151 vk::VkFilter filter, 152 vk::VkSamplerMipmapMode mipmapFilter, 153 std::ostream& report) const; 154 155 bool verifySampleTexelGridCoords (const SampleArguments& args, 156 const tcu::Vec4& result, 157 const tcu::IVec3& gridCoordHi, 158 const tcu::IVec3& gridCoordLo, 159 const tcu::Vec2& lodBounds, 160 int level, 161 vk::VkSamplerMipmapMode mipmapFilter, 162 std::ostream& report) const; 163 164 bool verifySampleMipmapLevel (const SampleArguments& args, 165 const tcu::Vec4& result, 166 const tcu::Vec4& coord, 167 const tcu::Vec2& lodFracBounds, 168 int level, 169 std::ostream& report) const; 170 171 bool verifySampleCubemapFace (const SampleArguments& args, 172 const tcu::Vec4& result, 173 const tcu::Vec4& coord, 174 const tcu::Vec4& dPdx, 175 const tcu::Vec4& dPdy, 176 int face, 177 std::ostream& report) const; 178 179 bool verifySampleImpl (const SampleArguments& args, 180 const tcu::Vec4& result, 181 std::ostream& report) const; 182 183 bool coordOutOfRange (const tcu::IVec3& coord, 184 int compNdx, 185 int level) const; 186 187 void fetchTexel (const tcu::IVec3& coordIn, 188 int layer, 189 int level, 190 vk::VkFilter filter, 191 tcu::Vec4& resultMin, 192 tcu::Vec4& resultMax) const; 193 194 void fetchTexelWrapped (const tcu::IVec3& coord, 195 int layer, 196 int level, 197 tcu::Vec4& resultMin, 198 tcu::Vec4& resultMax) const; 199 200 void getFilteredSample1D (const tcu::IVec3& texelBase, 201 float weight, 202 int layer, 203 int level, 204 tcu::Vec4& resultMin, 205 tcu::Vec4& resultMax) const; 206 207 void getFilteredSample2D (const tcu::IVec3& texelBase, 208 const tcu::Vec2& weights, 209 int layer, 210 int level, 211 tcu::Vec4& resultMin, 212 tcu::Vec4& resultMax) const; 213 214 void getFilteredSample3D (const tcu::IVec3& texelBase, 215 const tcu::Vec3& weights, 216 int layer, 217 int level, 218 tcu::Vec4& resultMin, 219 tcu::Vec4& resultMax) const; 220 221 void getFilteredSample (const tcu::IVec3& texelBase, 222 const tcu::Vec3& weights, 223 int layer, 224 int level, 225 tcu::Vec4& resultMin, 226 tcu::Vec4& resultMax) const; 227 228 void getMipmapStepBounds (const tcu::Vec2& lodFracBounds, 229 deInt32& stepMin, 230 deInt32& stepMax) const; 231 232 const ImageViewParameters& m_imParams; 233 const SamplerParameters& m_samplerParams; 234 const SampleLookupSettings& m_sampleLookupSettings; 235 236 const int m_coordBits; 237 const int m_mipmapBits; 238 const tcu::FloatFormat m_conversionPrecision; 239 const tcu::FloatFormat m_filteringPrecision; 240 241 const int m_unnormalizedDim; 242 243 const std::vector<tcu::ConstPixelBufferAccess>& m_levels; 244 }; 245 246 } // texture 247 } // vkt 248 249 #endif // _VKTSAMPLEVERIFIER_HPP 250