1946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim/*------------------------------------------------------------------------
2946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * Vulkan Conformance Tests
3946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * ------------------------
4946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *
5946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * Copyright (c) 2015 The Khronos Group Inc.
6946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * Copyright (c) 2015 Imagination Technologies Ltd.
7946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *
8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
11946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *
12978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
13946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *
14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
19946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *
20946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *//*!
21946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * \file
22946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim * \brief Sampler Tests
23946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim *//*--------------------------------------------------------------------*/
24946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
25946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vktPipelineSamplerTests.hpp"
26946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vktPipelineImageSamplingInstance.hpp"
27946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vktPipelineImageUtil.hpp"
28946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vktPipelineVertexUtil.hpp"
29946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vktTestCase.hpp"
30946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vkImageUtil.hpp"
31946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "vkPrograms.hpp"
32946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "tcuPlatform.hpp"
33946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "tcuTextureUtil.hpp"
34946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "deStringUtil.hpp"
35946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include "deMemory.h"
36946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
37946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include <iomanip>
38946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include <sstream>
39946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim#include <vector>
40946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
41946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimnamespace vkt
42946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
43946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimnamespace pipeline
44946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
45946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
46946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimusing namespace vk;
47946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimusing de::MovePtr;
48946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
49946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimnamespace
50946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
51946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
52946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimclass SamplerTest : public vkt::TestCase
53946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
54946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimpublic:
55946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim										SamplerTest				(tcu::TestContext&	testContext,
56946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 const char*		name,
57946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 const char*		description,
58946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 VkImageViewType	imageViewType,
59946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 VkFormat			imageFormat,
60946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 int				imageSize,
61946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																 float				samplerLod);
62946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual								~SamplerTest			(void) {}
63946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
64946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual void						initPrograms			(SourceCollections& sourceCollections) const;
65946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual TestInstance*				createInstance			(Context& context) const;
66689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	virtual tcu::UVec2					getRenderSize			(VkImageViewType viewType) const;
67946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual std::vector<Vertex4Tex4>	createVertices			(void) const;
68946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual VkSamplerCreateInfo			getSamplerCreateInfo	(void) const;
69946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
70946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	static std::string					getGlslSamplerType		(const tcu::TextureFormat& format, VkImageViewType type);
71946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	static tcu::IVec3					getImageSize			(VkImageViewType viewType, int size);
72946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	static int							getArraySize			(VkImageViewType viewType);
73946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
74946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimprotected:
75946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkImageViewType						m_imageViewType;
76946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkFormat							m_imageFormat;
77946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	int									m_imageSize;
78946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkImageViewCreateInfo				m_imageViewParams;
79946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkSamplerCreateInfo					m_samplerParams;
80946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	float								m_samplerLod;
81946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim};
82946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
83946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimclass SamplerMagFilterTest : public SamplerTest
84946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
85946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimpublic:
86946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim									SamplerMagFilterTest	(tcu::TestContext&	testContext,
87946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 const char*		name,
88946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 const char*		description,
89946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 VkImageViewType	imageViewType,
90946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 VkFormat			imageFormat,
91120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 VkFilter			magFilter);
92946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual							~SamplerMagFilterTest	(void) {}
93946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual VkSamplerCreateInfo		getSamplerCreateInfo	(void) const;
94946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
95946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimprivate:
96120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkFilter						m_magFilter;
97946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim};
98946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
99946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimclass SamplerMinFilterTest : public SamplerTest
100946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
101946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimpublic:
102946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim									SamplerMinFilterTest	(tcu::TestContext&	testContext,
103946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 const char*		name,
104946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 const char*		description,
105946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 VkImageViewType	imageViewType,
106946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim															 VkFormat			imageFormat,
107120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 VkFilter			minFilter);
108946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual							~SamplerMinFilterTest	(void) {}
109946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual VkSamplerCreateInfo		getSamplerCreateInfo	(void) const;
110946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
111946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimprivate:
112120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkFilter						m_minFilter;
113946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim};
114946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
115946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimclass SamplerLodTest : public SamplerTest
116946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
117946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimpublic:
118120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim									SamplerLodTest			(tcu::TestContext&		testContext,
119120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 const char*			name,
120120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 const char*			description,
121120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 VkImageViewType		imageViewType,
122120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 VkFormat				imageFormat,
123120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 VkSamplerMipmapMode	mipmapMode,
124120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 float					minLod,
125120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 float					maxLod,
126120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 float					mipLodBias,
127120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim															 float					samplerLod);
128946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual							~SamplerLodTest			(void) {}
129946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual VkSamplerCreateInfo		getSamplerCreateInfo	(void) const;
130946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
131946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimprivate:
132120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkSamplerMipmapMode				m_mipmapMode;
133946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	float							m_minLod;
134946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	float							m_maxLod;
135946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	float							m_mipLodBias;
136946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim};
137946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
138946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimclass SamplerAddressModesTest : public SamplerTest
139946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
140946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimpublic:
141120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim										SamplerAddressModesTest		(tcu::TestContext&		testContext,
142120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 const char*			name,
143120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 const char*			description,
144120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkImageViewType		imageViewType,
145120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkFormat				imageFormat,
146120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkSamplerAddressMode	addressU,
147120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkSamplerAddressMode	addressV,
148120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkSamplerAddressMode	addressW,
149120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim																	 VkBorderColor			borderColor);
150946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual								~SamplerAddressModesTest	(void) {}
151689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	virtual tcu::UVec2					getRenderSize				(VkImageViewType viewType) const;
152946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual std::vector<Vertex4Tex4>	createVertices				(void) const;
153946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	virtual VkSamplerCreateInfo			getSamplerCreateInfo		(void) const;
154946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
155946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimprivate:
156120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkSamplerAddressMode				m_addressU;
157120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkSamplerAddressMode				m_addressV;
158120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	VkSamplerAddressMode				m_addressW;
159946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkBorderColor						m_borderColor;
160946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim};
161946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
162946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
163946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// SamplerTest
164946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
165946bdb68c496154333bb82671f8f26c1cf5da394Dae KimSamplerTest::SamplerTest (tcu::TestContext&	testContext,
166946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  const char*		name,
167946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  const char*		description,
168946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  VkImageViewType	imageViewType,
169946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  VkFormat			imageFormat,
170946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  int				imageSize,
171946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim						  float				samplerLod)
172946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	: vkt::TestCase		(testContext, name, description)
173946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_imageViewType	(imageViewType)
174946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_imageFormat		(imageFormat)
175946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_imageSize		(imageSize)
176946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_samplerLod		(samplerLod)
177946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
178946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
179946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
180946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimvoid SamplerTest::initPrograms (SourceCollections& sourceCollections) const
181946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
182946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	std::ostringstream				vertexSrc;
183946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	std::ostringstream				fragmentSrc;
184946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const char*						texCoordSwizzle	= DE_NULL;
185946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	tcu::TextureFormat				format			= (isCompressedFormat(m_imageFormat)) ? tcu::getUncompressedFormat(mapVkCompressedFormat(m_imageFormat))
186946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																						  : mapVkFormat(m_imageFormat);
187387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	tcu::Vec4						lookupScale;
188387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	tcu::Vec4						lookupBias;
1893a40c1645672ac36c31e4275b9b00ec3effa02c8Pyry Haulos
190387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	getLookupScaleBias(m_imageFormat, lookupScale, lookupBias);
191946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
192946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	switch (m_imageViewType)
193946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
194946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D:
195946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			texCoordSwizzle = "x";
196946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
197946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
198946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D:
199946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			texCoordSwizzle = "xy";
200946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
201946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
202946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:
203946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:
204946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			texCoordSwizzle = "xyz";
205946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
206946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
207946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			texCoordSwizzle = "xyzw";
208946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
209946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		default:
210946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			DE_ASSERT(false);
211946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
212946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
213946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
214946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	vertexSrc << "#version 440\n"
215946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "layout(location = 0) in vec4 position;\n"
216946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "layout(location = 1) in vec4 texCoords;\n"
217946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "layout(location = 0) out highp vec4 vtxTexCoords;\n"
218946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "out gl_PerVertex {\n"
219946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "	vec4 gl_Position;\n"
220946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "};\n"
221946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "void main (void)\n"
222946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "{\n"
223946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "	gl_Position = position;\n"
224946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "	vtxTexCoords = texCoords;\n"
225946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			  << "}\n";
226946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
227946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	fragmentSrc << "#version 440\n"
228946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "layout(set = 0, binding = 0) uniform highp " << getGlslSamplerType(format, m_imageViewType) << " texSampler;\n"
229946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "layout(location = 0) in highp vec4 vtxTexCoords;\n"
230946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "layout(location = 0) out highp vec4 fragColor;\n"
231946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "void main (void)\n"
232946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "{\n"
233946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "	fragColor = ";
234946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
235946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	if (m_samplerLod > 0.0f)
236946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		fragmentSrc << "textureLod(texSampler, vtxTexCoords." << texCoordSwizzle << ", " << std::fixed <<  m_samplerLod << ")";
237946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	else
238946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		fragmentSrc << "texture(texSampler, vtxTexCoords." << texCoordSwizzle << ")" << std::fixed;
239946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
240387999c58e55306e26ea6a8abd371174d35ee640Pyry Haulos	fragmentSrc << " * vec4" << std::scientific << lookupScale << " + vec4" << lookupBias << ";\n"
241946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				<< "}\n";
242946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
243946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	sourceCollections.glslSources.add("tex_vert") << glu::VertexSource(vertexSrc.str());
244946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	sourceCollections.glslSources.add("tex_frag") << glu::FragmentSource(fragmentSrc.str());
245946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
246946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
247946bdb68c496154333bb82671f8f26c1cf5da394Dae KimTestInstance* SamplerTest::createInstance (Context& context) const
248946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
249689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	const tcu::UVec2				renderSize			= getRenderSize(m_imageViewType);
250946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const std::vector<Vertex4Tex4>	vertices			= createVertices();
251946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const VkSamplerCreateInfo		samplerParams		= getSamplerCreateInfo();
25242510ac1f81424905886acd7cf8553207c9772cePyry Haulos	const VkComponentMapping		componentMapping	= { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A };
253946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const VkImageSubresourceRange	subresourceRange	=
254946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
255946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_IMAGE_ASPECT_COLOR_BIT,								// VkImageAspectFlags	aspectMask;
256946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		0u,														// deUint32				baseMipLevel;
257946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		(deUint32)deLog2Floor32(m_imageSize) + 1,				// deUint32				mipLevels;
258946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		0u,														// deUint32				baseArrayLayer;
259946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		(deUint32)SamplerTest::getArraySize(m_imageViewType)	// deUint32				arraySize;
260946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
261946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
262946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
263946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
264946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return new ImageSamplingInstance(context, renderSize, m_imageViewType, m_imageFormat,
265946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim									 getImageSize(m_imageViewType, m_imageSize),
266946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim									 getArraySize(m_imageViewType),
267120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim									 componentMapping, subresourceRange,
268946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim									 samplerParams, m_samplerLod,vertices);
269946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
270946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
271689c095f881a410da6a315795452a8e00ad95a9dPyry Haulostcu::UVec2 SamplerTest::getRenderSize (VkImageViewType viewType) const
272946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
273946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	if (viewType == VK_IMAGE_VIEW_TYPE_1D || viewType == VK_IMAGE_VIEW_TYPE_2D)
274946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
275689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		return tcu::UVec2(16u, 16u);
276946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
277946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	else
278946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
279689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		return tcu::UVec2(16u * 3u, 16u * 2u);
280946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
281946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
282946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
283946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimstd::vector<Vertex4Tex4> SamplerTest::createVertices (void) const
284946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
285812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	std::vector<Vertex4Tex4> vertices = createTestQuadMosaic(m_imageViewType);
286812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	// Adjust texture coordinate to avoid doing NEAREST filtering exactly on texel boundaries.
287812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	// TODO: Would be nice to base this on number of texels and subtexel precision. But this
288812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	// seems to work.
289812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	for (unsigned int i = 0; i < vertices.size(); ++i) {
29034602b69f1b6bcf8c0ec42aa02eb5c761002bd14Dominik Witczak		vertices[i].texCoord += tcu::Vec4(0.002f, 0.002f, 0.002f, 0.0f);
291812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	}
292812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	return vertices;
293946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
294946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
295946bdb68c496154333bb82671f8f26c1cf5da394Dae KimVkSamplerCreateInfo SamplerTest::getSamplerCreateInfo (void) const
296946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
297946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const VkSamplerCreateInfo defaultSamplerParams =
298946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
299120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,									// VkStructureType			sType;
300120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_NULL,																// const void*				pNext;
301120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0u,																		// VkSamplerCreateFlags		flags;
302120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FILTER_NEAREST,														// VkFilter					magFilter;
303120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FILTER_NEAREST,														// VkFilter					minFilter;
304689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		VK_SAMPLER_MIPMAP_MODE_NEAREST,											// VkSamplerMipmapMode		mipmapMode;
305120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,									// VkSamplerAddressMode		addressModeU;
306120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,									// VkSamplerAddressMode		addressModeV;
307120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,									// VkSamplerAddressMode		addressModeW;
308120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0.0f,																	// float					mipLodBias;
309689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		VK_FALSE,																// VkBool32					anisotropyEnable;
310120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		1.0f,																	// float					maxAnisotropy;
311120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		false,																	// VkBool32					compareEnable;
312120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_COMPARE_OP_NEVER,													// VkCompareOp				compareOp;
313120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		0.0f,																	// float					minLod;
314689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		0.25f,																	// float					maxLod;
315120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		getFormatBorderColor(BORDER_COLOR_TRANSPARENT_BLACK, m_imageFormat),	// VkBorderColor			borderColor;
316120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		false																	// VkBool32					unnormalizedCoordinates;
317946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
318946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
319946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return defaultSamplerParams;
320946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
321946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
322946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimstd::string SamplerTest::getGlslSamplerType (const tcu::TextureFormat& format, VkImageViewType type)
323946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
324946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	std::ostringstream samplerType;
325946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
326946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER)
327946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		samplerType << "u";
328946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER)
329946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		samplerType << "i";
330946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
331946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	switch (type)
332946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
333946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D:
334946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "sampler1D";
335946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
336946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
337946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
338946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "sampler1DArray";
339946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
340946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
341946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D:
342946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "sampler2D";
343946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
344946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
345946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
346946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "sampler2DArray";
347946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
348946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
349946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:
350946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "sampler3D";
351946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
352946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
353946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:
354946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "samplerCube";
355946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
356946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
357946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
358946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			samplerType << "samplerCubeArray";
359946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
360946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
361946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		default:
362946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			DE_FATAL("Unknown image view type");
363946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
364946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
365946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
366946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerType.str();
367946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
368946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
369946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimtcu::IVec3 SamplerTest::getImageSize (VkImageViewType viewType, int size)
370946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
371946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	switch (viewType)
372946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
373946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D:
374946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
375946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			return tcu::IVec3(size, 1, 1);
376946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
377946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:
378946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			return tcu::IVec3(size, size, 4);
379946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
380946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		default:
381946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
382946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
383946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
384946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return tcu::IVec3(size, size, 1);
385946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
386946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
387946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimint SamplerTest::getArraySize (VkImageViewType viewType)
388946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
389946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	switch (viewType)
390946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
391946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
392946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
393946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:
394946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			return 6;
395946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
396946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
397946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			return 36;
398946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
399946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		default:
400946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
401946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
402946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
403946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return 1;
404946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
405946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
406946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
407946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// SamplerMagFilterTest
408946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
409946bdb68c496154333bb82671f8f26c1cf5da394Dae KimSamplerMagFilterTest::SamplerMagFilterTest (tcu::TestContext&	testContext,
410946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											const char*			name,
411946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											const char*			description,
412946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											VkImageViewType		imageViewType,
413946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											VkFormat			imageFormat,
414120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											VkFilter			magFilter)
415946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	: SamplerTest	(testContext, name, description, imageViewType, imageFormat, 8, 0.0f)
416946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_magFilter	(magFilter)
417946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
418946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
419946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
420946bdb68c496154333bb82671f8f26c1cf5da394Dae KimVkSamplerCreateInfo SamplerMagFilterTest::getSamplerCreateInfo (void) const
421946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
422946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkSamplerCreateInfo samplerParams = SamplerTest::getSamplerCreateInfo();
423946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.magFilter = m_magFilter;
424946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
425946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerParams;
426946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
427946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
428946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
429946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// SamplerMinFilterTest
430946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
431946bdb68c496154333bb82671f8f26c1cf5da394Dae KimSamplerMinFilterTest::SamplerMinFilterTest (tcu::TestContext&	testContext,
432946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											const char*			name,
433946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											const char*			description,
434946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											VkImageViewType		imageViewType,
435946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim											VkFormat			imageFormat,
436120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim											VkFilter			minFilter)
437946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	: SamplerTest	(testContext, name, description, imageViewType, imageFormat, 32, 0.0f)
438946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_minFilter	(minFilter)
439946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
440946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
441946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
442946bdb68c496154333bb82671f8f26c1cf5da394Dae KimVkSamplerCreateInfo SamplerMinFilterTest::getSamplerCreateInfo (void) const
443946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
444946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkSamplerCreateInfo samplerParams = SamplerTest::getSamplerCreateInfo();
445946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.minFilter = m_minFilter;
446812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	// set minLod to epsilon, to force use of the minFilter
447812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	samplerParams.minLod = 0.01f;
448946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
449946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerParams;
450946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
451946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
452946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
453946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// SamplerLodTest
454946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
455946bdb68c496154333bb82671f8f26c1cf5da394Dae KimSamplerLodTest::SamplerLodTest (tcu::TestContext&	testContext,
456946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								const char*			name,
457946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								const char*			description,
458946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								VkImageViewType		imageViewType,
459946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								VkFormat			imageFormat,
460120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim								VkSamplerMipmapMode	mipmapMode,
461946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								float				minLod,
462946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								float				maxLod,
463946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								float				mipLodBias,
464946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim								float				samplerLod)
465946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	: SamplerTest	(testContext, name, description, imageViewType, imageFormat, 32, samplerLod)
466120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	, m_mipmapMode	(mipmapMode)
467946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_minLod		(minLod)
468946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_maxLod		(maxLod)
469946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_mipLodBias	(mipLodBias)
470946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
471946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
472946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
473946bdb68c496154333bb82671f8f26c1cf5da394Dae KimVkSamplerCreateInfo SamplerLodTest::getSamplerCreateInfo (void) const
474946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
475946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkSamplerCreateInfo samplerParams = SamplerTest::getSamplerCreateInfo();
476946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
477120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	samplerParams.mipmapMode	= m_mipmapMode;
478946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.minLod		= m_minLod;
479946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.maxLod		= m_maxLod;
480946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.mipLodBias	= m_mipLodBias;
481946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
482946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerParams;
483946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
484946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
485946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
486946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// SamplerAddressModesTest
487946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
488120ed2c44030b05409d5b1164a0676389dfe87c3Dae KimSamplerAddressModesTest::SamplerAddressModesTest (tcu::TestContext&		testContext,
489120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  const char*			name,
490120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  const char*			description,
491120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkImageViewType		imageViewType,
492120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkFormat				imageFormat,
493120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkSamplerAddressMode	addressU,
494120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkSamplerAddressMode	addressV,
495120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkSamplerAddressMode	addressW,
496120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim												  VkBorderColor			borderColor)
497946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	: SamplerTest	(testContext, name, description, imageViewType, imageFormat, 8, 0.0f)
498946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_addressU	(addressU)
499946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_addressV	(addressV)
500946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_addressW	(addressW)
501946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	, m_borderColor	(borderColor)
502946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
503946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
504946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
505689c095f881a410da6a315795452a8e00ad95a9dPyry Haulostcu::UVec2 SamplerAddressModesTest::getRenderSize (VkImageViewType viewType) const
506946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
507689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos	return 4u * SamplerTest::getRenderSize(viewType);
508946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
509946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
510946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimstd::vector<Vertex4Tex4> SamplerAddressModesTest::createVertices (void) const
511946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
512946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	std::vector<Vertex4Tex4> vertices = SamplerTest::createVertices();
513946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
514946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	switch (m_imageViewType)
515946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
516946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_1D: case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
517946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++)
518946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				vertices[vertexNdx].texCoord.x() = (vertices[vertexNdx].texCoord.x() - 0.5f) * 4.0f;
519946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
520946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
521946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
522946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D:
523946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
524946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++)
525946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				vertices[vertexNdx].texCoord.xy() = (vertices[vertexNdx].texCoord.swizzle(0, 1) - tcu::Vec2(0.5f)) * 4.0f;
526946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
527946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
528946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
529946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_3D:
530946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			for (size_t vertexNdx = 0; vertexNdx < vertices.size(); vertexNdx++)
531946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				vertices[vertexNdx].texCoord.xyz() = (vertices[vertexNdx].texCoord.swizzle(0, 1, 2) - tcu::Vec3(0.5f)) * 4.0f;
532946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
533946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
534946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
535946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE:
536946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
537946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			break;
538946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
539946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		default:
540946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			DE_ASSERT(false);
541946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
542946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
543946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return vertices;
544946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
545946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
546946bdb68c496154333bb82671f8f26c1cf5da394Dae KimVkSamplerCreateInfo SamplerAddressModesTest::getSamplerCreateInfo (void) const
547946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
548946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	VkSamplerCreateInfo samplerParams = SamplerTest::getSamplerCreateInfo();
549946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.addressModeU	= m_addressU;
550946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.addressModeV	= m_addressV;
551946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.addressModeW	= m_addressW;
552946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerParams.borderColor	= m_borderColor;
553946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
554946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerParams;
555946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
556946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
557946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
558946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim// Utilities to create test nodes
559946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
560946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimstd::string getFormatCaseName (const VkFormat format)
561946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
562946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const std::string fullName = getFormatName(format);
563946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
564946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	DE_ASSERT(de::beginsWith(fullName, "VK_FORMAT_"));
565946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
566946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return de::toLower(fullName.substr(10));
567946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
568946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
569946bdb68c496154333bb82671f8f26c1cf5da394Dae KimMovePtr<tcu::TestCaseGroup> createSamplerMagFilterTests (tcu::TestContext& testCtx, VkImageViewType imageViewType, VkFormat imageFormat)
570946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
571946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> samplerMagFilterTests (new tcu::TestCaseGroup(testCtx, "mag_filter", "Tests for magnification filter"));
572946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
573812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	if (isCompressedFormat(imageFormat) || (!isIntFormat(imageFormat) && !isUintFormat(imageFormat)))
574812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz		samplerMagFilterTests->addChild(new SamplerMagFilterTest(testCtx, "linear", "Magnifies image using VK_TEX_FILTER_LINEAR", imageViewType, imageFormat, VK_FILTER_LINEAR));
575120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	samplerMagFilterTests->addChild(new SamplerMagFilterTest(testCtx, "nearest", "Magnifies image using VK_TEX_FILTER_NEAREST", imageViewType, imageFormat, VK_FILTER_NEAREST));
576946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
577946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerMagFilterTests;
578946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
579946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
580946bdb68c496154333bb82671f8f26c1cf5da394Dae KimMovePtr<tcu::TestCaseGroup> createSamplerMinFilterTests (tcu::TestContext& testCtx, VkImageViewType imageViewType, VkFormat imageFormat)
581946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
582946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> samplerMinFilterTests (new tcu::TestCaseGroup(testCtx, "min_filter", "Tests for minification filter"));
583946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
584812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	if (isCompressedFormat(imageFormat) || (!isIntFormat(imageFormat) && !isUintFormat(imageFormat)))
585812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz		samplerMinFilterTests->addChild(new SamplerMinFilterTest(testCtx, "linear", "Minifies image using VK_TEX_FILTER_LINEAR", imageViewType, imageFormat, VK_FILTER_LINEAR));
586120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	samplerMinFilterTests->addChild(new SamplerMinFilterTest(testCtx, "nearest", "Minifies image using VK_TEX_FILTER_NEAREST", imageViewType, imageFormat, VK_FILTER_NEAREST));
587946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
588946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerMinFilterTests;
589946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
590946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
591120ed2c44030b05409d5b1164a0676389dfe87c3Dae KimMovePtr<tcu::TestCaseGroup> createSamplerLodTests (tcu::TestContext& testCtx, VkImageViewType imageViewType, VkFormat imageFormat, VkSamplerMipmapMode mipmapMode)
592946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
593946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	struct TestCaseConfig
594946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
595946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const char*	name;
596946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const char*	description;
597946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		float		minLod;
598946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		float		maxLod;
599946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		float		mipLodBias;
600946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		float		lod;
601946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
602946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
603946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	TestCaseConfig testCaseConfigs [] =
604946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
605946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "equal_min_3_max_3",		"minLod = 3, maxLod = 3, mipLodBias = 0, lod = 0",		3.0f, 3.0f, 0.0f, 0.0f },
606946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_min_1",			"minLod = 1, maxLod = 5, mipLodBias = 0, lod = 0",		1.0f, 5.0f, 0.0f, 0.0f },
607946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_max_4",			"minLod = 0, maxLod = 4, mipLodBias = 0, lod = 5",		0.0f, 4.0f, 0.0f, 5.0f },
608946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_bias_2_1",		"minLod = 0, maxLod = 2.1, mipLodBias = 5.0, lod = 0",	0.0f, 2.1f, 5.0f, 0.0f },
609946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_bias_2_5",		"minLod = 0, maxLod = 5, mipLodBias = 2.5, lod = 0",	0.0f, 5.0f, 2.5f, 0.00001f },
610946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_bias_3_1",		"minLod = 0, maxLod = 5, mipLodBias = -0.9, lod = 4.0",	0.0f, 5.0f, -0.9f, 4.0f },
611946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ "select_bias_3_7",		"minLod = 0, maxLod = 5, mipLodBias = 3.0, lod = 0.7",	0.0f, 5.0f, 3.0f, 0.7f },
612946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
613946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
614946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> samplerLodTests (new tcu::TestCaseGroup(testCtx, "lod", "Tests for sampler LOD"));
615946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
616946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testCaseConfigs); configNdx++)
617946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
618946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const TestCaseConfig& config = testCaseConfigs[configNdx];
619946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
620946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		samplerLodTests->addChild(new SamplerLodTest(testCtx, config.name, config.description, imageViewType, imageFormat, mipmapMode, config.minLod, config.maxLod, config.mipLodBias, config.lod));
621946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
622946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
623946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerLodTests;
624946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
625946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
626946bdb68c496154333bb82671f8f26c1cf5da394Dae KimMovePtr<tcu::TestCaseGroup> createSamplerMipmapTests (tcu::TestContext& testCtx, VkImageViewType imageViewType, VkFormat imageFormat)
627946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
628946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> samplerMipmapTests (new tcu::TestCaseGroup(testCtx, "mipmap", "Tests for mipmap modes"));
629946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
630946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	// Mipmap mode: nearest
631946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> mipmapNearestTests (new tcu::TestCaseGroup(testCtx, "nearest", "Uses VK_TEX_MIPMAP_MODE_NEAREST"));
632120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim	mipmapNearestTests->addChild(createSamplerLodTests(testCtx, imageViewType, imageFormat, VK_SAMPLER_MIPMAP_MODE_NEAREST).release());
633946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerMipmapTests->addChild(mipmapNearestTests.release());
634946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
635946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	// Mipmap mode: linear
636812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	if (isCompressedFormat(imageFormat) || (!isIntFormat(imageFormat) && !isUintFormat(imageFormat)))
637812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	{
638812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz		MovePtr<tcu::TestCaseGroup> mipmapLinearTests(new tcu::TestCaseGroup(testCtx, "linear", "Uses VK_TEX_MIPMAP_MODE_LINEAR"));
639812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz		mipmapLinearTests->addChild(createSamplerLodTests(testCtx, imageViewType, imageFormat, VK_SAMPLER_MIPMAP_MODE_LINEAR).release());
640812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz		samplerMipmapTests->addChild(mipmapLinearTests.release());
641812054568e397caf9a7bd6b76b827f7a440610ceJeff Bolz	}
642946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
643946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerMipmapTests;
644946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
645946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
646120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kimstd::string getAddressModesCaseName (VkSamplerAddressMode u, VkSamplerAddressMode v, VkSamplerAddressMode w, BorderColor border)
647946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
648946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	static const char* borderColorNames[BORDER_COLOR_COUNT] =
649946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
650946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		"opaque_black",
651946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		"opaque_white",
652946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		"transparent_black",
653946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
654946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
655946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	std::ostringstream caseName;
656946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
657946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	if (u == v && v == w)
658946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
659120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const std::string fullName = getSamplerAddressModeName(u);
660120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(de::beginsWith(fullName, "VK_SAMPLER_ADDRESS_"));
661946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
662946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		caseName << "all_";
663120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		caseName << de::toLower(fullName.substr(19));
664946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
665120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		if (u == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)
666946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{
667946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			caseName << "_" << borderColorNames[border];
668946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		}
669946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
670946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	else
671946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
672120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const std::string fullNameU = getSamplerAddressModeName(u);
673120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const std::string fullNameV = getSamplerAddressModeName(v);
674120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		const std::string fullNameW = getSamplerAddressModeName(w);
675946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
676120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(de::beginsWith(fullNameU, "VK_SAMPLER_ADDRESS_"));
677120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(de::beginsWith(fullNameV, "VK_SAMPLER_ADDRESS_"));
678120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		DE_ASSERT(de::beginsWith(fullNameW, "VK_SAMPLER_ADDRESS_"));
679946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
680946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		caseName << "uvw"
681120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				 << "_" << de::toLower(fullNameU.substr(19))
682120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				 << "_" << de::toLower(fullNameV.substr(19))
683120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim				 << "_" << de::toLower(fullNameW.substr(19));
684946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
685946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
686946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return caseName.str();
687946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
688946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
689946bdb68c496154333bb82671f8f26c1cf5da394Dae KimMovePtr<tcu::TestCaseGroup> createSamplerAddressModesTests (tcu::TestContext& testCtx, VkImageViewType imageViewType, VkFormat imageFormat)
690946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
691946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	struct TestCaseConfig
692946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
693120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VkSamplerAddressMode	u;
694120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VkSamplerAddressMode	v;
695120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VkSamplerAddressMode	w;
696120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		BorderColor				border;
697946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
698946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
699946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const TestCaseConfig testCaseConfigs[] =
700946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
701946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// All address modes equal
702120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_TRANSPARENT_BLACK },
703120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_REPEAT,				VK_SAMPLER_ADDRESS_MODE_REPEAT,					VK_SAMPLER_ADDRESS_MODE_REPEAT,					BORDER_COLOR_TRANSPARENT_BLACK },
704120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		BORDER_COLOR_TRANSPARENT_BLACK },
705120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_TRANSPARENT_BLACK },
706946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
707946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// All address modes equal using border color
708120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_TRANSPARENT_BLACK },
709120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_BLACK },
710120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_WHITE },
711946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
712946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Pairwise combinations of address modes not covered by previous tests
713120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_REPEAT,					BORDER_COLOR_OPAQUE_WHITE},
714120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_OPAQUE_WHITE },
715120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_REPEAT,					VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		BORDER_COLOR_OPAQUE_WHITE },
716120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_OPAQUE_WHITE },
717120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		BORDER_COLOR_OPAQUE_WHITE },
718120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_WHITE },
719120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_REPEAT,					BORDER_COLOR_OPAQUE_WHITE },
720120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_OPAQUE_WHITE },
721120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_REPEAT,					VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_OPAQUE_WHITE },
722120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_OPAQUE_WHITE },
723120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_REPEAT,				VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_OPAQUE_WHITE },
724120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_REPEAT,					VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_WHITE },
725120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_REPEAT,					BORDER_COLOR_OPAQUE_WHITE },
726120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_REPEAT,				VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_OPAQUE_WHITE },
727120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_REPEAT,				VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_WHITE },
728120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_REPEAT,				VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		BORDER_COLOR_OPAQUE_WHITE },
729120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_OPAQUE_WHITE },
730120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		BORDER_COLOR_OPAQUE_WHITE },
731120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,		VK_SAMPLER_ADDRESS_MODE_REPEAT,					BORDER_COLOR_OPAQUE_WHITE },
732120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_REPEAT,					VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	BORDER_COLOR_OPAQUE_WHITE },
733120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,			BORDER_COLOR_OPAQUE_WHITE },
734120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		{ VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,		VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,	VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,		BORDER_COLOR_OPAQUE_WHITE },
735946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
736946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
737946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	MovePtr<tcu::TestCaseGroup> samplerAddressModesTests (new tcu::TestCaseGroup(testCtx, "address_modes", "Tests for address modes"));
738946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
739946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	for (int configNdx = 0; configNdx < DE_LENGTH_OF_ARRAY(testCaseConfigs); configNdx++)
740946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
741946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const TestCaseConfig& config = testCaseConfigs[configNdx];
742946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
743946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		samplerAddressModesTests->addChild(new SamplerAddressModesTest(testCtx,
744946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   getAddressModesCaseName(config.u, config.v, config.w, config.border).c_str(),
745946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   "",
746946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   imageViewType,
747946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   imageFormat,
748946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   config.u, config.v, config.w,
749946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																	   getFormatBorderColor(config.border, imageFormat)));
750946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
751946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
752946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerAddressModesTests;
753946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
754946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
755946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim} // anonymous
756946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
757946bdb68c496154333bb82671f8f26c1cf5da394Dae Kimtcu::TestCaseGroup* createSamplerTests (tcu::TestContext& testCtx)
758946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim{
759946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const struct
760946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
761946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VkImageViewType		type;
762946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const char*			name;
763946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
764946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	imageViewTypes[] =
765946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
766946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_1D,			"1d" },
767946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_1D_ARRAY,		"1d_array" },
768946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_2D,			"2d" },
769946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_2D_ARRAY,		"2d_array" },
770946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_3D,			"3d" },
771946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_CUBE,			"cube" },
772946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{ VK_IMAGE_VIEW_TYPE_CUBE_ARRAY,	"cube_array" }
773946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
774946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
775946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	const VkFormat formats[] =
776946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
777946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Packed formats
778120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_R4G4_UNORM_PACK8,
779120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_R4G4B4A4_UNORM_PACK16,
780120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_R5G6B5_UNORM_PACK16,
781120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_R5G5B5A1_UNORM_PACK16,
782120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_A2B10G10R10_UNORM_PACK32,
783120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_A2R10G10B10_UINT_PACK32,
784120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_B10G11R11_UFLOAT_PACK32,
785120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
786120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_B4G4R4A4_UNORM_PACK16,
787120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_B5G5R5A1_UNORM_PACK16,
788946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
789946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Pairwise combinations of 8-bit channel formats, UNORM/SNORM/SINT/UINT/SRGB type x 1-to-4 channels x RGBA/BGRA order
790946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8_SRGB,
791946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8_UINT,
792946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8A8_SINT,
793946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8_UNORM,
794946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8_SNORM,
795946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8A8_SNORM,
796946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8_UINT,
797946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8_SINT,
798946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8A8_SRGB,
799946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8A8_UNORM,
800946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8A8_UNORM,
801946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8_SRGB,
802946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8_SRGB,
803946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8_UINT,
804946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8A8_UINT,
805946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8_SINT,
806946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8_SNORM,
807946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8_SINT,
808946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8_SNORM,
809946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_B8G8R8_UNORM,
810946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8_UNORM,
811946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
812946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Pairwise combinations of 16/32-bit channel formats x SINT/UINT/SFLOAT type x 1-to-4 channels
813946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R32G32_SFLOAT,
814946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R32G32B32_UINT,
815946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16G16B16A16_SFLOAT,
816946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16G16_UINT,
817946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R32G32B32A32_SINT,
818946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16G16B16_SINT,
819946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16_SFLOAT,
820946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R32_SINT,
821946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R32_UINT,
822946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16G16B16_SFLOAT,
823946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R16G16_SINT,
824946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
825946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Scaled formats
826946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		VK_FORMAT_R8G8B8A8_SSCALED,
827120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_A2R10G10B10_USCALED_PACK32,
828946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
829946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		// Compressed formats
830120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
831120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
832120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
833120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
834120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
835120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
836120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_EAC_R11_UNORM_BLOCK,
837120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_EAC_R11_SNORM_BLOCK,
838120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
839120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
840120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
841120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
842120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
843120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
844120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
845120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
846120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
847120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
848120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
849120ed2c44030b05409d5b1164a0676389dfe87c3Dae Kim		VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
850946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	};
851946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
852946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	de::MovePtr<tcu::TestCaseGroup> samplerTests		(new tcu::TestCaseGroup(testCtx, "sampler", "Sampler tests"));
853946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	de::MovePtr<tcu::TestCaseGroup> viewTypeTests		(new tcu::TestCaseGroup(testCtx, "view_type", ""));
854946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
855946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	for (int viewTypeNdx = 0; viewTypeNdx < DE_LENGTH_OF_ARRAY(imageViewTypes); viewTypeNdx++)
856946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	{
857946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		const VkImageViewType			viewType		= imageViewTypes[viewTypeNdx].type;
858946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		de::MovePtr<tcu::TestCaseGroup>	viewTypeGroup	(new tcu::TestCaseGroup(testCtx, imageViewTypes[viewTypeNdx].name, (std::string("Uses a ") + imageViewTypes[viewTypeNdx].name + " view").c_str()));
859946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		de::MovePtr<tcu::TestCaseGroup>	formatTests		(new tcu::TestCaseGroup(testCtx, "format", "Tests samplable formats"));
860946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
861946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(formats); formatNdx++)
862946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		{
863946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			const VkFormat	format			= formats[formatNdx];
864946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			const bool		isCompressed	= isCompressedFormat(format);
865946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
86603fe05c46eb7bc19a046622528332e7d3ccfd778Dae Kim			if (isCompressed)
867946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			{
868946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				// Do not use compressed formats with 1D and 1D array textures.
86903fe05c46eb7bc19a046622528332e7d3ccfd778Dae Kim				if (viewType == VK_IMAGE_VIEW_TYPE_1D || viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY)
87003fe05c46eb7bc19a046622528332e7d3ccfd778Dae Kim					break;
871946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			}
872946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
873946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			de::MovePtr<tcu::TestCaseGroup>	formatGroup	(new tcu::TestCaseGroup(testCtx,
874946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																				getFormatCaseName(format).c_str(),
875946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim																				(std::string("Samples a texture of format ") + getFormatName(format)).c_str()));
876946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
877946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			if (!isCompressed)
878946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			{
879946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				// Do not include minFilter tests with compressed formats.
880946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				// Randomly generated compressed textures are too noisy and will derive in false positives.
881946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				de::MovePtr<tcu::TestCaseGroup>	minFilterTests		= createSamplerMinFilterTests(testCtx, viewType, format);
882946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				formatGroup->addChild(minFilterTests.release());
883946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			}
884946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
885946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			de::MovePtr<tcu::TestCaseGroup>	magFilterTests		= createSamplerMagFilterTests(testCtx, viewType, format);
886946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			de::MovePtr<tcu::TestCaseGroup>	mipmapTests			= createSamplerMipmapTests(testCtx, viewType, format);
887946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
888946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			formatGroup->addChild(magFilterTests.release());
889946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			formatGroup->addChild(mipmapTests.release());
890946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
891946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			if (viewType != VK_IMAGE_VIEW_TYPE_CUBE && viewType != VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
892946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			{
893946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				de::MovePtr<tcu::TestCaseGroup>	addressModesTests	= createSamplerAddressModesTests(testCtx, viewType, format);
894946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim				formatGroup->addChild(addressModesTests.release());
895946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			}
896946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
897946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim			formatTests->addChild(formatGroup.release());
898946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		}
899946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
900946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		viewTypeGroup->addChild(formatTests.release());
901946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim		viewTypeTests->addChild(viewTypeGroup.release());
902946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	}
903946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
904946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	samplerTests->addChild(viewTypeTests.release());
905946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
906946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim	return samplerTests.release();
907946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim}
908946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim
909946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim} // pipeline
910946bdb68c496154333bb82671f8f26c1cf5da394Dae Kim} // vkt
911