• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*------------------------------------------------------------------------
2  * Vulkan Conformance Tests
3  * ------------------------
4  *
5  * Copyright (c) 2016 The Khronos Group Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Compute tests utility classes
22  *//*--------------------------------------------------------------------*/
23 
24 #include "vktComputeTestsUtil.hpp"
25 #include "vkQueryUtil.hpp"
26 #include "vkTypeUtil.hpp"
27 
28 using namespace vk;
29 
30 namespace vkt
31 {
32 namespace compute
33 {
34 
Buffer(const DeviceInterface & vk,const VkDevice device,Allocator & allocator,const VkBufferCreateInfo & bufferCreateInfo,const MemoryRequirement memoryRequirement)35 Buffer::Buffer (const DeviceInterface&		vk,
36 				const VkDevice				device,
37 				Allocator&					allocator,
38 				const VkBufferCreateInfo&	bufferCreateInfo,
39 				const MemoryRequirement		memoryRequirement)
40 {
41 	m_buffer = createBuffer(vk, device, &bufferCreateInfo);
42 	m_allocation = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), memoryRequirement);
43 	VK_CHECK(vk.bindBufferMemory(device, *m_buffer, m_allocation->getMemory(), m_allocation->getOffset()));
44 }
45 
Image(const DeviceInterface & vk,const VkDevice device,Allocator & allocator,const VkImageCreateInfo & imageCreateInfo,const MemoryRequirement memoryRequirement)46 Image::Image (const DeviceInterface&	vk,
47 			  const VkDevice			device,
48 			  Allocator&				allocator,
49 			  const VkImageCreateInfo&	imageCreateInfo,
50 			  const MemoryRequirement	memoryRequirement)
51 {
52 	m_image = createImage(vk, device, &imageCreateInfo);
53 	m_allocation = allocator.allocate(getImageMemoryRequirements(vk, device, *m_image), memoryRequirement);
54 	VK_CHECK(vk.bindImageMemory(device, *m_image, m_allocation->getMemory(), m_allocation->getOffset()));
55 }
56 
makeBufferCreateInfo(const VkDeviceSize bufferSize,const VkBufferUsageFlags usage)57 VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize			bufferSize,
58 										 const VkBufferUsageFlags	usage)
59 {
60 	const VkBufferCreateInfo bufferCreateInfo =
61 	{
62 		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType		sType;
63 		DE_NULL,								// const void*			pNext;
64 		0u,										// VkBufferCreateFlags	flags;
65 		bufferSize,								// VkDeviceSize			size;
66 		usage,									// VkBufferUsageFlags	usage;
67 		VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode		sharingMode;
68 		0u,										// deUint32				queueFamilyIndexCount;
69 		DE_NULL,								// const deUint32*		pQueueFamilyIndices;
70 	};
71 	return bufferCreateInfo;
72 }
73 
makeBufferImageCopy(const VkExtent3D extent,const deUint32 arraySize)74 VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
75 									   const deUint32	arraySize)
76 {
77 	const VkBufferImageCopy copyParams =
78 	{
79 		0ull,																		//	VkDeviceSize				bufferOffset;
80 		0u,																			//	deUint32					bufferRowLength;
81 		0u,																			//	deUint32					bufferImageHeight;
82 		makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, arraySize),	//	VkImageSubresourceLayers	imageSubresource;
83 		makeOffset3D(0, 0, 0),														//	VkOffset3D					imageOffset;
84 		extent,																		//	VkExtent3D					imageExtent;
85 	};
86 	return copyParams;
87 }
88 
makeCommandPool(const DeviceInterface & vk,const VkDevice device,const deUint32 queueFamilyIndex)89 Move<VkCommandPool> makeCommandPool (const DeviceInterface& vk, const VkDevice device, const deUint32 queueFamilyIndex)
90 {
91 	const VkCommandPoolCreateInfo commandPoolParams =
92 	{
93 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,			// VkStructureType			sType;
94 		DE_NULL,											// const void*				pNext;
95 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,	// VkCommandPoolCreateFlags	flags;
96 		queueFamilyIndex,									// deUint32					queueFamilyIndex;
97 	};
98 	return createCommandPool(vk, device, &commandPoolParams);
99 }
100 
makeCommandBuffer(const DeviceInterface & vk,const VkDevice device,const VkCommandPool commandPool)101 Move<VkCommandBuffer> makeCommandBuffer (const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool)
102 {
103 	const VkCommandBufferAllocateInfo bufferAllocateParams =
104 	{
105 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,		// VkStructureType			sType;
106 		DE_NULL,											// const void*				pNext;
107 		commandPool,										// VkCommandPool			commandPool;
108 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,					// VkCommandBufferLevel		level;
109 		1u,													// deUint32					bufferCount;
110 	};
111 	return allocateCommandBuffer(vk, device, &bufferAllocateParams);
112 }
113 
makePipelineLayout(const DeviceInterface & vk,const VkDevice device)114 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
115 										   const VkDevice				device)
116 {
117 	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
118 	{
119 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
120 		DE_NULL,											// const void*						pNext;
121 		0u,													// VkPipelineLayoutCreateFlags		flags;
122 		0u,													// deUint32							setLayoutCount;
123 		DE_NULL,											// const VkDescriptorSetLayout*		pSetLayouts;
124 		0u,													// deUint32							pushConstantRangeCount;
125 		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
126 	};
127 	return createPipelineLayout(vk, device, &pipelineLayoutParams);
128 }
129 
makePipelineLayout(const DeviceInterface & vk,const VkDevice device,const VkDescriptorSetLayout descriptorSetLayout)130 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
131 										   const VkDevice				device,
132 										   const VkDescriptorSetLayout	descriptorSetLayout)
133 {
134 	const VkPipelineLayoutCreateInfo pipelineLayoutParams =
135 	{
136 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType					sType;
137 		DE_NULL,											// const void*						pNext;
138 		0u,													// VkPipelineLayoutCreateFlags		flags;
139 		1u,													// deUint32							setLayoutCount;
140 		&descriptorSetLayout,								// const VkDescriptorSetLayout*		pSetLayouts;
141 		0u,													// deUint32							pushConstantRangeCount;
142 		DE_NULL,											// const VkPushConstantRange*		pPushConstantRanges;
143 	};
144 	return createPipelineLayout(vk, device, &pipelineLayoutParams);
145 }
146 
makeComputePipeline(const DeviceInterface & vk,const VkDevice device,const VkPipelineLayout pipelineLayout,const VkShaderModule shaderModule)147 Move<VkPipeline> makeComputePipeline (const DeviceInterface&	vk,
148 									  const VkDevice			device,
149 									  const VkPipelineLayout	pipelineLayout,
150 									  const VkShaderModule		shaderModule)
151 {
152 	const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
153 	{
154 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
155 		DE_NULL,												// const void*							pNext;
156 		0u,														// VkPipelineShaderStageCreateFlags		flags;
157 		VK_SHADER_STAGE_COMPUTE_BIT,							// VkShaderStageFlagBits				stage;
158 		shaderModule,											// VkShaderModule						module;
159 		"main",													// const char*							pName;
160 		DE_NULL,												// const VkSpecializationInfo*			pSpecializationInfo;
161 	};
162 	const VkComputePipelineCreateInfo pipelineCreateInfo =
163 	{
164 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,		// VkStructureType					sType;
165 		DE_NULL,											// const void*						pNext;
166 		0u,													// VkPipelineCreateFlags			flags;
167 		pipelineShaderStageParams,							// VkPipelineShaderStageCreateInfo	stage;
168 		pipelineLayout,										// VkPipelineLayout					layout;
169 		DE_NULL,											// VkPipeline						basePipelineHandle;
170 		0,													// deInt32							basePipelineIndex;
171 	};
172 	return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
173 }
174 
makeBufferView(const DeviceInterface & vk,const VkDevice vkDevice,const VkBuffer buffer,const VkFormat format,const VkDeviceSize offset,const VkDeviceSize size)175 Move<VkBufferView> makeBufferView (const DeviceInterface&	vk,
176 								   const VkDevice			vkDevice,
177 								   const VkBuffer			buffer,
178 								   const VkFormat			format,
179 								   const VkDeviceSize		offset,
180 								   const VkDeviceSize		size)
181 {
182 	const VkBufferViewCreateInfo bufferViewParams =
183 	{
184 		VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,	// VkStructureType			sType;
185 		DE_NULL,									// const void*				pNext;
186 		0u,											// VkBufferViewCreateFlags	flags;
187 		buffer,										// VkBuffer					buffer;
188 		format,										// VkFormat					format;
189 		offset,										// VkDeviceSize				offset;
190 		size,										// VkDeviceSize				range;
191 	};
192 	return createBufferView(vk, vkDevice, &bufferViewParams);
193 }
194 
makeImageView(const DeviceInterface & vk,const VkDevice vkDevice,const VkImage image,const VkImageViewType imageViewType,const VkFormat format,const VkImageSubresourceRange subresourceRange)195 Move<VkImageView> makeImageView (const DeviceInterface&			vk,
196 								 const VkDevice					vkDevice,
197 								 const VkImage					image,
198 								 const VkImageViewType			imageViewType,
199 								 const VkFormat					format,
200 								 const VkImageSubresourceRange	subresourceRange)
201 {
202 	const VkImageViewCreateInfo imageViewParams =
203 	{
204 		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// VkStructureType			sType;
205 		DE_NULL,										// const void*				pNext;
206 		0u,												// VkImageViewCreateFlags	flags;
207 		image,											// VkImage					image;
208 		imageViewType,									// VkImageViewType			viewType;
209 		format,											// VkFormat					format;
210 		makeComponentMappingRGBA(),						// VkComponentMapping		components;
211 		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
212 	};
213 	return createImageView(vk, vkDevice, &imageViewParams);
214 }
215 
makeDescriptorSet(const DeviceInterface & vk,const VkDevice device,const VkDescriptorPool descriptorPool,const VkDescriptorSetLayout setLayout)216 Move<VkDescriptorSet> makeDescriptorSet (const DeviceInterface&			vk,
217 										 const VkDevice					device,
218 										 const VkDescriptorPool			descriptorPool,
219 										 const VkDescriptorSetLayout	setLayout)
220 {
221 	const VkDescriptorSetAllocateInfo allocateParams =
222 	{
223 		VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType				sType;
224 		DE_NULL,											// const void*					pNext;
225 		descriptorPool,										// VkDescriptorPool				descriptorPool;
226 		1u,													// deUint32						setLayoutCount;
227 		&setLayout,											// const VkDescriptorSetLayout*	pSetLayouts;
228 	};
229 	return allocateDescriptorSet(vk, device, &allocateParams);
230 }
231 
makeBufferMemoryBarrier(const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkBuffer buffer,const VkDeviceSize offset,const VkDeviceSize bufferSizeBytes)232 VkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags	srcAccessMask,
233 											   const VkAccessFlags	dstAccessMask,
234 											   const VkBuffer		buffer,
235 											   const VkDeviceSize	offset,
236 											   const VkDeviceSize	bufferSizeBytes)
237 {
238 	const VkBufferMemoryBarrier barrier =
239 	{
240 		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
241 		DE_NULL,									// const void*		pNext;
242 		srcAccessMask,								// VkAccessFlags	srcAccessMask;
243 		dstAccessMask,								// VkAccessFlags	dstAccessMask;
244 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
245 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			destQueueFamilyIndex;
246 		buffer,										// VkBuffer			buffer;
247 		offset,										// VkDeviceSize		offset;
248 		bufferSizeBytes,							// VkDeviceSize		size;
249 	};
250 	return barrier;
251 }
252 
makeImageMemoryBarrier(const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkImageLayout oldLayout,const VkImageLayout newLayout,const VkImage image,const VkImageSubresourceRange subresourceRange)253 VkImageMemoryBarrier makeImageMemoryBarrier	(const VkAccessFlags			srcAccessMask,
254 											 const VkAccessFlags			dstAccessMask,
255 											 const VkImageLayout			oldLayout,
256 											 const VkImageLayout			newLayout,
257 											 const VkImage					image,
258 											 const VkImageSubresourceRange	subresourceRange)
259 {
260 	const VkImageMemoryBarrier barrier =
261 	{
262 		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
263 		DE_NULL,										// const void*				pNext;
264 		srcAccessMask,									// VkAccessFlags			outputMask;
265 		dstAccessMask,									// VkAccessFlags			inputMask;
266 		oldLayout,										// VkImageLayout			oldLayout;
267 		newLayout,										// VkImageLayout			newLayout;
268 		VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
269 		VK_QUEUE_FAMILY_IGNORED,						// deUint32					destQueueFamilyIndex;
270 		image,											// VkImage					image;
271 		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
272 	};
273 	return barrier;
274 }
275 
beginCommandBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer)276 void beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
277 {
278 	const VkCommandBufferBeginInfo commandBufBeginParams =
279 	{
280 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType					sType;
281 		DE_NULL,										// const void*						pNext;
282 		0u,												// VkCommandBufferUsageFlags		flags;
283 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
284 	};
285 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
286 }
287 
endCommandBuffer(const DeviceInterface & vk,const VkCommandBuffer commandBuffer)288 void endCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
289 {
290 	VK_CHECK(vk.endCommandBuffer(commandBuffer));
291 }
292 
submitCommandsAndWait(const DeviceInterface & vk,const VkDevice device,const VkQueue queue,const VkCommandBuffer commandBuffer)293 void submitCommandsAndWait (const DeviceInterface&	vk,
294 							const VkDevice			device,
295 							const VkQueue			queue,
296 							const VkCommandBuffer	commandBuffer)
297 {
298 	const VkFenceCreateInfo	fenceParams =
299 	{
300 		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
301 		DE_NULL,								// const void*			pNext;
302 		0u,										// VkFenceCreateFlags	flags;
303 	};
304 	const Unique<VkFence> fence(createFence(vk, device, &fenceParams));
305 
306 	const VkSubmitInfo submitInfo =
307 	{
308 		VK_STRUCTURE_TYPE_SUBMIT_INFO,		// VkStructureType			sType;
309 		DE_NULL,							// const void*				pNext;
310 		0u,									// deUint32					waitSemaphoreCount;
311 		DE_NULL,							// const VkSemaphore*		pWaitSemaphores;
312 		(const VkPipelineStageFlags*)DE_NULL,
313 		1u,									// deUint32					commandBufferCount;
314 		&commandBuffer,						// const VkCommandBuffer*	pCommandBuffers;
315 		0u,									// deUint32					signalSemaphoreCount;
316 		DE_NULL,							// const VkSemaphore*		pSignalSemaphores;
317 	};
318 
319 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
320 	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
321 }
322 
323 } // compute
324 } // vkt
325