1afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#ifndef _VKTSAMPLEVERIFIERUTIL_HPP 2afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#define _VKTSAMPLEVERIFIERUTIL_HPP 3afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker/*------------------------------------------------------------------------- 4afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * Vulkan Conformance Tests 5afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * ------------------------ 6afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * 7afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * Copyright (c) 2016 Google Inc. 8afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * 9afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * Licensed under the Apache License, Version 2.0 (the "License"); 10afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * you may not use this file except in compliance with the License. 11afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * You may obtain a copy of the License at 12afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * 13afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * http://www.apache.org/licenses/LICENSE-2.0 14afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * 15afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * Unless required by applicable law or agreed to in writing, software 16afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * distributed under the License is distributed on an "AS IS" BASIS, 17afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * See the License for the specific language governing permissions and 19afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * limitations under the License. 20afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * 21afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker *//*! 22afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * \file 23afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker * \brief GPU image sample verification 24afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker *//*--------------------------------------------------------------------*/ 25afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 26afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#include "vktSampleVerifier.hpp" 27afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 28afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#include "deMath.h" 29afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#include "tcuFloatFormat.hpp" 30afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#include "tcuTexture.hpp" 31afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#include "vkDefs.hpp" 32afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 33afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakernamespace vkt 34afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 35ec6fe56f6f1a9b00c6269f7b491f9586b3f50669Pyry Haulosnamespace texture 36afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 37afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakernamespace util 38afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 39afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 40afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakerfloat addUlp (float num, 41afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker deInt32 ulp); 42afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 43afa7d2831523587d80e5540ffb7f75adf418ce5fCollin BakerdeInt32 mod (const deInt32 a, 44afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const deInt32 n); 4501af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry HaulosdeInt32 mirror (const deInt32 n); 46afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 47afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::Vec2 calcLodBounds (const tcu::Vec3& dPdx, 48afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::Vec3& dPdy, 49afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::IVec3 size, 50afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const float lodBias, 51afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const float lodMin, 52afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const float lodMax); 53afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::UVec2 calcLevelBounds (const tcu::Vec2& lodBounds, 54afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int levelCount, 55afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker vk::VkSamplerMipmapMode mipmapFilter); 56afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::Vec2 calcLevelLodBounds (const tcu::Vec2& lodBounds, 57afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker int level); 58afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 59afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakervoid wrapTexelGridCoordLinear (tcu::IVec3& baseTexel, 60afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec3& texelGridOffset, 61afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int coordBits, 62afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const ImgDim dim); 63afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakervoid calcTexelBaseOffset (const tcu::IVec3& gridCoord, 64afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int coordBits, 65afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec3& baseTexel, 66afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec3& texelGridOffset); 67afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakervoid calcTexelGridCoordRange (const tcu::Vec3& unnormalizedCoordMin, 68afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::Vec3& unnormalizedCoordMax, 69afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int coordBits, 70afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec3& gridCoordMin, 71afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec3& gridCoordMax); 72afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakervoid calcUnnormalizedCoordRange (const tcu::Vec4& coord, 73afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::IVec3& levelSize, 74afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::FloatFormat& internalFormat, 75afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec3& unnormalizedCoordMin, 76afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec3& unnormalizedCoordMax); 77afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakervoid calcCubemapFaceCoords (const tcu::Vec3& r, 78afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::Vec3& drdx, 79afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const tcu::Vec3& drdy, 80afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int faceNdx, 81afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec2& coordFace, 82afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec2& dPdxFace, 83afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec2& dPdyFace); 8401af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulosint calcCandidateCubemapFaces (const tcu::Vec3& r); 8501af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry HaulosdeInt32 wrapTexelCoord (const deInt32 coord, 86afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int size, 87afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const vk::VkSamplerAddressMode wrap); 8801af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulosvoid wrapCubemapEdge (const tcu::IVec2& coord, 8901af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos const tcu::IVec2& size, 90afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker const int faceNdx, 91afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec2& newCoord, 92afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker int& newFaceNdx); 9301af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulosvoid wrapCubemapCorner (const tcu::IVec2& coord, 9401af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos const tcu::IVec2& size, 9501af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos const int faceNdx, 9601af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos int& adjacentFace1, 9701af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulos int& adjacentFace2, 98afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec2& cornerCoord0, 99afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec2& cornerCoord1, 100afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::IVec2& cornerCoord2); 101afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 10201af60e03f051fb44046f80fdf45f1ebe1ffd5a4Pyry Haulosvoid convertFormat (const void* pixelPtr, 103afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::TextureFormat texFormat, 104afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::FloatFormat internalFormat, 105afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec4& resultMin, 106afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vec4& resultMax); 107afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 108afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertemplate <int Size> 109afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakerbool isEqualRelEpsilon (const tcu::Vector<float, Size>& a, const tcu::Vector<float, Size>& b, const float epsilon) 110afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 111afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker for (int compNdx = 0; compNdx < Size; ++compNdx) 112afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 113afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker if (!isEqualRelEpsilon(a[compNdx], b[compNdx], epsilon)) 114afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 115afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return false; 116afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 117afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 118afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 119afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return true; 120afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} 121afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 122afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertemplate <int Size> 123afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakerbool isInRange (const tcu::Vector<float, Size>& v, const tcu::Vector<float, Size>& min, const tcu::Vector<float, Size>& max) 124afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 125afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker for (int compNdx = 0; compNdx < Size; ++compNdx) 126afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 127afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker if (v[compNdx] < min[compNdx] || v[compNdx] > max[compNdx]) 128afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 129afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return false; 130afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 131afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 132afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 133afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return true; 134afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} 135afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 136afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertemplate <int Size> 137afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::Vector<float, Size> floor (const tcu::Vector<float, Size>& v) 138afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 139afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vector<float, Size> result; 140afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 141afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker for (int compNdx = 0; compNdx < Size; ++compNdx) 142afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 143afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker result[compNdx] = (float)deFloor(v[compNdx]); 144afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 145afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 146afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return result; 147afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} 148afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 149afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertemplate <int Size> 150afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::Vector<float, Size> ceil (const tcu::Vector<float, Size>& v) 151afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 152afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vector<float, Size> result; 153afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 154afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker for (int compNdx = 0; compNdx < Size; ++compNdx) 155afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 156afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker result[compNdx] = (float)deCeil(v[compNdx]); 157afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 158afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 159afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return result; 160afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} 161afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 162afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertemplate <int Size> 163afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Bakertcu::Vector<float, Size> abs (const tcu::Vector<float, Size>& v) 164afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker{ 165afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker tcu::Vector<float, Size> result; 166afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 167afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker for (int compNdx = 0; compNdx < Size; ++compNdx) 168afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker { 169afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker result[compNdx] = de::abs(v[compNdx]); 170afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker } 171afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 172afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker return result; 173afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} 174afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 175afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} // util 176ec6fe56f6f1a9b00c6269f7b491f9586b3f50669Pyry Haulos} // texture 177afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker} // vkt 178afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker 179afa7d2831523587d80e5540ffb7f75adf418ce5fCollin Baker#endif // _VKTSAMPLEVERIFIERUTIL_HPP 180