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