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