Home | History | Annotate | Download | only in vulkan
      1 #ifndef _VKTEXTERNALMEMORYUTIL_HPP
      2 #define _VKTEXTERNALMEMORYUTIL_HPP
      3 /*-------------------------------------------------------------------------
      4  * Vulkan Conformance Tests
      5  * ------------------------
      6  *
      7  * Copyright (c) 2016 Google Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  * \brief Vulkan external memory utilities
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "tcuDefs.hpp"
     25 
     26 #include "vkPlatform.hpp"
     27 #include "vkRefUtil.hpp"
     28 
     29 namespace vkt
     30 {
     31 namespace ExternalMemoryUtil
     32 {
     33 
     34 class NativeHandle
     35 {
     36 public:
     37 	enum Win32HandleType
     38 	{
     39 		WIN32HANDLETYPE_NT = 0,
     40 		WIN32HANDLETYPE_KMT,
     41 
     42 		WIN32HANDLETYPE_LAST
     43 	};
     44 
     45 										NativeHandle				(void);
     46 										NativeHandle				(const NativeHandle& other);
     47 										NativeHandle				(int fd);
     48 										NativeHandle				(Win32HandleType type, vk::pt::Win32Handle handle);
     49 										NativeHandle				(vk::pt::AndroidHardwareBufferPtr buffer);
     50 										~NativeHandle				(void);
     51 
     52 	NativeHandle&						operator=					(int fd);
     53 	NativeHandle&						operator=					(vk::pt::AndroidHardwareBufferPtr buffer);
     54 
     55 	void								setWin32Handle				(Win32HandleType type, vk::pt::Win32Handle handle);
     56 
     57 	vk::pt::Win32Handle					getWin32Handle				(void) const;
     58 	int									getFd						(void) const;
     59 	vk::pt::AndroidHardwareBufferPtr	getAndroidHardwareBuffer	(void) const;
     60 	void								disown						(void);
     61 	void								reset						(void);
     62 
     63 private:
     64 	int									m_fd;
     65 	Win32HandleType						m_win32HandleType;
     66 	vk::pt::Win32Handle					m_win32Handle;
     67 	vk::pt::AndroidHardwareBufferPtr	m_androidHardwareBuffer;
     68 
     69 	// Disabled
     70 	NativeHandle&						operator=					(const NativeHandle&);
     71 };
     72 
     73 const char*						externalSemaphoreTypeToName	(vk::VkExternalSemaphoreHandleTypeFlagBits	type);
     74 const char*						externalFenceTypeToName		(vk::VkExternalFenceHandleTypeFlagBits		type);
     75 const char*						externalMemoryTypeToName	(vk::VkExternalMemoryHandleTypeFlagBits		type);
     76 
     77 enum Permanence
     78 {
     79 	PERMANENCE_PERMANENT = 0,
     80 	PERMANENCE_TEMPORARY
     81 };
     82 
     83 enum Transference
     84 {
     85 	TRANSFERENCE_COPY = 0,
     86 	TRANSFERENCE_REFERENCE
     87 };
     88 
     89 bool							isSupportedPermanence				(vk::VkExternalSemaphoreHandleTypeFlagBits	type,
     90 																	 Permanence									permanence);
     91 Transference					getHandelTypeTransferences			(vk::VkExternalSemaphoreHandleTypeFlagBits	type);
     92 
     93 bool							isSupportedPermanence				(vk::VkExternalFenceHandleTypeFlagBits		type,
     94 																	 Permanence									permanence);
     95 Transference					getHandelTypeTransferences			(vk::VkExternalFenceHandleTypeFlagBits		type);
     96 
     97 int								getMemoryFd							(const vk::DeviceInterface&					vkd,
     98 																	 vk::VkDevice								device,
     99 																	 vk::VkDeviceMemory							memory,
    100 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType);
    101 
    102 void							getMemoryNative						(const vk::DeviceInterface&					vkd,
    103 																	 vk::VkDevice								device,
    104 																	 vk::VkDeviceMemory							memory,
    105 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    106 																	 NativeHandle&								nativeHandle);
    107 
    108 vk::Move<vk::VkSemaphore>		createExportableSemaphore			(const vk::DeviceInterface&					vkd,
    109 																	 vk::VkDevice								device,
    110 																	 vk::VkExternalSemaphoreHandleTypeFlagBits	externalType);
    111 
    112 int								getSemaphoreFd						(const vk::DeviceInterface&					vkd,
    113 																	 vk::VkDevice								device,
    114 																	 vk::VkSemaphore							semaphore,
    115 																	 vk::VkExternalSemaphoreHandleTypeFlagBits	externalType);
    116 
    117 void							getSemaphoreNative					(const vk::DeviceInterface&					vkd,
    118 																	 vk::VkDevice								device,
    119 																	 vk::VkSemaphore							semaphore,
    120 																	 vk::VkExternalSemaphoreHandleTypeFlagBits	externalType,
    121 																	 NativeHandle&								nativeHandle);
    122 
    123 void							importSemaphore						(const vk::DeviceInterface&					vkd,
    124 																	 const vk::VkDevice							device,
    125 																	 const vk::VkSemaphore						semaphore,
    126 																	 vk::VkExternalSemaphoreHandleTypeFlagBits	externalType,
    127 																	 NativeHandle&								handle,
    128 																	 vk::VkSemaphoreImportFlags					flags);
    129 
    130 vk::Move<vk::VkSemaphore>		createAndImportSemaphore			(const vk::DeviceInterface&					vkd,
    131 																	 const vk::VkDevice							device,
    132 																	 vk::VkExternalSemaphoreHandleTypeFlagBits	externalType,
    133 																	 NativeHandle&								handle,
    134 																	 vk::VkSemaphoreImportFlags					flags);
    135 
    136 vk::Move<vk::VkFence>			createExportableFence				(const vk::DeviceInterface&					vkd,
    137 																	 vk::VkDevice								device,
    138 																	 vk::VkExternalFenceHandleTypeFlagBits		externalType);
    139 
    140 int								getFenceFd							(const vk::DeviceInterface&					vkd,
    141 																	 vk::VkDevice								device,
    142 																	 vk::VkFence								fence,
    143 																	 vk::VkExternalFenceHandleTypeFlagBits		externalType);
    144 
    145 void							getFenceNative						(const vk::DeviceInterface&					vkd,
    146 																	 vk::VkDevice								device,
    147 																	 vk::VkFence								fence,
    148 																	 vk::VkExternalFenceHandleTypeFlagBits		externalType,
    149 																	 NativeHandle&								nativeHandle);
    150 
    151 void							importFence							(const vk::DeviceInterface&					vkd,
    152 																	 const vk::VkDevice							device,
    153 																	 const vk::VkFence							fence,
    154 																	 vk::VkExternalFenceHandleTypeFlagBits		externalType,
    155 																	 NativeHandle&								handle,
    156 																	 vk::VkFenceImportFlags						flags);
    157 
    158 vk::Move<vk::VkFence>			createAndImportFence				(const vk::DeviceInterface&					vkd,
    159 																	 const vk::VkDevice							device,
    160 																	 vk::VkExternalFenceHandleTypeFlagBits		externalType,
    161 																	 NativeHandle&								handle,
    162 																	 vk::VkFenceImportFlags						flags);
    163 
    164 vk::Move<vk::VkDeviceMemory>	allocateExportableMemory			(const vk::DeviceInterface&					vkd,
    165 																	 vk::VkDevice								device,
    166 																	 const vk::VkMemoryRequirements&			requirements,
    167 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    168 																	 deUint32&									exportedMemoryTypeIndex);
    169 
    170 // If buffer is not null use dedicated allocation
    171 vk::Move<vk::VkDeviceMemory>	allocateExportableMemory			(const vk::DeviceInterface&					vkd,
    172 																	 vk::VkDevice								device,
    173 																	 const vk::VkMemoryRequirements&			requirements,
    174 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    175 																	 vk::VkBuffer								buffer,
    176 																	 deUint32&									exportedMemoryTypeIndex);
    177 
    178 // If image is not null use dedicated allocation
    179 vk::Move<vk::VkDeviceMemory>	allocateExportableMemory			(const vk::DeviceInterface&					vkd,
    180 																	 vk::VkDevice								device,
    181 																	 const vk::VkMemoryRequirements&			requirements,
    182 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    183 																	 vk::VkImage								image,
    184 																	 deUint32&									exportedMemoryTypeIndex);
    185 
    186 // \note hostVisible argument is strict. Setting it to false will cause NotSupportedError to be thrown if non-host visible memory doesn't exist.
    187 // If buffer is not null use dedicated allocation
    188 vk::Move<vk::VkDeviceMemory>	allocateExportableMemory			(const vk::InstanceInterface&				vki,
    189 																	 vk::VkPhysicalDevice						physicalDevice,
    190 																	 const vk::DeviceInterface&					vkd,
    191 																	 vk::VkDevice								device,
    192 																	 const vk::VkMemoryRequirements&			requirements,
    193 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    194 																	 bool										hostVisible,
    195 																	 vk::VkBuffer								buffer,
    196 																	 deUint32&									exportedMemoryTypeIndex);
    197 
    198 vk::Move<vk::VkDeviceMemory>	importMemory						(const vk::DeviceInterface&					vkd,
    199 																	 vk::VkDevice								device,
    200 																	 const vk::VkMemoryRequirements&			requirements,
    201 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    202 																	 deUint32									memoryTypeIndex,
    203 																	 NativeHandle&								handle);
    204 
    205 vk::Move<vk::VkDeviceMemory>	importDedicatedMemory				(const vk::DeviceInterface&					vkd,
    206 																	 vk::VkDevice								device,
    207 																	 vk::VkBuffer								buffer,
    208 																	 const vk::VkMemoryRequirements&			requirements,
    209 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    210 																	 deUint32									memoryTypeIndex,
    211 																	 NativeHandle&								handle);
    212 
    213 vk::Move<vk::VkDeviceMemory>	importDedicatedMemory				(const vk::DeviceInterface&					vkd,
    214 																	 vk::VkDevice								device,
    215 																	 vk::VkImage								image,
    216 																	 const vk::VkMemoryRequirements&			requirements,
    217 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    218 																	 deUint32									memoryTypeIndex,
    219 																	 NativeHandle&								handle);
    220 
    221 vk::Move<vk::VkBuffer>			createExternalBuffer				(const vk::DeviceInterface&					vkd,
    222 																	 vk::VkDevice								device,
    223 																	 deUint32									queueFamilyIndex,
    224 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    225 																	 vk::VkDeviceSize							size,
    226 																	 vk::VkBufferCreateFlags					createFlags,
    227 																	 vk::VkBufferUsageFlags						usageFlags);
    228 
    229 vk::Move<vk::VkImage>			createExternalImage					(const vk::DeviceInterface&					vkd,
    230 																	 vk::VkDevice								device,
    231 																	 deUint32									queueFamilyIndex,
    232 																	 vk::VkExternalMemoryHandleTypeFlagBits		externalType,
    233 																	 vk::VkFormat								format,
    234 																	 deUint32									width,
    235 																	 deUint32									height,
    236 																	 vk::VkImageTiling							tiling,
    237 																	 vk::VkImageCreateFlags						createFlags,
    238 																	 vk::VkImageUsageFlags						usageFlags,
    239 																	 deUint32 mipLevels = 1u,
    240 																	 deUint32 arrayLayers = 1u);
    241 
    242 } // ExternalMemoryUtil
    243 } // vkt
    244 
    245 #endif // _VKTEXTERNALMEMORYUTIL_HPP
    246