• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
36 namespace vkt
37 {
38 namespace pipeline
39 {
40 
41 class TestTexture;
42 
43 enum BorderColor
44 {
45 	BORDER_COLOR_OPAQUE_BLACK,
46 	BORDER_COLOR_OPAQUE_WHITE,
47 	BORDER_COLOR_TRANSPARENT_BLACK,
48 
49 	BORDER_COLOR_COUNT
50 };
51 
52 bool							isSupportedSamplableFormat	(const vk::InstanceInterface&	instanceInterface,
53 															 vk::VkPhysicalDevice			device,
54 															 vk::VkFormat					format);
55 bool							isLinearFilteringSupported	(const vk::InstanceInterface&	instanceInterface,
56 															 vk::VkPhysicalDevice			device,
57 															 vk::VkFormat					format,
58 															 vk::VkImageTiling				tiling);
59 
60 vk::VkBorderColor				getFormatBorderColor		(BorderColor color, vk::VkFormat format);
61 
62 void							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  *//*--------------------------------------------------------------------*/
73 de::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  *//*--------------------------------------------------------------------*/
88 void							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 
96 class TestTexture
97 {
98 public:
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;
getArraySize(void) const105 	virtual int									getArraySize				(void) const { return 1; }
106 
isCompressed(void) const107 	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 
123 protected:
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 
131 protected:
132 	std::vector<tcu::CompressedTexture*>		m_compressedLevels;
133 };
134 
135 class TestTexture1D : public TestTexture
136 {
137 private:
138 	tcu::Texture1D								m_texture;
139 
140 public:
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);
getTextureFormat(void) const150 	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const151 	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 
156 class TestTexture1DArray : public TestTexture
157 {
158 private:
159 	tcu::Texture1DArray							m_texture;
160 
161 public:
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;
getTextureFormat(void) const172 	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const173 	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 
178 class TestTexture2D : public TestTexture
179 {
180 private:
181 	tcu::Texture2D								m_texture;
182 
183 public:
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);
getTextureFormat(void) const193 	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const194 	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 
199 class TestTexture2DArray : public TestTexture
200 {
201 private:
202 	tcu::Texture2DArray	m_texture;
203 
204 public:
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;
getTextureFormat(void) const215 	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const216 	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 
221 class TestTexture3D : public TestTexture
222 {
223 private:
224 	tcu::Texture3D	m_texture;
225 
226 public:
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);
getTextureFormat(void) const236 	virtual const tcu::TextureFormat&			getTextureFormat	(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const237 	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 
242 class TestTextureCube : public TestTexture
243 {
244 private:
245 	tcu::TextureCube							m_texture;
246 
247 public:
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);
getTextureFormat(void) const258 	virtual const tcu::TextureFormat&			getTextureFormat		(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const259 	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 
264 class TestTextureCubeArray: public TestTexture
265 {
266 private:
267 	tcu::TextureCubeArray						m_texture;
268 
269 public:
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);
getTextureFormat(void) const280 	virtual const tcu::TextureFormat&			getTextureFormat		(void) const { return m_texture.getFormat(); }
getTextureDimension(void) const281 	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