1#ifndef _VKTSAMPLEVERIFIERUTIL_HPP 2#define _VKTSAMPLEVERIFIERUTIL_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 "vktSampleVerifier.hpp" 27 28#include "deMath.h" 29#include "tcuFloatFormat.hpp" 30#include "tcuTexture.hpp" 31#include "vkDefs.hpp" 32 33namespace vkt 34{ 35namespace texture 36{ 37namespace util 38{ 39 40float addUlp (float num, 41 deInt32 ulp); 42 43deInt32 mod (const deInt32 a, 44 const deInt32 n); 45deInt32 mirror (const deInt32 n); 46 47tcu::Vec2 calcLodBounds (const tcu::Vec3& dPdx, 48 const tcu::Vec3& dPdy, 49 const tcu::IVec3 size, 50 const float lodBias, 51 const float lodMin, 52 const float lodMax); 53tcu::UVec2 calcLevelBounds (const tcu::Vec2& lodBounds, 54 const int levelCount, 55 vk::VkSamplerMipmapMode mipmapFilter); 56tcu::Vec2 calcLevelLodBounds (const tcu::Vec2& lodBounds, 57 int level); 58 59void wrapTexelGridCoordLinear (tcu::IVec3& baseTexel, 60 tcu::IVec3& texelGridOffset, 61 const int coordBits, 62 const ImgDim dim); 63void calcTexelBaseOffset (const tcu::IVec3& gridCoord, 64 const int coordBits, 65 tcu::IVec3& baseTexel, 66 tcu::IVec3& texelGridOffset); 67void calcTexelGridCoordRange (const tcu::Vec3& unnormalizedCoordMin, 68 const tcu::Vec3& unnormalizedCoordMax, 69 const int coordBits, 70 tcu::IVec3& gridCoordMin, 71 tcu::IVec3& gridCoordMax); 72void calcUnnormalizedCoordRange (const tcu::Vec4& coord, 73 const tcu::IVec3& levelSize, 74 const tcu::FloatFormat& internalFormat, 75 tcu::Vec3& unnormalizedCoordMin, 76 tcu::Vec3& unnormalizedCoordMax); 77void calcCubemapFaceCoords (const tcu::Vec3& r, 78 const tcu::Vec3& drdx, 79 const tcu::Vec3& drdy, 80 const int faceNdx, 81 tcu::Vec2& coordFace, 82 tcu::Vec2& dPdxFace, 83 tcu::Vec2& dPdyFace); 84int calcCandidateCubemapFaces (const tcu::Vec3& r); 85deInt32 wrapTexelCoord (const deInt32 coord, 86 const int size, 87 const vk::VkSamplerAddressMode wrap); 88void wrapCubemapEdge (const tcu::IVec2& coord, 89 const tcu::IVec2& size, 90 const int faceNdx, 91 tcu::IVec2& newCoord, 92 int& newFaceNdx); 93void wrapCubemapCorner (const tcu::IVec2& coord, 94 const tcu::IVec2& size, 95 const int faceNdx, 96 int& adjacentFace1, 97 int& adjacentFace2, 98 tcu::IVec2& cornerCoord0, 99 tcu::IVec2& cornerCoord1, 100 tcu::IVec2& cornerCoord2); 101 102void convertFormat (const void* pixelPtr, 103 tcu::TextureFormat texFormat, 104 tcu::FloatFormat internalFormat, 105 tcu::Vec4& resultMin, 106 tcu::Vec4& resultMax); 107 108template <int Size> 109bool isEqualRelEpsilon (const tcu::Vector<float, Size>& a, const tcu::Vector<float, Size>& b, const float epsilon) 110{ 111 for (int compNdx = 0; compNdx < Size; ++compNdx) 112 { 113 if (!isEqualRelEpsilon(a[compNdx], b[compNdx], epsilon)) 114 { 115 return false; 116 } 117 } 118 119 return true; 120} 121 122template <int Size> 123bool isInRange (const tcu::Vector<float, Size>& v, const tcu::Vector<float, Size>& min, const tcu::Vector<float, Size>& max) 124{ 125 for (int compNdx = 0; compNdx < Size; ++compNdx) 126 { 127 if (v[compNdx] < min[compNdx] || v[compNdx] > max[compNdx]) 128 { 129 return false; 130 } 131 } 132 133 return true; 134} 135 136template <int Size> 137tcu::Vector<float, Size> floor (const tcu::Vector<float, Size>& v) 138{ 139 tcu::Vector<float, Size> result; 140 141 for (int compNdx = 0; compNdx < Size; ++compNdx) 142 { 143 result[compNdx] = (float)deFloor(v[compNdx]); 144 } 145 146 return result; 147} 148 149template <int Size> 150tcu::Vector<float, Size> ceil (const tcu::Vector<float, Size>& v) 151{ 152 tcu::Vector<float, Size> result; 153 154 for (int compNdx = 0; compNdx < Size; ++compNdx) 155 { 156 result[compNdx] = (float)deCeil(v[compNdx]); 157 } 158 159 return result; 160} 161 162template <int Size> 163tcu::Vector<float, Size> abs (const tcu::Vector<float, Size>& v) 164{ 165 tcu::Vector<float, Size> result; 166 167 for (int compNdx = 0; compNdx < Size; ++compNdx) 168 { 169 result[compNdx] = de::abs(v[compNdx]); 170 } 171 172 return result; 173} 174 175} // util 176} // texture 177} // vkt 178 179#endif // _VKTSAMPLEVERIFIERUTIL_HPP 180