1 /*-------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2016 Google Inc.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * \brief Vulkan external memory utilities
20 *//*--------------------------------------------------------------------*/
22 #include "vktExternalMemoryUtil.hpp"
24 #include "vkQueryUtil.hpp"
26 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
30 # include <sys/types.h>
31 # include <sys/socket.h>
34 #if (DE_OS == DE_OS_WIN32)
35 # define WIN32_LEAN_AND_MEAN
39 #if (DE_OS == DE_OS_ANDROID) && defined(__ANDROID_API_O__) && (DE_ANDROID_API >= __ANDROID_API_O__)
40 # include <android/hardware_buffer.h>
41 # define USE_ANDROID_O_HARDWARE_BUFFER 1
46 namespace ExternalMemoryUtil
50 deUint32 chooseMemoryType (deUint32 bits)
54 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= bits; memoryTypeIndex++)
56 if ((bits & (1u << memoryTypeIndex)) != 0)
57 return memoryTypeIndex;
60 DE_FATAL("No supported memory types");
66 NativeHandle::NativeHandle (void)
68 , m_win32HandleType (WIN32HANDLETYPE_LAST)
69 , m_win32Handle (DE_NULL)
70 , m_androidHardwareBuffer (DE_NULL)
74 NativeHandle::NativeHandle (const NativeHandle& other)
76 , m_win32HandleType (WIN32HANDLETYPE_LAST)
77 , m_win32Handle (DE_NULL)
78 , m_androidHardwareBuffer (DE_NULL)
82 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
83 DE_ASSERT(!other.m_win32Handle.internal);
84 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
85 m_fd = dup(other.m_fd);
88 DE_FATAL("Platform doesn't support file descriptors");
91 else if (other.m_win32Handle.internal)
93 #if (DE_OS == DE_OS_WIN32)
94 m_win32HandleType = other.m_win32HandleType;
96 switch (other.m_win32HandleType)
98 case WIN32HANDLETYPE_NT:
100 DE_ASSERT(other.m_fd == -1);
101 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
103 const HANDLE process = ::GetCurrentProcess();
104 ::DuplicateHandle(process, other.m_win32Handle.internal, process, &m_win32Handle.internal, 0, TRUE, DUPLICATE_SAME_ACCESS);
109 case WIN32HANDLETYPE_KMT:
111 m_win32Handle = other.m_win32Handle;
116 DE_FATAL("Unknown win32 handle type");
119 DE_FATAL("Platform doesn't support win32 handles");
122 #if defined(USE_ANDROID_O_HARDWARE_BUFFER)
123 else if (other.m_androidHardwareBuffer.internal)
125 DE_ASSERT(other.m_fd == -1);
126 DE_ASSERT(!other.m_win32Handle.internal);
127 m_androidHardwareBuffer = other.m_androidHardwareBuffer;
128 AHardwareBuffer_acquire((AHardwareBuffer*)m_androidHardwareBuffer.internal);
132 DE_FATAL("Native handle can't be duplicated");
135 NativeHandle::NativeHandle (int fd)
137 , m_win32HandleType (WIN32HANDLETYPE_LAST)
138 , m_win32Handle (DE_NULL)
139 , m_androidHardwareBuffer (DE_NULL)
143 NativeHandle::NativeHandle (Win32HandleType handleType, vk::pt::Win32Handle handle)
145 , m_win32HandleType (handleType)
146 , m_win32Handle (handle)
147 , m_androidHardwareBuffer (DE_NULL)
151 NativeHandle::NativeHandle (vk::pt::AndroidHardwareBufferPtr buffer)
153 , m_win32HandleType (WIN32HANDLETYPE_LAST)
154 , m_win32Handle (DE_NULL)
155 , m_androidHardwareBuffer (buffer)
159 NativeHandle::~NativeHandle (void)
164 void NativeHandle::reset (void)
168 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
169 DE_ASSERT(!m_win32Handle.internal);
170 DE_ASSERT(!m_androidHardwareBuffer.internal);
173 DE_FATAL("Platform doesn't support file descriptors");
177 if (m_win32Handle.internal)
179 #if (DE_OS == DE_OS_WIN32)
180 switch (m_win32HandleType)
182 case WIN32HANDLETYPE_NT:
183 DE_ASSERT(m_fd == -1);
184 DE_ASSERT(!m_androidHardwareBuffer.internal);
185 ::CloseHandle((HANDLE)m_win32Handle.internal);
188 case WIN32HANDLETYPE_KMT:
192 DE_FATAL("Unknown win32 handle type");
195 DE_FATAL("Platform doesn't support win32 handles");
199 #if defined(USE_ANDROID_O_HARDWARE_BUFFER)
200 if (m_androidHardwareBuffer.internal)
202 DE_ASSERT(m_fd == -1);
203 DE_ASSERT(!m_win32Handle.internal);
204 AHardwareBuffer_release((AHardwareBuffer*)m_androidHardwareBuffer.internal);
209 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
210 m_win32HandleType = WIN32HANDLETYPE_LAST;
211 m_androidHardwareBuffer = vk::pt::AndroidHardwareBufferPtr(DE_NULL);
214 NativeHandle& NativeHandle::operator= (int fd)
223 NativeHandle& NativeHandle::operator= (vk::pt::AndroidHardwareBufferPtr buffer)
227 m_androidHardwareBuffer = buffer;
232 void NativeHandle::setWin32Handle (Win32HandleType type, vk::pt::Win32Handle handle)
236 m_win32HandleType = type;
237 m_win32Handle = handle;
240 void NativeHandle::disown (void)
243 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
244 m_androidHardwareBuffer = vk::pt::AndroidHardwareBufferPtr(DE_NULL);
247 vk::pt::Win32Handle NativeHandle::getWin32Handle (void) const
249 DE_ASSERT(m_fd == -1);
250 DE_ASSERT(!m_androidHardwareBuffer.internal);
251 return m_win32Handle;
254 int NativeHandle::getFd (void) const
256 DE_ASSERT(!m_win32Handle.internal);
257 DE_ASSERT(!m_androidHardwareBuffer.internal);
262 vk::pt::AndroidHardwareBufferPtr NativeHandle::getAndroidHardwareBuffer (void) const
264 DE_ASSERT(m_fd == -1);
265 DE_ASSERT(!m_win32Handle.internal);
266 return m_androidHardwareBuffer;
269 const char* externalSemaphoreTypeToName (vk::VkExternalSemaphoreHandleTypeFlagBits type)
273 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
276 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
277 return "opaque_win32";
279 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
280 return "opaque_win32_kmt";
282 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT:
285 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
289 DE_FATAL("Unknown external semaphore type");
294 const char* externalFenceTypeToName (vk::VkExternalFenceHandleTypeFlagBits type)
298 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
301 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
302 return "opaque_win32";
304 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
305 return "opaque_win32_kmt";
307 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
311 DE_FATAL("Unknown external fence type");
316 const char* externalMemoryTypeToName (vk::VkExternalMemoryHandleTypeFlagBits type)
320 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
323 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
324 return "opaque_win32";
326 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
327 return "opaque_win32_kmt";
329 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
330 return "d3d11_texture";
332 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT:
333 return "d3d11_texture_kmt";
335 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
338 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
339 return "d3d12_resource";
341 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:
342 return "android_hardware_buffer";
345 DE_FATAL("Unknown external memory type");
350 bool isSupportedPermanence (vk::VkExternalSemaphoreHandleTypeFlagBits type,
351 Permanence permanence)
355 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
356 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
357 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
359 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
360 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
362 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
363 return permanence == PERMANENCE_TEMPORARY;
366 DE_FATAL("Unknown external semaphore type");
371 Transference getHandelTypeTransferences (vk::VkExternalSemaphoreHandleTypeFlagBits type)
375 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
376 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
377 return TRANSFERENCE_REFERENCE;
379 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
380 return TRANSFERENCE_REFERENCE;
382 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
383 return TRANSFERENCE_COPY;
386 DE_FATAL("Unknown external semaphore type");
387 return TRANSFERENCE_REFERENCE;
391 bool isSupportedPermanence (vk::VkExternalFenceHandleTypeFlagBits type,
392 Permanence permanence)
396 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
397 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
398 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
400 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
401 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
403 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
404 return permanence == PERMANENCE_TEMPORARY;
407 DE_FATAL("Unknown external fence type");
412 Transference getHandelTypeTransferences (vk::VkExternalFenceHandleTypeFlagBits type)
416 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
417 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
418 return TRANSFERENCE_REFERENCE;
420 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
421 return TRANSFERENCE_REFERENCE;
423 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
424 return TRANSFERENCE_COPY;
427 DE_FATAL("Unknown external fence type");
428 return TRANSFERENCE_REFERENCE;
432 int getMemoryFd (const vk::DeviceInterface& vkd,
434 vk::VkDeviceMemory memory,
435 vk::VkExternalMemoryHandleTypeFlagBits externalType)
437 const vk::VkMemoryGetFdInfoKHR info =
439 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
447 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
453 void getMemoryNative (const vk::DeviceInterface& vkd,
455 vk::VkDeviceMemory memory,
456 vk::VkExternalMemoryHandleTypeFlagBits externalType,
457 NativeHandle& nativeHandle)
459 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT)
461 const vk::VkMemoryGetFdInfoKHR info =
463 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
471 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
475 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
476 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
478 const vk::VkMemoryGetWin32HandleInfoKHR info =
480 vk::VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
486 vk::pt::Win32Handle handle (DE_NULL);
488 VK_CHECK(vkd.getMemoryWin32HandleKHR(device, &info, &handle));
490 switch (externalType)
492 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
493 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
496 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
497 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
501 DE_FATAL("Unknown external memory handle type");
504 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
506 const vk::VkMemoryGetAndroidHardwareBufferInfoANDROID info =
508 vk::VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
513 vk::pt::AndroidHardwareBufferPtr ahb (DE_NULL);
515 VK_CHECK(vkd.getMemoryAndroidHardwareBufferANDROID(device, &info, &ahb));
516 TCU_CHECK(ahb.internal);
520 DE_FATAL("Unknown external memory handle type");
523 vk::Move<vk::VkFence> createExportableFence (const vk::DeviceInterface& vkd,
525 vk::VkExternalFenceHandleTypeFlagBits externalType)
527 const vk::VkExportFenceCreateInfo exportCreateInfo =
529 vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
531 (vk::VkExternalFenceHandleTypeFlags)externalType
533 const vk::VkFenceCreateInfo createInfo =
535 vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
540 return vk::createFence(vkd, device, &createInfo);
543 int getFenceFd (const vk::DeviceInterface& vkd,
546 vk::VkExternalFenceHandleTypeFlagBits externalType)
548 const vk::VkFenceGetFdInfoKHR info =
550 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
558 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
564 void getFenceNative (const vk::DeviceInterface& vkd,
567 vk::VkExternalFenceHandleTypeFlagBits externalType,
568 NativeHandle& nativeHandle)
570 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
571 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
573 const vk::VkFenceGetFdInfoKHR info =
575 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
583 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
587 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
588 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
590 const vk::VkFenceGetWin32HandleInfoKHR info =
592 vk::VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,
598 vk::pt::Win32Handle handle (DE_NULL);
600 VK_CHECK(vkd.getFenceWin32HandleKHR(device, &info, &handle));
602 switch (externalType)
604 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
605 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
608 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
609 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
613 DE_FATAL("Unknow external memory handle type");
617 DE_FATAL("Unknow external fence handle type");
620 void importFence (const vk::DeviceInterface& vkd,
621 const vk::VkDevice device,
622 const vk::VkFence fence,
623 vk::VkExternalFenceHandleTypeFlagBits externalType,
624 NativeHandle& handle,
625 vk::VkFenceImportFlags flags)
627 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
628 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
630 const vk::VkImportFenceFdInfoKHR importInfo =
632 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
640 VK_CHECK(vkd.importFenceFdKHR(device, &importInfo));
643 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
644 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
646 const vk::VkImportFenceWin32HandleInfoKHR importInfo =
648 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
653 handle.getWin32Handle(),
657 VK_CHECK(vkd.importFenceWin32HandleKHR(device, &importInfo));
658 // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way
662 DE_FATAL("Unknown fence external handle type");
665 vk::Move<vk::VkFence> createAndImportFence (const vk::DeviceInterface& vkd,
666 const vk::VkDevice device,
667 vk::VkExternalFenceHandleTypeFlagBits externalType,
668 NativeHandle& handle,
669 vk::VkFenceImportFlags flags)
671 vk::Move<vk::VkFence> fence (createFence(vkd, device));
673 importFence(vkd, device, *fence, externalType, handle, flags);
678 vk::Move<vk::VkSemaphore> createExportableSemaphore (const vk::DeviceInterface& vkd,
680 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
682 const vk::VkExportSemaphoreCreateInfo exportCreateInfo =
684 vk::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
686 (vk::VkExternalSemaphoreHandleTypeFlags)externalType
688 const vk::VkSemaphoreCreateInfo createInfo =
690 vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
695 return vk::createSemaphore(vkd, device, &createInfo);
698 int getSemaphoreFd (const vk::DeviceInterface& vkd,
700 vk::VkSemaphore semaphore,
701 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
703 const vk::VkSemaphoreGetFdInfoKHR info =
705 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
713 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
719 void getSemaphoreNative (const vk::DeviceInterface& vkd,
721 vk::VkSemaphore semaphore,
722 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
723 NativeHandle& nativeHandle)
725 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
726 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
728 const vk::VkSemaphoreGetFdInfoKHR info =
730 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
738 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
742 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
743 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
745 const vk::VkSemaphoreGetWin32HandleInfoKHR info =
747 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
753 vk::pt::Win32Handle handle (DE_NULL);
755 VK_CHECK(vkd.getSemaphoreWin32HandleKHR(device, &info, &handle));
757 switch (externalType)
759 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
760 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
763 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
764 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
768 DE_FATAL("Unknow external memory handle type");
772 DE_FATAL("Unknow external semaphore handle type");
775 void importSemaphore (const vk::DeviceInterface& vkd,
776 const vk::VkDevice device,
777 const vk::VkSemaphore semaphore,
778 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
779 NativeHandle& handle,
780 vk::VkSemaphoreImportFlags flags)
782 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
783 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
785 const vk::VkImportSemaphoreFdInfoKHR importInfo =
787 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
795 VK_CHECK(vkd.importSemaphoreFdKHR(device, &importInfo));
798 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
799 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
801 const vk::VkImportSemaphoreWin32HandleInfoKHR importInfo =
803 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
808 handle.getWin32Handle(),
812 VK_CHECK(vkd.importSemaphoreWin32HandleKHR(device, &importInfo));
813 // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way
817 DE_FATAL("Unknown semaphore external handle type");
820 vk::Move<vk::VkSemaphore> createAndImportSemaphore (const vk::DeviceInterface& vkd,
821 const vk::VkDevice device,
822 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
823 NativeHandle& handle,
824 vk::VkSemaphoreImportFlags flags)
826 vk::Move<vk::VkSemaphore> semaphore (createSemaphore(vkd, device));
828 importSemaphore(vkd, device, *semaphore, externalType, handle, flags);
833 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
835 const vk::VkMemoryRequirements& requirements,
836 vk::VkExternalMemoryHandleTypeFlagBits externalType,
838 deUint32& exportedMemoryTypeIndex)
840 exportedMemoryTypeIndex = chooseMemoryType(requirements.memoryTypeBits);
841 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
843 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
849 const vk::VkExportMemoryAllocateInfo exportInfo =
851 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
852 !!buffer ? &dedicatedInfo : DE_NULL,
853 (vk::VkExternalMemoryHandleTypeFlags)externalType
855 const vk::VkMemoryAllocateInfo info =
857 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
860 exportedMemoryTypeIndex
862 return vk::allocateMemory(vkd, device, &info);
865 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
867 const vk::VkMemoryRequirements& requirements,
868 vk::VkExternalMemoryHandleTypeFlagBits externalType,
870 deUint32& exportedMemoryTypeIndex)
872 exportedMemoryTypeIndex = chooseMemoryType(requirements.memoryTypeBits);
873 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
875 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
881 const vk::VkExportMemoryAllocateInfo exportInfo =
883 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
884 !!image ? &dedicatedInfo : DE_NULL,
885 (vk::VkExternalMemoryHandleTypeFlags)externalType
887 const vk::VkMemoryAllocateInfo info =
889 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
892 exportedMemoryTypeIndex
894 return vk::allocateMemory(vkd, device, &info);
897 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::InstanceInterface& vki,
898 vk::VkPhysicalDevice physicalDevice,
899 const vk::DeviceInterface& vkd,
901 const vk::VkMemoryRequirements& requirements,
902 vk::VkExternalMemoryHandleTypeFlagBits externalType,
905 deUint32& exportedMemoryTypeIndex)
907 const vk::VkPhysicalDeviceMemoryProperties properties = vk::getPhysicalDeviceMemoryProperties(vki, physicalDevice);
909 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= requirements.memoryTypeBits; memoryTypeIndex++)
911 if (((requirements.memoryTypeBits & (1u << memoryTypeIndex)) != 0)
912 && (((properties.memoryTypes[memoryTypeIndex].propertyFlags & vk::VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) == hostVisible))
914 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
916 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
922 const vk::VkExportMemoryAllocateInfo exportInfo =
924 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
925 !!buffer ? &dedicatedInfo : DE_NULL,
926 (vk::VkExternalMemoryHandleTypeFlags)externalType
928 const vk::VkMemoryAllocateInfo info =
930 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
936 exportedMemoryTypeIndex = memoryTypeIndex;
937 return vk::allocateMemory(vkd, device, &info);
941 TCU_THROW(NotSupportedError, "No supported memory type found");
944 static vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
948 const vk::VkMemoryRequirements& requirements,
949 vk::VkExternalMemoryHandleTypeFlagBits externalType,
950 deUint32 memoryTypeIndex,
951 NativeHandle& handle)
953 const bool isDedicated = !!buffer || !!image;
955 DE_ASSERT(!buffer || !image);
957 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT)
959 const vk::VkImportMemoryFdInfoKHR importInfo =
961 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
966 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
968 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
973 const vk::VkMemoryAllocateInfo info =
975 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
976 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
978 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
980 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
986 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
987 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
989 const vk::VkImportMemoryWin32HandleInfoKHR importInfo =
991 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
994 handle.getWin32Handle(),
997 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
999 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1004 const vk::VkMemoryAllocateInfo info =
1006 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1007 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1009 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1011 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1017 #if defined(USE_ANDROID_O_HARDWARE_BUFFER)
1018 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
1020 AHardwareBuffer_Desc desc;
1021 AHardwareBuffer_describe(static_cast<const AHardwareBuffer*>(handle.getAndroidHardwareBuffer().internal), &desc);
1023 DE_ASSERT(desc.format == AHARDWAREBUFFER_FORMAT_BLOB || image != 0);
1025 vk::VkImportAndroidHardwareBufferInfoANDROID importInfo =
1027 vk::VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
1029 handle.getAndroidHardwareBuffer()
1031 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1033 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
1038 const vk::VkMemoryAllocateInfo info =
1040 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1041 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1043 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1045 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1049 #endif // (USE_ANDROID_O_HARDWARE_BUFFER)
1052 DE_FATAL("Unknown external memory type");
1053 return vk::Move<vk::VkDeviceMemory>();
1057 vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
1058 vk::VkDevice device,
1059 const vk::VkMemoryRequirements& requirements,
1060 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1061 deUint32 memoryTypeIndex,
1062 NativeHandle& handle)
1064 return importMemory(vkd, device, (vk::VkBuffer)0, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1067 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1068 vk::VkDevice device,
1069 vk::VkBuffer buffer,
1070 const vk::VkMemoryRequirements& requirements,
1071 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1072 deUint32 memoryTypeIndex,
1073 NativeHandle& handle)
1075 return importMemory(vkd, device, buffer, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1078 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1079 vk::VkDevice device,
1081 const vk::VkMemoryRequirements& requirements,
1082 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1083 deUint32 memoryTypeIndex,
1084 NativeHandle& handle)
1086 return importMemory(vkd, device, (vk::VkBuffer)0, image, requirements, externalType, memoryTypeIndex, handle);
1089 vk::Move<vk::VkBuffer> createExternalBuffer (const vk::DeviceInterface& vkd,
1090 vk::VkDevice device,
1091 deUint32 queueFamilyIndex,
1092 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1093 vk::VkDeviceSize size,
1094 vk::VkBufferCreateFlags createFlags,
1095 vk::VkBufferUsageFlags usageFlags)
1097 const vk::VkExternalMemoryBufferCreateInfo externalCreateInfo =
1099 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1101 (vk::VkExternalMemoryHandleTypeFlags)externalType
1103 const vk::VkBufferCreateInfo createInfo =
1105 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1106 &externalCreateInfo,
1110 vk::VK_SHARING_MODE_EXCLUSIVE,
1115 return vk::createBuffer(vkd, device, &createInfo);
1118 vk::Move<vk::VkImage> createExternalImage (const vk::DeviceInterface& vkd,
1119 vk::VkDevice device,
1120 deUint32 queueFamilyIndex,
1121 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1122 vk::VkFormat format,
1125 vk::VkImageTiling tiling,
1126 vk::VkImageCreateFlags createFlags,
1127 vk::VkImageUsageFlags usageFlags,
1129 deUint32 arrayLayers)
1131 const vk::VkExternalMemoryImageCreateInfo externalCreateInfo =
1133 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
1135 (vk::VkExternalMemoryHandleTypeFlags)externalType
1137 const vk::VkImageCreateInfo createInfo =
1139 vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1140 &externalCreateInfo,
1142 vk::VK_IMAGE_TYPE_2D,
1144 { width, height, 1u, },
1147 vk::VK_SAMPLE_COUNT_1_BIT,
1150 vk::VK_SHARING_MODE_EXCLUSIVE,
1153 vk::VK_IMAGE_LAYOUT_UNDEFINED
1156 return vk::createImage(vkd, device, &createInfo);
1159 } // ExternalMemoryUtil