• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _VKTTEXTURETESTUTIL_HPP
2 #define _VKTTEXTURETESTUTIL_HPP
3 /*------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2016 The Khronos Group Inc.
8  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
9  * Copyright (c) 2014 The Android Open Source Project
10  *
11  * Licensed under the Apache License, Version 2.0 (the "License");
12  * you may not use this file except in compliance with the License.
13  * You may obtain a copy of the License at
14  *
15  *      http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  * See the License for the specific language governing permissions and
21  * limitations under the License.
22  *
23  *//*!
24  * \file
25  * \brief Texture test utilities.
26  *
27  * About coordinates:
28  *  + Quads consist of 2 triangles, rendered using explicit indices.
29  *  + All TextureTestUtil functions and classes expect texture coordinates
30  *    for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
31  *//*--------------------------------------------------------------------*/
32 
33 #include "tcuDefs.hpp"
34 #include "tcuSurface.hpp"
35 
36 #include "vkDefs.hpp"
37 #include "vktTestCase.hpp"
38 
39 #include "gluShaderProgram.hpp"
40 #include "gluTextureTestUtil.hpp"
41 #include "deSharedPtr.hpp"
42 
43 #include "../pipeline/vktPipelineImageUtil.hpp"
44 
45 namespace vkt
46 {
47 
48 namespace texture
49 {
50 
51 namespace util
52 {
53 
54 enum Program
55 {
56 	PROGRAM_2D_FLOAT = 0,
57 	PROGRAM_2D_INT,
58 	PROGRAM_2D_UINT,
59 	PROGRAM_2D_SHADOW,
60 
61 	PROGRAM_2D_FLOAT_BIAS,
62 	PROGRAM_2D_INT_BIAS,
63 	PROGRAM_2D_UINT_BIAS,
64 	PROGRAM_2D_SHADOW_BIAS,
65 
66 	PROGRAM_1D_FLOAT,
67 	PROGRAM_1D_INT,
68 	PROGRAM_1D_UINT,
69 	PROGRAM_1D_SHADOW,
70 
71 	PROGRAM_1D_FLOAT_BIAS,
72 	PROGRAM_1D_INT_BIAS,
73 	PROGRAM_1D_UINT_BIAS,
74 	PROGRAM_1D_SHADOW_BIAS,
75 
76 	PROGRAM_CUBE_FLOAT,
77 	PROGRAM_CUBE_INT,
78 	PROGRAM_CUBE_UINT,
79 	PROGRAM_CUBE_SHADOW,
80 
81 	PROGRAM_CUBE_FLOAT_BIAS,
82 	PROGRAM_CUBE_INT_BIAS,
83 	PROGRAM_CUBE_UINT_BIAS,
84 	PROGRAM_CUBE_SHADOW_BIAS,
85 
86 	PROGRAM_1D_ARRAY_FLOAT,
87 	PROGRAM_1D_ARRAY_INT,
88 	PROGRAM_1D_ARRAY_UINT,
89 	PROGRAM_1D_ARRAY_SHADOW,
90 
91 	PROGRAM_2D_ARRAY_FLOAT,
92 	PROGRAM_2D_ARRAY_INT,
93 	PROGRAM_2D_ARRAY_UINT,
94 	PROGRAM_2D_ARRAY_SHADOW,
95 
96 	PROGRAM_3D_FLOAT,
97 	PROGRAM_3D_INT,
98 	PROGRAM_3D_UINT,
99 
100 	PROGRAM_3D_FLOAT_BIAS,
101 	PROGRAM_3D_INT_BIAS,
102 	PROGRAM_3D_UINT_BIAS,
103 
104 	PROGRAM_CUBE_ARRAY_FLOAT,
105 	PROGRAM_CUBE_ARRAY_INT,
106 	PROGRAM_CUBE_ARRAY_UINT,
107 	PROGRAM_CUBE_ARRAY_SHADOW,
108 
109 	PROGRAM_BUFFER_FLOAT,
110 	PROGRAM_BUFFER_INT,
111 	PROGRAM_BUFFER_UINT,
112 
113 	PROGRAM_LAST
114 };
115 
116 void initializePrograms(vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs);
117 
118 typedef de::SharedPtr<pipeline::TestTexture>		TestTextureSp;
119 typedef de::SharedPtr<pipeline::TestTexture2D>		TestTexture2DSp;
120 typedef de::SharedPtr<pipeline::TestTextureCube>	TestTextureCubeSp;
121 typedef de::SharedPtr<pipeline::TestTexture2DArray>	TestTexture2DArraySp;
122 typedef de::SharedPtr<pipeline::TestTexture3D>		TestTexture3DSp;
123 
124 class TextureBinding {
125 public:
126 	enum Type
127 	{
128 		TYPE_NONE = 0,
129 		TYPE_2D,
130 		TYPE_CUBE_MAP,
131 		TYPE_2D_ARRAY,
132 		TYPE_3D,
133 
134 		TYPE_LAST
135 	};
136 										TextureBinding				(Context& context);
137 										TextureBinding				(Context& context, const TestTextureSp& textureData, const Type type);
getImage(void)138 	vk::VkImage							getImage					(void) { return *m_textureImage; }
getImageView(void)139 	vk::VkImageView						getImageView				(void) { return *m_textureImageView; }
getType(void)140 	Type								getType						(void) { return m_type; }
getTestTexture(void)141 	const pipeline::TestTexture&		getTestTexture				(void) { return *m_textureData; }
142 	void								updateTextureViewMipLevels	(deUint32 baseLevel, deUint32 maxLevel);
143 
144 private:
145 										TextureBinding				(const TextureBinding&);	// not allowed!
146 	TextureBinding&						operator=					(const TextureBinding&);	// not allowed!
147 
148 	void								updateTextureData			(const TestTextureSp& textureData, const Type type);
149 
150 	Context&							m_context;
151 	Type								m_type;
152 	TestTextureSp						m_textureData;
153 	vk::Move<vk::VkImage>				m_textureImage;
154 	de::MovePtr<vk::Allocation>			m_textureImageMemory;
155 	vk::Move<vk::VkImageView>			m_textureImageView;
156 };
157 
158 typedef de::SharedPtr<TextureBinding>	TextureBindingSp;
159 
160 class TextureRenderer
161 {
162 public:
163 										TextureRenderer				(Context& context, vk::VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight);
164 										~TextureRenderer			(void);
165 
166 	void								renderQuad					(tcu::Surface& result, int texUnit, const float* texCoord, glu::TextureTestUtil::TextureType texType);
167 	void								renderQuad					(tcu::Surface& result, int texUnit, const float* texCoord, const glu::TextureTestUtil::ReferenceParams& params);
168 	void								renderQuad					(tcu::Surface&									result,
169 																	 const float*									positions,
170 																	 const int										texUnit,
171 																	 const float*									texCoord,
172 																	 const glu::TextureTestUtil::ReferenceParams&	params,
173 																	 const float									maxAnisotropy);
174 
175 	void								clearImage					(vk::VkImage image);
176 	void								add2DTexture				(const TestTexture2DSp& texture);
177 	const pipeline::TestTexture2D&		get2DTexture				(int textureIndex) const;
178 
179 	void								addCubeTexture				(const TestTextureCubeSp& texture);
180 	const pipeline::TestTextureCube&	getCubeTexture				(int textureIndex) const;
181 
182 	void								add2DArrayTexture			(const TestTexture2DArraySp& texture);
183 	const pipeline::TestTexture2DArray&	get2DArrayTexture			(int textureIndex) const;
184 
185 	void								add3DTexture				(const TestTexture3DSp& texture);
186 	const pipeline::TestTexture3D&		get3DTexture				(int textureIndex) const;
187 
188 	void								setViewport					(float viewportX, float viewportY, float viewportW, float viewportH);
189 
190 	TextureBinding*						getTextureBinding			(int textureIndex) const;
191 
192 	deUint32							getRenderWidth				(void) const;
193 	deUint32							getRenderHeight				(void) const;
194 
195 protected:
196 										TextureRenderer				(const TextureRenderer& other);
197 	TextureRenderer&					operator=					(const TextureRenderer& other);
198 
199 	Context&							m_context;
200 	tcu::TestLog&						m_log;
201 
202 	const deUint32						m_renderWidth;
203 	const deUint32						m_renderHeight;
204 	const vk::VkSampleCountFlagBits		m_sampleCount;
205 	const deBool						m_multisampling;
206 
207 	const vk::VkFormat					m_imageFormat;
208 	const tcu::TextureFormat			m_textureFormat;
209 
210 	vk::Move<vk::VkImage>				m_image;
211 	de::MovePtr<vk::Allocation>			m_imageMemory;
212 	vk::Move<vk::VkImageView>			m_imageView;
213 
214 	vk::Move<vk::VkImage>				m_resolvedImage;
215 	de::MovePtr<vk::Allocation>			m_resolvedImageMemory;
216 	vk::Move<vk::VkImageView>			m_resolvedImageView;
217 
218 	vk::Move<vk::VkCommandPool>			m_commandPool;
219 	vk::Move<vk::VkRenderPass>			m_renderPass;
220 	vk::Move<vk::VkFramebuffer>			m_frameBuffer;
221 
222 	vk::Move<vk::VkDescriptorPool>		m_descriptorPool;
223 
224 	vk::Move<vk::VkBuffer>				m_uniformBuffer;
225 	de::MovePtr<vk::Allocation>			m_uniformBufferMemory;
226 	const vk::VkDeviceSize				m_uniformBufferSize;
227 
228 	vk::Move<vk::VkBuffer>				m_vertexIndexBuffer;
229 	de::MovePtr<vk::Allocation>			m_vertexIndexBufferMemory;
230 	static const vk::VkDeviceSize		s_vertexIndexBufferSize;
231 	static const deUint16				s_vertexIndices[6];
232 
233 	vk::Move<vk::VkFence>				m_fence;
234 
235 	vk::Move<vk::VkBuffer>				m_resultBuffer;
236 	de::MovePtr<vk::Allocation>			m_resultBufferMemory;
237 	const vk::VkDeviceSize				m_resultBufferSize;
238 
239 	std::vector<TextureBindingSp>		m_textureBindings;
240 
241 	float								m_viewportOffsetX;
242 	float								m_viewportOffsetY;
243 	float								m_viewportWidth;
244 	float								m_viewportHeight;
245 
246 private:
247 	vk::Move<vk::VkDescriptorSet>		makeDescriptorSet			(const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout) const;
248 	void								addImageTransitionBarrier	(vk::VkCommandBuffer commandBuffer, vk::VkImage image, vk::VkPipelineStageFlags srcStageMask, vk::VkPipelineStageFlags dstStageMask, vk::VkAccessFlags srcAccessMask, vk::VkAccessFlags dstAccessMask, vk::VkImageLayout oldLayout, vk::VkImageLayout newLayout) const;
249 
250 };
251 
252 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
253 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
254 tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode);
255 
256 TestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames);
257 TestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames);
258 
259 template <typename INSTANCE_TYPE>
260 class TextureTestCase : public TestCase
261 {
262 public:
TextureTestCase(tcu::TestContext & context,const std::string & name,const std::string & description,const typename INSTANCE_TYPE::ParameterType & testParameters)263 										TextureTestCase	(tcu::TestContext& context, const std::string& name, const std::string& description, const typename INSTANCE_TYPE::ParameterType& testParameters)
264 												: TestCase				(context, name, description)
265 												, m_testsParameters		(testParameters)
266 										{}
267 
createInstance(Context & context) const268 	virtual TestInstance*				createInstance				(Context& context) const
269 										{
270 											return new INSTANCE_TYPE(context, m_testsParameters);
271 										}
272 
initPrograms(vk::SourceCollections & programCollection) const273 	virtual void						initPrograms				(vk::SourceCollections& programCollection) const
274 										{
275 											initializePrograms(programCollection, m_testsParameters.texCoordPrecision, m_testsParameters.programs);
276 										}
277 
278 protected:
279 	const typename INSTANCE_TYPE::ParameterType m_testsParameters;
280 };
281 
282 struct TextureCommonTestCaseParameters
283 {
284 								TextureCommonTestCaseParameters	(void);
285 
286 	vk::VkSampleCountFlagBits	sampleCount;
287 	glu::Precision				texCoordPrecision;
288 
289 	tcu::Sampler::FilterMode	minFilter;
290 	tcu::Sampler::FilterMode	magFilter;
291 	tcu::Sampler::WrapMode		wrapS;
292 	tcu::Sampler::WrapMode		wrapT;
293 
294 	vk::VkFormat				format;
295 
296 	std::vector<util::Program>	programs;
297 };
298 
299 struct Texture2DTestCaseParameters : public TextureCommonTestCaseParameters
300 {
301 								Texture2DTestCaseParameters		(void);
302 	int							width;
303 	int							height;
304 };
305 
306 struct TextureCubeTestCaseParameters : public TextureCommonTestCaseParameters
307 {
308 								TextureCubeTestCaseParameters	(void);
309 	int							size;
310 };
311 
312 struct Texture2DArrayTestCaseParameters : public Texture2DTestCaseParameters
313 {
314 								Texture2DArrayTestCaseParameters(void);
315 	int							numLayers;
316 };
317 
318 struct Texture3DTestCaseParameters : public Texture2DTestCaseParameters
319 {
320 								Texture3DTestCaseParameters		(void);
321 	tcu::Sampler::WrapMode		wrapR;
322 	int							depth;
323 };
324 
325 } // util
326 } // texture
327 } // vkt
328 
329 #endif // _VKTTEXTURETESTUTIL_HPP
330