1#ifndef _VKTPIPELINEIMAGEUTIL_HPP
2#define _VKTPIPELINEIMAGEUTIL_HPP
3/*------------------------------------------------------------------------
4 * Vulkan Conformance Tests
5 * ------------------------
6 *
7 * Copyright (c) 2015 The Khronos Group Inc.
8 * Copyright (c) 2015 Imagination Technologies Ltd.
9 *
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 *      http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 *
22 *//*!
23 * \file
24 * \brief Utilities for images.
25 *//*--------------------------------------------------------------------*/
26
27#include "tcuDefs.hpp"
28#include "vkDefs.hpp"
29#include "vkDefs.hpp"
30#include "vkPlatform.hpp"
31#include "vkMemUtil.hpp"
32#include "vkRef.hpp"
33#include "tcuTexture.hpp"
34#include "tcuCompressedTexture.hpp"
35
36namespace vkt
37{
38namespace pipeline
39{
40
41class TestTexture;
42
43enum BorderColor
44{
45	BORDER_COLOR_OPAQUE_BLACK,
46	BORDER_COLOR_OPAQUE_WHITE,
47	BORDER_COLOR_TRANSPARENT_BLACK,
48
49	BORDER_COLOR_COUNT
50};
51
52bool							isSupportedSamplableFormat	(const vk::InstanceInterface&	instanceInterface,
53															 vk::VkPhysicalDevice			device,
54															 vk::VkFormat					format);
55bool							isLinearFilteringSupported	(const vk::InstanceInterface&	instanceInterface,
56															 vk::VkPhysicalDevice			device,
57															 vk::VkFormat					format,
58															 vk::VkImageTiling				tiling);
59
60vk::VkBorderColor				getFormatBorderColor		(BorderColor color, vk::VkFormat format);
61
62void							getLookupScaleBias			(vk::VkFormat					format,
63															 tcu::Vec4&						lookupScale,
64															 tcu::Vec4&						lookupBias);
65
66/*--------------------------------------------------------------------*//*!
67 * Gets a tcu::TextureLevel initialized with data from a VK color
68 * attachment.
69 *
70 * The VkImage must be non-multisampled and able to be used as a source
71 * operand for transfer operations.
72 *//*--------------------------------------------------------------------*/
73de::MovePtr<tcu::TextureLevel>	readColorAttachment			 (const vk::DeviceInterface&	vk,
74															  vk::VkDevice					device,
75															  vk::VkQueue					queue,
76															  deUint32						queueFamilyIndex,
77															  vk::Allocator&				allocator,
78															  vk::VkImage					image,
79															  vk::VkFormat					format,
80															  const tcu::UVec2&				renderSize);
81
82/*--------------------------------------------------------------------*//*!
83 * Uploads data from a test texture to a destination VK image.
84 *
85 * The VkImage must be non-multisampled and able to be used as a
86 * destination operand for transfer operations.
87 *//*--------------------------------------------------------------------*/
88void							uploadTestTexture			(const vk::DeviceInterface&		vk,
89															 vk::VkDevice					device,
90															 vk::VkQueue					queue,
91															 deUint32						queueFamilyIndex,
92															 vk::Allocator&					allocator,
93															 const TestTexture&				testTexture,
94															 vk::VkImage					destImage);
95
96class TestTexture
97{
98public:
99												TestTexture					(const tcu::TextureFormat& format, int width, int height, int depth);
100												TestTexture					(const tcu::CompressedTexFormat& format, int width, int height, int depth);
101	virtual										~TestTexture				(void);
102
103	virtual int									getNumLevels				(void) const = 0;
104	virtual deUint32							getSize						(void) const;
105	virtual int									getArraySize				(void) const { return 1; }
106
107	virtual bool								isCompressed				(void) const { return !m_compressedLevels.empty(); }
108	virtual deUint32							getCompressedSize			(void) const;
109
110	virtual tcu::PixelBufferAccess				getLevel					(int level, int layer) = 0;
111	virtual const tcu::ConstPixelBufferAccess	getLevel					(int level, int layer) const = 0;
112
113	virtual tcu::CompressedTexture&				getCompressedLevel			(int level, int layer);
114	virtual const tcu::CompressedTexture&		getCompressedLevel			(int level, int layer) const;
115
116	virtual std::vector<vk::VkBufferImageCopy>	getBufferCopyRegions		(void) const;
117	virtual void								write						(deUint8* destPtr) const;
118	virtual de::MovePtr<TestTexture>			copy						(const tcu::TextureFormat) const = 0;
119
120	virtual const tcu::TextureFormat&			getTextureFormat			(void) const = 0;
121	virtual tcu::UVec3							getTextureDimension			(void) const = 0;
122
123protected:
124	void										populateLevels				(const std::vector<tcu::PixelBufferAccess>& levels);
125	void										populateCompressedLevels	(tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
126
127	static void									fillWithGradient			(const tcu::PixelBufferAccess& levelAccess);
128
129	void										copyToTexture				(TestTexture&) const;
130
131protected:
132	std::vector<tcu::CompressedTexture*>		m_compressedLevels;
133};
134
135class TestTexture1D : public TestTexture
136{
137private:
138	tcu::Texture1D								m_texture;
139
140public:
141												TestTexture1D		(const tcu::TextureFormat& format, int width);
142												TestTexture1D		(const tcu::CompressedTexFormat& format, int width);
143	virtual										~TestTexture1D		(void);
144
145	virtual int getNumLevels (void) const;
146	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
147	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
148	virtual const tcu::Texture1D&				getTexture			(void) const;
149	virtual tcu::Texture1D&						getTexture			(void);
150	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
151	virtual tcu::UVec3							getTextureDimension	(void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
152
153	virtual de::MovePtr<TestTexture>			copy				(const tcu::TextureFormat) const;
154};
155
156class TestTexture1DArray : public TestTexture
157{
158private:
159	tcu::Texture1DArray							m_texture;
160
161public:
162												TestTexture1DArray	(const tcu::TextureFormat& format, int width, int arraySize);
163												TestTexture1DArray	(const tcu::CompressedTexFormat& format, int width, int arraySize);
164	virtual										~TestTexture1DArray	(void);
165
166	virtual int									getNumLevels		(void) const;
167	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
168	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
169	virtual const tcu::Texture1DArray&			getTexture			(void) const;
170	virtual tcu::Texture1DArray&				getTexture			(void);
171	virtual int									getArraySize		(void) const;
172	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
173	virtual tcu::UVec3							getTextureDimension	(void) const { return tcu::UVec3(m_texture.getWidth(), 1, 1); }
174
175	virtual de::MovePtr<TestTexture>			copy				(const tcu::TextureFormat) const;
176};
177
178class TestTexture2D : public TestTexture
179{
180private:
181	tcu::Texture2D								m_texture;
182
183public:
184												TestTexture2D		(const tcu::TextureFormat& format, int width, int height);
185												TestTexture2D		(const tcu::CompressedTexFormat& format, int width, int height);
186	virtual										~TestTexture2D		(void);
187
188	virtual int									getNumLevels		(void) const;
189	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
190	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
191	virtual const tcu::Texture2D&				getTexture			(void) const;
192	virtual tcu::Texture2D&						getTexture			(void);
193	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
194	virtual tcu::UVec3							getTextureDimension	(void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
195
196	virtual de::MovePtr<TestTexture>			copy				(const tcu::TextureFormat) const;
197};
198
199class TestTexture2DArray : public TestTexture
200{
201private:
202	tcu::Texture2DArray	m_texture;
203
204public:
205												TestTexture2DArray	(const tcu::TextureFormat& format, int width, int height, int arraySize);
206												TestTexture2DArray	(const tcu::CompressedTexFormat& format, int width, int height, int arraySize);
207	virtual										~TestTexture2DArray	(void);
208
209	virtual int									getNumLevels		(void) const;
210	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
211	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
212	virtual const tcu::Texture2DArray&			getTexture			(void) const;
213	virtual tcu::Texture2DArray&				getTexture			(void);
214	virtual int									getArraySize		(void) const;
215	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
216	virtual tcu::UVec3							getTextureDimension	(void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), 1); }
217
218	virtual de::MovePtr<TestTexture>			copy				(const tcu::TextureFormat) const;
219};
220
221class TestTexture3D : public TestTexture
222{
223private:
224	tcu::Texture3D	m_texture;
225
226public:
227												TestTexture3D		(const tcu::TextureFormat& format, int width, int height, int depth);
228												TestTexture3D		(const tcu::CompressedTexFormat& format, int width, int height, int depth);
229	virtual										~TestTexture3D		(void);
230
231	virtual int									getNumLevels		(void) const;
232	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
233	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
234	virtual const tcu::Texture3D&				getTexture			(void) const;
235	virtual tcu::Texture3D&						getTexture			(void);
236	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
237	virtual tcu::UVec3							getTextureDimension	(void) const { return tcu::UVec3(m_texture.getWidth(), m_texture.getHeight(), m_texture.getDepth()); }
238
239	virtual de::MovePtr<TestTexture>			copy				(const tcu::TextureFormat) const;
240};
241
242class TestTextureCube : public TestTexture
243{
244private:
245	tcu::TextureCube							m_texture;
246
247public:
248												TestTextureCube			(const tcu::TextureFormat& format, int size);
249												TestTextureCube			(const tcu::CompressedTexFormat& format, int size);
250	virtual										~TestTextureCube		(void);
251
252	virtual int									getNumLevels			(void) const;
253	virtual tcu::PixelBufferAccess				getLevel				(int level, int layer);
254	virtual const tcu::ConstPixelBufferAccess	getLevel				(int level, int layer) const;
255	virtual int									getArraySize			(void) const;
256	virtual const tcu::TextureCube&				getTexture				(void) const;
257	virtual tcu::TextureCube&					getTexture				(void);
258	virtual const tcu::TextureFormat&			getTextureFormat		(void) const { return m_texture.getFormat(); }
259	virtual tcu::UVec3							getTextureDimension		(void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
260
261	virtual de::MovePtr<TestTexture>			copy					(const tcu::TextureFormat) const;
262};
263
264class TestTextureCubeArray: public TestTexture
265{
266private:
267	tcu::TextureCubeArray						m_texture;
268
269public:
270												TestTextureCubeArray	(const tcu::TextureFormat& format, int size, int arraySize);
271												TestTextureCubeArray	(const tcu::CompressedTexFormat& format, int size, int arraySize);
272	virtual										~TestTextureCubeArray	(void);
273
274	virtual int									getNumLevels			(void) const;
275	virtual tcu::PixelBufferAccess				getLevel				(int level, int layer);
276	virtual const tcu::ConstPixelBufferAccess	getLevel				(int level, int layer) const;
277	virtual int									getArraySize			(void) const;
278	virtual const tcu::TextureCubeArray&		getTexture				(void) const;
279	virtual tcu::TextureCubeArray&				getTexture				(void);
280	virtual const tcu::TextureFormat&			getTextureFormat		(void) const { return m_texture.getFormat(); }
281	virtual tcu::UVec3							getTextureDimension		(void) const { return tcu::UVec3(m_texture.getSize(), m_texture.getSize(), 1); }
282
283	virtual de::MovePtr<TestTexture>			copy					(const tcu::TextureFormat) const;
284};
285
286} // pipeline
287} // vkt
288
289#endif // _VKTPIPELINEIMAGEUTIL_HPP
290