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 /*--------------------------------------------------------------------*//*!
63  * Gets a tcu::TextureLevel initialized with data from a VK color
64  * attachment.
65  *
66  * The VkImage must be non-multisampled and able to be used as a source
67  * operand for transfer operations.
68  *//*--------------------------------------------------------------------*/
69 de::MovePtr<tcu::TextureLevel>	readColorAttachment			 (const vk::DeviceInterface&	vk,
70 															  vk::VkDevice					device,
71 															  vk::VkQueue					queue,
72 															  deUint32						queueFamilyIndex,
73 															  vk::Allocator&				allocator,
74 															  vk::VkImage					image,
75 															  vk::VkFormat					format,
76 															  const tcu::UVec2&				renderSize);
77 
78 /*--------------------------------------------------------------------*//*!
79  * Uploads data from a test texture to a destination VK image.
80  *
81  * The VkImage must be non-multisampled and able to be used as a
82  * destination operand for transfer operations.
83  *//*--------------------------------------------------------------------*/
84 void							uploadTestTexture			(const vk::DeviceInterface&		vk,
85 															 vk::VkDevice					device,
86 															 vk::VkQueue					queue,
87 															 deUint32						queueFamilyIndex,
88 															 vk::Allocator&					allocator,
89 															 const TestTexture&				testTexture,
90 															 vk::VkImage					destImage);
91 
92 class TestTexture
93 {
94 public:
95 												TestTexture					(const tcu::TextureFormat& format, int width, int height, int depth);
96 												TestTexture					(const tcu::CompressedTexFormat& format, int width, int height, int depth);
97 	virtual										~TestTexture				(void);
98 
99 	virtual int									getNumLevels				(void) const = 0;
100 	virtual deUint32							getSize						(void) const;
getArraySize(void) const101 	virtual int									getArraySize				(void) const { return 1; }
102 
isCompressed(void) const103 	virtual bool								isCompressed				(void) const { return !m_compressedLevels.empty(); }
104 	virtual deUint32							getCompressedSize			(void) const;
105 
106 	virtual tcu::PixelBufferAccess				getLevel					(int level, int layer) = 0;
107 	virtual const tcu::ConstPixelBufferAccess	getLevel					(int level, int layer) const = 0;
108 
109 	virtual tcu::CompressedTexture&				getCompressedLevel			(int level, int layer);
110 	virtual const tcu::CompressedTexture&		getCompressedLevel			(int level, int layer) const;
111 
112 	virtual std::vector<vk::VkBufferImageCopy>	getBufferCopyRegions		(void) const;
113 	virtual void								write						(deUint8* destPtr) const;
114 
115 protected:
116 	void										populateLevels				(const std::vector<tcu::PixelBufferAccess>& levels);
117 	void										populateCompressedLevels	(tcu::CompressedTexFormat format, const std::vector<tcu::PixelBufferAccess>& decompressedLevels);
118 
119 	static void									fillWithGradient			(const tcu::PixelBufferAccess& levelAccess);
120 
121 protected:
122 	std::vector<tcu::CompressedTexture*>		m_compressedLevels;
123 };
124 
125 class TestTexture1D : public TestTexture
126 {
127 private:
128 	tcu::Texture1D								m_texture;
129 
130 public:
131 												TestTexture1D	(const tcu::TextureFormat& format, int width);
132 												TestTexture1D	(const tcu::CompressedTexFormat& format, int width);
133 	virtual										~TestTexture1D	(void);
134 
135 	virtual int getNumLevels (void) const;
136 	virtual tcu::PixelBufferAccess				getLevel		(int level, int layer);
137 	virtual const tcu::ConstPixelBufferAccess	getLevel		(int level, int layer) const;
138 	virtual const tcu::Texture1D&				getTexture		(void) const;
139 };
140 
141 class TestTexture1DArray : public TestTexture
142 {
143 private:
144 	tcu::Texture1DArray							m_texture;
145 
146 public:
147 												TestTexture1DArray	(const tcu::TextureFormat& format, int width, int arraySize);
148 												TestTexture1DArray	(const tcu::CompressedTexFormat& format, int width, int arraySize);
149 	virtual										~TestTexture1DArray	(void);
150 
151 	virtual int									getNumLevels		(void) const;
152 	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
153 	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
154 	virtual const tcu::Texture1DArray&			getTexture			(void) const;
155 	virtual int									getArraySize		(void) const;
156 };
157 
158 class TestTexture2D : public TestTexture
159 {
160 private:
161 	tcu::Texture2D								m_texture;
162 
163 public:
164 												TestTexture2D		(const tcu::TextureFormat& format, int width, int height);
165 												TestTexture2D		(const tcu::CompressedTexFormat& format, int width, int height);
166 	virtual										~TestTexture2D		(void);
167 
168 	virtual int									getNumLevels		(void) const;
169 	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
170 	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
171 	virtual const tcu::Texture2D&				getTexture			(void) const;
172 };
173 
174 class TestTexture2DArray : public TestTexture
175 {
176 private:
177 	tcu::Texture2DArray	m_texture;
178 
179 public:
180 												TestTexture2DArray	(const tcu::TextureFormat& format, int width, int height, int arraySize);
181 												TestTexture2DArray	(const tcu::CompressedTexFormat& format, int width, int height, int arraySize);
182 	virtual										~TestTexture2DArray	(void);
183 
184 	virtual int									getNumLevels		(void) const;
185 	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
186 	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
187 	virtual const tcu::Texture2DArray&			getTexture			(void) const;
188 	virtual int									getArraySize		(void) const;
189 };
190 
191 class TestTexture3D : public TestTexture
192 {
193 private:
194 	tcu::Texture3D	m_texture;
195 
196 public:
197 												TestTexture3D		(const tcu::TextureFormat& format, int width, int height, int depth);
198 												TestTexture3D		(const tcu::CompressedTexFormat& format, int width, int height, int depth);
199 	virtual										~TestTexture3D		(void);
200 
201 	virtual int									getNumLevels		(void) const;
202 	virtual tcu::PixelBufferAccess				getLevel			(int level, int layer);
203 	virtual const tcu::ConstPixelBufferAccess	getLevel			(int level, int layer) const;
204 	virtual const tcu::Texture3D&				getTexture			(void) const;
205 };
206 
207 class TestTextureCube : public TestTexture
208 {
209 private:
210 	tcu::TextureCube							m_texture;
211 
212 public:
213 												TestTextureCube			(const tcu::TextureFormat& format, int size);
214 												TestTextureCube			(const tcu::CompressedTexFormat& format, int size);
215 	virtual										~TestTextureCube		(void);
216 
217 	virtual int									getNumLevels			(void) const;
218 	virtual tcu::PixelBufferAccess				getLevel				(int level, int layer);
219 	virtual const tcu::ConstPixelBufferAccess	getLevel				(int level, int layer) const;
220 	virtual int									getArraySize			(void) const;
221 	virtual const tcu::TextureCube&				getTexture				(void) const;
222 };
223 
224 class TestTextureCubeArray: public TestTexture
225 {
226 private:
227 	tcu::TextureCubeArray						m_texture;
228 
229 public:
230 												TestTextureCubeArray	(const tcu::TextureFormat& format, int size, int arraySize);
231 												TestTextureCubeArray	(const tcu::CompressedTexFormat& format, int size, int arraySize);
232 	virtual										~TestTextureCubeArray	(void);
233 
234 	virtual int									getNumLevels			(void) const;
235 	virtual tcu::PixelBufferAccess				getLevel				(int level, int layer);
236 	virtual const tcu::ConstPixelBufferAccess	getLevel				(int level, int layer) const;
237 	virtual int									getArraySize			(void) const;
238 	virtual const tcu::TextureCubeArray&		getTexture				(void) const;
239 };
240 
241 } // pipeline
242 } // vkt
243 
244 #endif // _VKTPIPELINEIMAGEUTIL_HPP
245