Home | History | Annotate | Download | only in vulkan
      1 /*-------------------------------------------------------------------------
      2  * Vulkan CTS Framework
      3  * --------------------
      4  *
      5  * Copyright (c) 2018 Google 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 Utilities for commonly used command tasks
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "vkCmdUtil.hpp"
     25 #include "vkDefs.hpp"
     26 #include "vkRefUtil.hpp"
     27 #include "vkTypeUtil.hpp"
     28 
     29 namespace vk
     30 {
     31 
     32 void beginCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer, VkCommandBufferUsageFlags flags)
     33 {
     34 	const VkCommandBufferBeginInfo commandBufBeginParams =
     35 	{
     36 		VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,	// VkStructureType                  sType;
     37 		DE_NULL,										// const void*                      pNext;
     38 		flags,											// VkCommandBufferUsageFlags        flags;
     39 		(const VkCommandBufferInheritanceInfo*)DE_NULL,
     40 	};
     41 	VK_CHECK(vk.beginCommandBuffer(commandBuffer, &commandBufBeginParams));
     42 }
     43 
     44 void endCommandBuffer (const DeviceInterface& vk, const VkCommandBuffer commandBuffer)
     45 {
     46 	VK_CHECK(vk.endCommandBuffer(commandBuffer));
     47 }
     48 
     49 void beginRenderPass (const DeviceInterface&	vk,
     50 					  const VkCommandBuffer		commandBuffer,
     51 					  const VkRenderPass		renderPass,
     52 					  const VkFramebuffer		framebuffer,
     53 					  const VkRect2D&			renderArea,
     54 					  const deUint32			clearValueCount,
     55 					  const VkClearValue*		clearValues,
     56 					  const VkSubpassContents	contents)
     57 {
     58 	const VkRenderPassBeginInfo	renderPassBeginInfo	=
     59 	{
     60 		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,	// VkStructureType         sType;
     61 		DE_NULL,									// const void*             pNext;
     62 		renderPass,									// VkRenderPass            renderPass;
     63 		framebuffer,								// VkFramebuffer           framebuffer;
     64 		renderArea,									// VkRect2D                renderArea;
     65 		clearValueCount,							// deUint32                clearValueCount;
     66 		clearValues,								// const VkClearValue*     pClearValues;
     67 	};
     68 
     69 	vk.cmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, contents);
     70 }
     71 
     72 void beginRenderPass (const DeviceInterface&	vk,
     73 					  const VkCommandBuffer		commandBuffer,
     74 					  const VkRenderPass		renderPass,
     75 					  const VkFramebuffer		framebuffer,
     76 					  const VkRect2D&			renderArea,
     77 					  const VkClearValue&		clearValue,
     78 					  const VkSubpassContents	contents)
     79 {
     80 	beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, 1u, &clearValue, contents);
     81 }
     82 
     83 void beginRenderPass (const DeviceInterface&	vk,
     84 					  const VkCommandBuffer		commandBuffer,
     85 					  const VkRenderPass		renderPass,
     86 					  const VkFramebuffer		framebuffer,
     87 					  const VkRect2D&			renderArea,
     88 					  const tcu::Vec4&			clearColor,
     89 					  const VkSubpassContents	contents)
     90 {
     91 	const VkClearValue clearValue = makeClearValueColor(clearColor);
     92 
     93 	beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, clearValue, contents);
     94 }
     95 
     96 void beginRenderPass (const DeviceInterface&	vk,
     97 					  const VkCommandBuffer		commandBuffer,
     98 					  const VkRenderPass		renderPass,
     99 					  const VkFramebuffer		framebuffer,
    100 					  const VkRect2D&			renderArea,
    101 					  const tcu::UVec4&			clearColor,
    102 					  const VkSubpassContents	contents)
    103 {
    104 	const VkClearValue clearValue = makeClearValueColorU32(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
    105 
    106 	beginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, clearValue, contents);
    107 }
    108 
    109 void beginRenderPass (const DeviceInterface&	vk,
    110 					  const VkCommandBuffer		commandBuffer,
    111 					  const VkRenderPass		renderPass,
    112 					  const VkFramebuffer		framebuffer,
    113 					  const VkRect2D&			renderArea,
    114 					  const VkSubpassContents	contents)
    115 {
    116 	const VkRenderPassBeginInfo renderPassBeginInfo =
    117 	{
    118 		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,	// VkStructureType         sType;
    119 		DE_NULL,									// const void*             pNext;
    120 		renderPass,									// VkRenderPass            renderPass;
    121 		framebuffer,								// VkFramebuffer           framebuffer;
    122 		renderArea,									// VkRect2D                renderArea;
    123 		0u,											// deUint32                clearValueCount;
    124 		DE_NULL,									// const VkClearValue*     pClearValues;
    125 	};
    126 
    127 	vk.cmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, contents);
    128 }
    129 
    130 void beginRenderPass (const DeviceInterface&	vk,
    131 					  const VkCommandBuffer		commandBuffer,
    132 					  const VkRenderPass		renderPass,
    133 					  const VkFramebuffer		framebuffer,
    134 					  const VkRect2D&			renderArea,
    135 					  const tcu::Vec4&			clearColor,
    136 					  const float				clearDepth,
    137 					  const deUint32			clearStencil,
    138 					  const VkSubpassContents	contents)
    139 {
    140 	const VkClearValue			clearValues[]		=
    141 	{
    142 		makeClearValueColor(clearColor),						// attachment 0
    143 		makeClearValueDepthStencil(clearDepth, clearStencil),	// attachment 1
    144 	};
    145 
    146 	const VkRenderPassBeginInfo	renderPassBeginInfo	=
    147 	{
    148 		VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,	// VkStructureType         sType;
    149 		DE_NULL,									// const void*             pNext;
    150 		renderPass,									// VkRenderPass            renderPass;
    151 		framebuffer,								// VkFramebuffer           framebuffer;
    152 		renderArea,									// VkRect2D                renderArea;
    153 		DE_LENGTH_OF_ARRAY(clearValues),			// deUint32                clearValueCount;
    154 		clearValues,								// const VkClearValue*     pClearValues;
    155 	};
    156 
    157 	vk.cmdBeginRenderPass(commandBuffer, &renderPassBeginInfo, contents);
    158 }
    159 
    160 void endRenderPass (const DeviceInterface&	vk,
    161 					const VkCommandBuffer	commandBuffer)
    162 {
    163 	vk.cmdEndRenderPass(commandBuffer);
    164 }
    165 
    166 void submitCommandsAndWait (const DeviceInterface&	vk,
    167 							const VkDevice			device,
    168 							const VkQueue			queue,
    169 							const VkCommandBuffer	commandBuffer,
    170 							const bool				useDeviceGroups,
    171 							const deUint32			deviceMask)
    172 {
    173 	const Unique<VkFence>	fence					(createFence(vk, device));
    174 
    175 	VkDeviceGroupSubmitInfo	deviceGroupSubmitInfo	=
    176 	{
    177 		VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR,	//	VkStructureType		sType;
    178 		DE_NULL,										//	const void*			pNext;
    179 		0u,												//	deUint32			waitSemaphoreCount;
    180 		DE_NULL,										//	const deUint32*		pWaitSemaphoreDeviceIndices;
    181 		1u,												//	deUint32			commandBufferCount;
    182 		&deviceMask,									//	const deUint32*		pCommandBufferDeviceMasks;
    183 		0u,												//	deUint32			signalSemaphoreCount;
    184 		DE_NULL,										//	const deUint32*		pSignalSemaphoreDeviceIndices;
    185 	};
    186 
    187 	const VkSubmitInfo		submitInfo				=
    188 	{
    189 		VK_STRUCTURE_TYPE_SUBMIT_INFO,						// VkStructureType				sType;
    190 		useDeviceGroups ? &deviceGroupSubmitInfo : DE_NULL,	// const void*					pNext;
    191 		0u,													// deUint32						waitSemaphoreCount;
    192 		DE_NULL,											// const VkSemaphore*			pWaitSemaphores;
    193 		(const VkPipelineStageFlags*)DE_NULL,				// const VkPipelineStageFlags*	pWaitDstStageMask;
    194 		1u,													// deUint32						commandBufferCount;
    195 		&commandBuffer,										// const VkCommandBuffer*		pCommandBuffers;
    196 		0u,													// deUint32						signalSemaphoreCount;
    197 		DE_NULL,											// const VkSemaphore*			pSignalSemaphores;
    198 	};
    199 
    200 	VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, *fence));
    201 	VK_CHECK(vk.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
    202 }
    203 
    204 } // vk
    205