• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _VKTDRAWIMAGEOBJECTUTIL_HPP
2 #define _VKTDRAWIMAGEOBJECTUTIL_HPP
3 /*------------------------------------------------------------------------
4  * Vulkan Conformance Tests
5  * ------------------------
6  *
7  * Copyright (c) 2015 The Khronos Group Inc.
8  * Copyright (c) 2015 Intel Corporation
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 Image Object Util
25  *//*--------------------------------------------------------------------*/
26 
27 #include "vkDefs.hpp"
28 #include "vkMemUtil.hpp"
29 #include "vkRefUtil.hpp"
30 
31 #include "deSharedPtr.hpp"
32 
33 #include "tcuTexture.hpp"
34 
35 namespace vkt
36 {
37 namespace Draw
38 {
39 
40 class MemoryOp
41 {
42 public:
43 	static void pack	(int					pixelSize,
44 						 int					width,
45 						 int					height,
46 						 int					depth,
47 						 vk::VkDeviceSize		rowPitchOrZero,
48 						 vk::VkDeviceSize		depthPitchOrZero,
49 						 const void *			srcBuffer,
50 						 void *					destBuffer);
51 
52 	static void unpack	(int					pixelSize,
53 						 int					width,
54 						 int					height,
55 						 int					depth,
56 						 vk::VkDeviceSize		rowPitchOrZero,
57 						 vk::VkDeviceSize		depthPitchOrZero,
58 						 const void *			srcBuffer,
59 						 void *					destBuffer);
60 };
61 
62 class Image
63 {
64 public:
65 	static de::SharedPtr<Image> create				(const vk::DeviceInterface& vk, vk::VkDevice device, const vk::VkImageCreateInfo& createInfo);
66 
67 	static de::SharedPtr<Image> createAndAlloc		(const vk::DeviceInterface&				vk,
68 													 vk::VkDevice							device,
69 													 const vk::VkImageCreateInfo&			createInfo,
70 													 vk::Allocator&							allocator,
71 													 vk::MemoryRequirement					memoryRequirement = vk::MemoryRequirement::Any);
72 
73 	tcu::ConstPixelBufferAccess readSurface			(vk::VkQueue							queue,
74 													 vk::Allocator&							allocator,
75 													 vk::VkImageLayout						layout,
76 													 vk::VkOffset3D							offset,
77 													 int									width,
78 													 int									height,
79 													 vk::VkImageAspectFlagBits				aspect,
80 													 unsigned int							mipLevel = 0,
81 													 unsigned int							arrayElement = 0);
82 
83 	tcu::ConstPixelBufferAccess readSurface1D		(vk::VkQueue							queue,
84 													 vk::Allocator&							allocator,
85 													 vk::VkImageLayout						layout,
86 													 vk::VkOffset3D							offset,
87 													 int									width,
88 													 vk::VkImageAspectFlagBits				aspect,
89 													 unsigned int							mipLevel = 0,
90 													 unsigned int							arrayElement = 0);
91 
92 	tcu::ConstPixelBufferAccess readVolume			(vk::VkQueue							queue,
93 													 vk::Allocator&							allocator,
94 													 vk::VkImageLayout						layout,
95 													 vk::VkOffset3D							offset,
96 													 int									width,
97 													 int									height,
98 													 int									depth,
99 													 vk::VkImageAspectFlagBits				aspect,
100 													 unsigned int							mipLevel = 0,
101 													 unsigned int							arrayElement = 0);
102 
103 	tcu::ConstPixelBufferAccess readSurfaceLinear	(vk::VkOffset3D							offset,
104 													 int									width,
105 													 int									height,
106 													 int									depth,
107 													 vk::VkImageAspectFlagBits				aspect,
108 													 unsigned int							mipLevel = 0,
109 													 unsigned int							arrayElement = 0);
110 
111 	void						read				(vk::VkQueue							queue,
112 													 vk::Allocator&							allocator,
113 													 vk::VkImageLayout						layout,
114 													 vk::VkOffset3D							offset,
115 													 int									width,
116 													 int									height,
117 													 int									depth,
118 													 unsigned int							mipLevel,
119 													 unsigned int							arrayElement,
120 													 vk::VkImageAspectFlagBits				aspect,
121 													 vk::VkImageType						type,
122 													 void *									data);
123 
124 	void						readUsingBuffer		(vk::VkQueue							queue,
125 													 vk::Allocator&							allocator,
126 													 vk::VkImageLayout						layout,
127 													 vk::VkOffset3D							offset,
128 													 int									width,
129 													 int									height,
130 													 int									depth,
131 													 unsigned int							mipLevel,
132 													 unsigned int							arrayElement,
133 													 vk::VkImageAspectFlagBits				aspect,
134 													 void *									data);
135 
136 	void						readLinear			(vk::VkOffset3D							offset,
137 													 int									width,
138 													 int									height,
139 													 int									depth,
140 													 unsigned int							mipLevel,
141 													 unsigned int							arrayElement,
142 													 vk::VkImageAspectFlagBits				aspect,
143 													 void *									data);
144 
145 	void						uploadVolume		(const tcu::ConstPixelBufferAccess&		access,
146 													 vk::VkQueue							queue,
147 													 vk::Allocator&							allocator,
148 													 vk::VkImageLayout						layout,
149 													 vk::VkOffset3D							offset,
150 													 vk::VkImageAspectFlagBits				aspect,
151 													 unsigned int							mipLevel = 0,
152 													 unsigned int							arrayElement = 0);
153 
154 	void						uploadSurface		 (const tcu::ConstPixelBufferAccess&	access,
155 														vk::VkQueue							queue,
156 														vk::Allocator&						allocator,
157 														vk::VkImageLayout					layout,
158 														vk::VkOffset3D						offset,
159 														vk::VkImageAspectFlagBits			aspect,
160 														unsigned int						mipLevel = 0,
161 														unsigned int						arrayElement = 0);
162 
163 	void						uploadSurface1D		(const tcu::ConstPixelBufferAccess&		access,
164 													 vk::VkQueue							queue,
165 													 vk::Allocator&							allocator,
166 													 vk::VkImageLayout						layout,
167 													 vk::VkOffset3D							offset,
168 													 vk::VkImageAspectFlagBits				aspect,
169 													 unsigned int							mipLevel = 0,
170 													 unsigned int							arrayElement = 0);
171 
172 	void						uploadSurfaceLinear	(const tcu::ConstPixelBufferAccess&		access,
173 													 vk::VkOffset3D							offset,
174 													 int									width,
175 													 int									height,
176 													 int									depth,
177 													 vk::VkImageAspectFlagBits				aspect,
178 													 unsigned int							mipLevel = 0,
179 													 unsigned int							arrayElement = 0);
180 
181 	void						upload				(vk::VkQueue							queue,
182 													 vk::Allocator&							allocator,
183 													 vk::VkImageLayout						layout,
184 													 vk::VkOffset3D							offset,
185 													 int									width,
186 													 int									height,
187 													 int									depth,
188 													 unsigned int							mipLevel,
189 													 unsigned int							arrayElement,
190 													 vk::VkImageAspectFlagBits				aspect,
191 													 vk::VkImageType						type,
192 													 const void *							data);
193 
194 	void						uploadUsingBuffer	(vk::VkQueue							queue,
195 													 vk::Allocator&							allocator,
196 													 vk::VkImageLayout						layout,
197 													 vk::VkOffset3D							offset,
198 													 int									width,
199 													 int									height,
200 													 int									depth,
201 													 unsigned int							mipLevel,
202 													 unsigned int							arrayElement,
203 													 vk::VkImageAspectFlagBits				aspect,
204 													 const void *							data);
205 
206 	void						uploadLinear		(vk::VkOffset3D							offset,
207 													 int									width,
208 													 int									height,
209 													 int									depth,
210 													 unsigned int							mipLevel,
211 													 unsigned int							arrayElement,
212 													 vk::VkImageAspectFlagBits				aspect,
213 													 const void *							data);
214 
215 	de::SharedPtr<Image>		copyToLinearImage	(vk::VkQueue							queue,
216 													 vk::Allocator&							allocator,
217 													 vk::VkImageLayout						layout,
218 													 vk::VkOffset3D							offset,
219 													 int									width,
220 													 int									height,
221 													 int									depth,
222 													 unsigned int							mipLevel,
223 													 unsigned int							arrayElement,
224 													 vk::VkImageAspectFlagBits				aspect,
225 													 vk::VkImageType						type);
226 
getFormat(void) const227 	const vk::VkFormat&			getFormat			(void) const											{ return m_format;		}
object(void) const228 	vk::VkImage					object				(void) const											{ return *m_object;		}
229 	void						bindMemory			(de::MovePtr<vk::Allocation>			allocation);
getBoundMemory(void) const230 	vk::Allocation				getBoundMemory		(void) const											{ return *m_allocation; }
231 
232 private:
233 	vk::VkDeviceSize			getPixelOffset		(vk::VkOffset3D							offset,
234 													 vk::VkDeviceSize						rowPitch,
235 													 vk::VkDeviceSize						depthPitch,
236 													 unsigned int							mipLevel,
237 													 unsigned int							arrayElement);
238 
239 								Image				(const vk::DeviceInterface&				vk,
240 													 vk::VkDevice							device,
241 													 vk::VkFormat							format,
242 													 const vk::VkExtent3D&					extend,
243 													 deUint32								levelCount,
244 													 deUint32								layerCount,
245 													 vk::Move<vk::VkImage>					object);
246 
247 	Image											(const Image& other);	// Not allowed!
248 	Image&						operator=			(const Image& other);	// Not allowed!
249 
250 	de::MovePtr<vk::Allocation>	m_allocation;
251 	vk::Unique<vk::VkImage>		m_object;
252 
253 	vk::VkFormat				m_format;
254 	vk::VkExtent3D				m_extent;
255 	deUint32					m_levelCount;
256 	deUint32					m_layerCount;
257 
258 	std::vector<deUint8>		m_pixelAccessData;
259 
260 	const vk::DeviceInterface&	m_vk;
261 	vk::VkDevice				m_device;
262 };
263 
264 void transition2DImage (const vk::DeviceInterface&	vk,
265 						vk::VkCommandBuffer			cmdBuffer,
266 						vk::VkImage					image,
267 						vk::VkImageAspectFlags		aspectMask,
268 						vk::VkImageLayout			oldLayout,
269 						vk::VkImageLayout			newLayout,
270 						vk::VkAccessFlags			srcAccessMask = 0,
271 						vk::VkAccessFlags			dstAccessMask = 0);
272 
273 void initialTransitionColor2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout);
274 
275 void initialTransitionDepth2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout);
276 
277 void initialTransitionStencil2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout);
278 
279 void initialTransitionDepthStencil2DImage (const vk::DeviceInterface&	vk,
280 										   vk::VkCommandBuffer			cmdBuffer,
281 										   vk::VkImage					image,
282 										   vk::VkImageLayout			layout,
283 										   vk::VkAccessFlags			srcAccessMask = 0,
284 										   vk::VkAccessFlags			dstAccessMask = 0);
285 
286 } // Draw
287 } // vkt
288 
289 #endif // _VKTDRAWIMAGEOBJECTUTIL_HPP
290