Home | History | Annotate | Download | only in fragment_ops
      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 Object creation utilities
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "vktFragmentOperationsMakeUtil.hpp"
     25 #include "vkTypeUtil.hpp"
     26 #include "vkPrograms.hpp"
     27 #include "vkQueryUtil.hpp"
     28 #include <vector>
     29 
     30 namespace vkt
     31 {
     32 namespace FragmentOperations
     33 {
     34 using namespace vk;
     35 using de::MovePtr;
     36 
     37 VkBufferCreateInfo makeBufferCreateInfo (const VkDeviceSize			bufferSize,
     38 										 const VkBufferUsageFlags	usage)
     39 {
     40 	const VkBufferCreateInfo bufferCreateInfo =
     41 	{
     42 		VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,	// VkStructureType		sType;
     43 		DE_NULL,								// const void*			pNext;
     44 		(VkBufferCreateFlags)0,					// VkBufferCreateFlags	flags;
     45 		bufferSize,								// VkDeviceSize			size;
     46 		usage,									// VkBufferUsageFlags	usage;
     47 		VK_SHARING_MODE_EXCLUSIVE,				// VkSharingMode		sharingMode;
     48 		0u,										// deUint32				queueFamilyIndexCount;
     49 		DE_NULL,								// const deUint32*		pQueueFamilyIndices;
     50 	};
     51 	return bufferCreateInfo;
     52 }
     53 
     54 VkBufferMemoryBarrier makeBufferMemoryBarrier (const VkAccessFlags	srcAccessMask,
     55 											   const VkAccessFlags	dstAccessMask,
     56 											   const VkBuffer		buffer,
     57 											   const VkDeviceSize	offset,
     58 											   const VkDeviceSize	bufferSizeBytes)
     59 {
     60 	const VkBufferMemoryBarrier barrier =
     61 	{
     62 		VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,	// VkStructureType	sType;
     63 		DE_NULL,									// const void*		pNext;
     64 		srcAccessMask,								// VkAccessFlags	srcAccessMask;
     65 		dstAccessMask,								// VkAccessFlags	dstAccessMask;
     66 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			srcQueueFamilyIndex;
     67 		VK_QUEUE_FAMILY_IGNORED,					// deUint32			destQueueFamilyIndex;
     68 		buffer,										// VkBuffer			buffer;
     69 		offset,										// VkDeviceSize		offset;
     70 		bufferSizeBytes,							// VkDeviceSize		size;
     71 	};
     72 	return barrier;
     73 }
     74 
     75 VkImageMemoryBarrier makeImageMemoryBarrier	(const VkAccessFlags			srcAccessMask,
     76 											 const VkAccessFlags			dstAccessMask,
     77 											 const VkImageLayout			oldLayout,
     78 											 const VkImageLayout			newLayout,
     79 											 const VkImage					image,
     80 											 const VkImageSubresourceRange	subresourceRange)
     81 {
     82 	const VkImageMemoryBarrier barrier =
     83 	{
     84 		VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,			// VkStructureType			sType;
     85 		DE_NULL,										// const void*				pNext;
     86 		srcAccessMask,									// VkAccessFlags			outputMask;
     87 		dstAccessMask,									// VkAccessFlags			inputMask;
     88 		oldLayout,										// VkImageLayout			oldLayout;
     89 		newLayout,										// VkImageLayout			newLayout;
     90 		VK_QUEUE_FAMILY_IGNORED,						// deUint32					srcQueueFamilyIndex;
     91 		VK_QUEUE_FAMILY_IGNORED,						// deUint32					destQueueFamilyIndex;
     92 		image,											// VkImage					image;
     93 		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
     94 	};
     95 	return barrier;
     96 }
     97 
     98 Move<VkCommandPool> makeCommandPool (const DeviceInterface& vk, const VkDevice device, const deUint32 queueFamilyIndex)
     99 {
    100 	const VkCommandPoolCreateInfo info =
    101 	{
    102 		VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,			// VkStructureType			sType;
    103 		DE_NULL,											// const void*				pNext;
    104 		VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,	// VkCommandPoolCreateFlags	flags;
    105 		queueFamilyIndex,									// deUint32					queueFamilyIndex;
    106 	};
    107 	return createCommandPool(vk, device, &info);
    108 }
    109 
    110 Move<VkCommandBuffer> makeCommandBuffer (const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool)
    111 {
    112 	const VkCommandBufferAllocateInfo info =
    113 	{
    114 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,		// VkStructureType		sType;
    115 		DE_NULL,											// const void*			pNext;
    116 		commandPool,										// VkCommandPool		commandPool;
    117 		VK_COMMAND_BUFFER_LEVEL_PRIMARY,					// VkCommandBufferLevel	level;
    118 		1u,													// deUint32				commandBufferCount;
    119 	};
    120 	return allocateCommandBuffer(vk, device, &info);
    121 }
    122 
    123 Move<VkDescriptorSet> makeDescriptorSet (const DeviceInterface&			vk,
    124 										 const VkDevice					device,
    125 										 const VkDescriptorPool			descriptorPool,
    126 										 const VkDescriptorSetLayout	setLayout)
    127 {
    128 	const VkDescriptorSetAllocateInfo info =
    129 	{
    130 		VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,		// VkStructureType				sType;
    131 		DE_NULL,											// const void*					pNext;
    132 		descriptorPool,										// VkDescriptorPool				descriptorPool;
    133 		1u,													// deUint32						descriptorSetCount;
    134 		&setLayout,											// const VkDescriptorSetLayout*	pSetLayouts;
    135 	};
    136 	return allocateDescriptorSet(vk, device, &info);
    137 }
    138 
    139 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
    140 										   const VkDevice				device)
    141 {
    142 	const VkPipelineLayoutCreateInfo info =
    143 	{
    144 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
    145 		DE_NULL,											// const void*					pNext;
    146 		(VkPipelineLayoutCreateFlags)0,						// VkPipelineLayoutCreateFlags	flags;
    147 		0u,													// deUint32						setLayoutCount;
    148 		DE_NULL,											// const VkDescriptorSetLayout*	pSetLayouts;
    149 		0u,													// deUint32						pushConstantRangeCount;
    150 		DE_NULL,											// const VkPushConstantRange*	pPushConstantRanges;
    151 	};
    152 	return createPipelineLayout(vk, device, &info);
    153 }
    154 
    155 Move<VkPipelineLayout> makePipelineLayout (const DeviceInterface&		vk,
    156 										   const VkDevice				device,
    157 										   const VkDescriptorSetLayout	descriptorSetLayout)
    158 {
    159 	const VkPipelineLayoutCreateInfo info =
    160 	{
    161 		VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,		// VkStructureType				sType;
    162 		DE_NULL,											// const void*					pNext;
    163 		(VkPipelineLayoutCreateFlags)0,						// VkPipelineLayoutCreateFlags	flags;
    164 		1u,													// deUint32						setLayoutCount;
    165 		&descriptorSetLayout,								// const VkDescriptorSetLayout*	pSetLayouts;
    166 		0u,													// deUint32						pushConstantRangeCount;
    167 		DE_NULL,											// const VkPushConstantRange*	pPushConstantRanges;
    168 	};
    169 	return createPipelineLayout(vk, device, &info);
    170 }
    171 
    172 Move<VkPipeline> makeComputePipeline (const DeviceInterface&		vk,
    173 									  const VkDevice				device,
    174 									  const VkPipelineLayout		pipelineLayout,
    175 									  const VkShaderModule			shaderModule,
    176 									  const VkSpecializationInfo*	specInfo)
    177 {
    178 	const VkPipelineShaderStageCreateInfo shaderStageInfo =
    179 	{
    180 		VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,	// VkStructureType					sType;
    181 		DE_NULL,												// const void*						pNext;
    182 		(VkPipelineShaderStageCreateFlags)0,					// VkPipelineShaderStageCreateFlags	flags;
    183 		VK_SHADER_STAGE_COMPUTE_BIT,							// VkShaderStageFlagBits			stage;
    184 		shaderModule,											// VkShaderModule					module;
    185 		"main",													// const char*						pName;
    186 		specInfo,												// const VkSpecializationInfo*		pSpecializationInfo;
    187 	};
    188 	const VkComputePipelineCreateInfo pipelineInfo =
    189 	{
    190 		VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,		// VkStructureType					sType;
    191 		DE_NULL,											// const void*						pNext;
    192 		(VkPipelineCreateFlags)0,							// VkPipelineCreateFlags			flags;
    193 		shaderStageInfo,									// VkPipelineShaderStageCreateInfo	stage;
    194 		pipelineLayout,										// VkPipelineLayout					layout;
    195 		DE_NULL,											// VkPipeline						basePipelineHandle;
    196 		0,													// deInt32							basePipelineIndex;
    197 	};
    198 	return createComputePipeline(vk, device, DE_NULL , &pipelineInfo);
    199 }
    200 
    201 Move<VkImageView> makeImageView (const DeviceInterface&			vk,
    202 								 const VkDevice					vkDevice,
    203 								 const VkImage					image,
    204 								 const VkImageViewType			viewType,
    205 								 const VkFormat					format,
    206 								 const VkImageSubresourceRange	subresourceRange)
    207 {
    208 	const VkImageViewCreateInfo imageViewParams =
    209 	{
    210 		VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,		// VkStructureType			sType;
    211 		DE_NULL,										// const void*				pNext;
    212 		(VkImageViewCreateFlags)0,						// VkImageViewCreateFlags	flags;
    213 		image,											// VkImage					image;
    214 		viewType,										// VkImageViewType			viewType;
    215 		format,											// VkFormat					format;
    216 		makeComponentMappingRGBA(),						// VkComponentMapping		components;
    217 		subresourceRange,								// VkImageSubresourceRange	subresourceRange;
    218 	};
    219 	return createImageView(vk, vkDevice, &imageViewParams);
    220 }
    221 
    222 void beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
    223 {
    224 	const VkCommandBufferBeginInfo info =
    225 	{
    226 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType                          sType;
    227 		DE_NULL,										// const void*                              pNext;
    228 		VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,	// VkCommandBufferUsageFlags                flags;
    229 		DE_NULL,										// const VkCommandBufferInheritanceInfo*    pInheritanceInfo;
    230 	};
    231 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &info));
    232 }
    233 
    234 void submitCommandsAndWait (const DeviceInterface&	vk,
    235 							const VkDevice			device,
    236 							const VkQueue			queue,
    237 							const VkCommandBuffer	commandBuffer)
    238 {
    239 	const VkFenceCreateInfo fenceInfo =
    240 	{
    241 		VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,	// VkStructureType		sType;
    242 		DE_NULL,								// const void*			pNext;
    243 		(VkFenceCreateFlags)0,					// VkFenceCreateFlags	flags;
    244 	};
    245 	const Unique<VkFence> fence(createFence(vk, device, &fenceInfo));
    246 
    247 	const VkSubmitInfo submitInfo =
    248 	{
    249 		VK_STRUCTURE_TYPE_SUBMIT_INFO,		// VkStructureType                sType;
    250 		DE_NULL,							// const void*                    pNext;
    251 		0u,									// uint32_t                       waitSemaphoreCount;
    252 		DE_NULL,							// const VkSemaphore*             pWaitSemaphores;
    253 		DE_NULL,							// const VkPipelineStageFlags*    pWaitDstStageMask;
    254 		1u,									// uint32_t                       commandBufferCount;
    255 		&commandBuffer,						// const VkCommandBuffer*         pCommandBuffers;
    256 		0u,									// uint32_t                       signalSemaphoreCount;
    257 		DE_NULL,							// const VkSemaphore*             pSignalSemaphores;
    258 	};
    259 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
    260 	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
    261 }
    262 
    263 Move<VkFramebuffer> makeFramebuffer (const DeviceInterface&		vk,
    264 									 const VkDevice				device,
    265 									 const VkRenderPass			renderPass,
    266 									 const deUint32				attachmentCount,
    267 									 const VkImageView*			pAttachments,
    268 									 const deUint32				width,
    269 									 const deUint32				height,
    270 									 const deUint32				layers)
    271 {
    272 	const VkFramebufferCreateInfo framebufferInfo = {
    273 		VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,		// VkStructureType                             sType;
    274 		DE_NULL,										// const void*                                 pNext;
    275 		(VkFramebufferCreateFlags)0,					// VkFramebufferCreateFlags                    flags;
    276 		renderPass,										// VkRenderPass                                renderPass;
    277 		attachmentCount,								// uint32_t                                    attachmentCount;
    278 		pAttachments,									// const VkImageView*                          pAttachments;
    279 		width,											// uint32_t                                    width;
    280 		height,											// uint32_t                                    height;
    281 		layers,											// uint32_t                                    layers;
    282 	};
    283 
    284 	return createFramebuffer(vk, device, &framebufferInfo);
    285 }
    286 
    287 MovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement)
    288 {
    289 	MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement);
    290 	VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset()));
    291 	return alloc;
    292 }
    293 
    294 MovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement)
    295 {
    296 	MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement));
    297 	VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset()));
    298 	return alloc;
    299 }
    300 
    301 } // FragmentOperations
    302 } // vkt
    303