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 
makeBufferImageCopy(const VkExtent3D extent,const deUint32 arraySize)57 VkBufferImageCopy makeBufferImageCopy (const VkExtent3D extent,
58 									   const deUint32	arraySize)
59 {
60 	const VkBufferImageCopy copyParams =
61 	{
62 		0ull,																		//	VkDeviceSize				bufferOffset;
63 		0u,																			//	deUint32					bufferRowLength;
64 		0u,																			//	deUint32					bufferImageHeight;
65 		makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, arraySize),	//	VkImageSubresourceLayers	imageSubresource;
66 		makeOffset3D(0, 0, 0),														//	VkOffset3D					imageOffset;
67 		extent,																		//	VkExtent3D					imageExtent;
68 	};
69 	return copyParams;
70 }
71 
makeComputePipeline(const DeviceInterface & vk,const VkDevice device,const VkPipelineLayout pipelineLayout,const VkPipelineCreateFlags pipelineFlags,const VkShaderModule shaderModule,const VkPipelineShaderStageCreateFlags shaderFlags)72 Move<VkPipeline> makeComputePipeline (const DeviceInterface&					vk,
73 									  const VkDevice							device,
74 									  const VkPipelineLayout					pipelineLayout,
75 									  const VkPipelineCreateFlags				pipelineFlags,
76 									  const VkShaderModule						shaderModule,
77 									  const VkPipelineShaderStageCreateFlags	shaderFlags)
78 {
79 	const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
80 	{
81 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType						sType;
82 		DE_NULL,												// const void*							pNext;
83 		shaderFlags,											// VkPipelineShaderStageCreateFlags		flags;
84 		VK_SHADER_STAGE_COMPUTE_BIT,							// VkShaderStageFlagBits				stage;
85 		shaderModule,											// VkShaderModule						module;
86 		"main",													// const char*							pName;
87 		DE_NULL,												// const VkSpecializationInfo*			pSpecializationInfo;
88 	};
89 	const VkComputePipelineCreateInfo pipelineCreateInfo =
90 	{
91 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,		// VkStructureType					sType;
92 		DE_NULL,											// const void*						pNext;
93 		pipelineFlags,										// VkPipelineCreateFlags			flags;
94 		pipelineShaderStageParams,							// VkPipelineShaderStageCreateInfo	stage;
95 		pipelineLayout,										// VkPipelineLayout					layout;
96 		DE_NULL,											// VkPipeline						basePipelineHandle;
97 		0,													// deInt32							basePipelineIndex;
98 	};
99 	return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
100 }
101 
makeComputePipeline(const DeviceInterface & vk,const VkDevice device,const VkPipelineLayout pipelineLayout,const VkShaderModule shaderModule)102 Move<VkPipeline> makeComputePipeline (const DeviceInterface&	vk,
103 									  const VkDevice			device,
104 									  const VkPipelineLayout	pipelineLayout,
105 									  const VkShaderModule		shaderModule)
106 {
107 	return makeComputePipeline(vk, device, pipelineLayout, static_cast<VkPipelineCreateFlags>(0u), shaderModule, static_cast<VkPipelineShaderStageCreateFlags>(0u));
108 }
109 } // compute
110 } // vkt
111