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)
40 # include <sys/system_properties.h>
43 #if (DE_OS == DE_OS_ANDROID) && defined(__ANDROID_API_O__) && (DE_ANDROID_API >= __ANDROID_API_O__)
44 # include <android/hardware_buffer.h>
45 # include "deDynamicLibrary.hpp"
46 # define BUILT_WITH_ANDROID_HARDWARE_BUFFER 1
51 namespace ExternalMemoryUtil
55 deUint32 chooseMemoryType (deUint32 bits)
59 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= bits; memoryTypeIndex++)
61 if ((bits & (1u << memoryTypeIndex)) != 0)
62 return memoryTypeIndex;
65 DE_FATAL("No supported memory types");
71 NativeHandle::NativeHandle (void)
73 , m_win32HandleType (WIN32HANDLETYPE_LAST)
74 , m_win32Handle (DE_NULL)
75 , m_androidHardwareBuffer (DE_NULL)
79 NativeHandle::NativeHandle (const NativeHandle& other)
81 , m_win32HandleType (WIN32HANDLETYPE_LAST)
82 , m_win32Handle (DE_NULL)
83 , m_androidHardwareBuffer (DE_NULL)
87 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
88 DE_ASSERT(!other.m_win32Handle.internal);
89 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
90 m_fd = dup(other.m_fd);
93 DE_FATAL("Platform doesn't support file descriptors");
96 else if (other.m_win32Handle.internal)
98 #if (DE_OS == DE_OS_WIN32)
99 m_win32HandleType = other.m_win32HandleType;
101 switch (other.m_win32HandleType)
103 case WIN32HANDLETYPE_NT:
105 DE_ASSERT(other.m_fd == -1);
106 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
108 const HANDLE process = ::GetCurrentProcess();
109 ::DuplicateHandle(process, other.m_win32Handle.internal, process, &m_win32Handle.internal, 0, TRUE, DUPLICATE_SAME_ACCESS);
114 case WIN32HANDLETYPE_KMT:
116 m_win32Handle = other.m_win32Handle;
121 DE_FATAL("Unknown win32 handle type");
124 DE_FATAL("Platform doesn't support win32 handles");
127 else if (other.m_androidHardwareBuffer.internal)
129 DE_ASSERT(other.m_fd == -1);
130 DE_ASSERT(!other.m_win32Handle.internal);
131 m_androidHardwareBuffer = other.m_androidHardwareBuffer;
132 AndroidHardwareBufferExternalApi::getInstance()->acquire(m_androidHardwareBuffer);
135 DE_FATAL("Native handle can't be duplicated");
138 NativeHandle::NativeHandle (int fd)
140 , m_win32HandleType (WIN32HANDLETYPE_LAST)
141 , m_win32Handle (DE_NULL)
142 , m_androidHardwareBuffer (DE_NULL)
146 NativeHandle::NativeHandle (Win32HandleType handleType, vk::pt::Win32Handle handle)
148 , m_win32HandleType (handleType)
149 , m_win32Handle (handle)
150 , m_androidHardwareBuffer (DE_NULL)
154 NativeHandle::NativeHandle (vk::pt::AndroidHardwareBufferPtr buffer)
156 , m_win32HandleType (WIN32HANDLETYPE_LAST)
157 , m_win32Handle (DE_NULL)
158 , m_androidHardwareBuffer (buffer)
162 NativeHandle::~NativeHandle (void)
167 void NativeHandle::reset (void)
171 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX)
172 DE_ASSERT(!m_win32Handle.internal);
173 DE_ASSERT(!m_androidHardwareBuffer.internal);
176 DE_FATAL("Platform doesn't support file descriptors");
180 if (m_win32Handle.internal)
182 #if (DE_OS == DE_OS_WIN32)
183 switch (m_win32HandleType)
185 case WIN32HANDLETYPE_NT:
186 DE_ASSERT(m_fd == -1);
187 DE_ASSERT(!m_androidHardwareBuffer.internal);
188 ::CloseHandle((HANDLE)m_win32Handle.internal);
191 case WIN32HANDLETYPE_KMT:
195 DE_FATAL("Unknown win32 handle type");
198 DE_FATAL("Platform doesn't support win32 handles");
201 if (m_androidHardwareBuffer.internal)
203 DE_ASSERT(m_fd == -1);
204 DE_ASSERT(!m_win32Handle.internal);
205 AndroidHardwareBufferExternalApi::getInstance()->release(m_androidHardwareBuffer);
208 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
209 m_win32HandleType = WIN32HANDLETYPE_LAST;
210 m_androidHardwareBuffer = vk::pt::AndroidHardwareBufferPtr(DE_NULL);
213 NativeHandle& NativeHandle::operator= (int fd)
222 NativeHandle& NativeHandle::operator= (vk::pt::AndroidHardwareBufferPtr buffer)
226 m_androidHardwareBuffer = buffer;
231 void NativeHandle::setWin32Handle (Win32HandleType type, vk::pt::Win32Handle handle)
235 m_win32HandleType = type;
236 m_win32Handle = handle;
239 void NativeHandle::disown (void)
242 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
243 m_androidHardwareBuffer = vk::pt::AndroidHardwareBufferPtr(DE_NULL);
246 vk::pt::Win32Handle NativeHandle::getWin32Handle (void) const
248 DE_ASSERT(m_fd == -1);
249 DE_ASSERT(!m_androidHardwareBuffer.internal);
250 return m_win32Handle;
253 int NativeHandle::getFd (void) const
255 DE_ASSERT(!m_win32Handle.internal);
256 DE_ASSERT(!m_androidHardwareBuffer.internal);
261 vk::pt::AndroidHardwareBufferPtr NativeHandle::getAndroidHardwareBuffer (void) const
263 DE_ASSERT(m_fd == -1);
264 DE_ASSERT(!m_win32Handle.internal);
265 return m_androidHardwareBuffer;
268 const char* externalSemaphoreTypeToName (vk::VkExternalSemaphoreHandleTypeFlagBits type)
272 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
275 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
276 return "opaque_win32";
278 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
279 return "opaque_win32_kmt";
281 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT:
284 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
288 DE_FATAL("Unknown external semaphore type");
293 const char* externalFenceTypeToName (vk::VkExternalFenceHandleTypeFlagBits type)
297 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
300 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
301 return "opaque_win32";
303 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
304 return "opaque_win32_kmt";
306 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
310 DE_FATAL("Unknown external fence type");
315 const char* externalMemoryTypeToName (vk::VkExternalMemoryHandleTypeFlagBits type)
319 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
322 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
323 return "opaque_win32";
325 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
326 return "opaque_win32_kmt";
328 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
329 return "d3d11_texture";
331 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT:
332 return "d3d11_texture_kmt";
334 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
337 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
338 return "d3d12_resource";
340 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:
341 return "android_hardware_buffer";
344 DE_FATAL("Unknown external memory type");
349 bool isSupportedPermanence (vk::VkExternalSemaphoreHandleTypeFlagBits type,
350 Permanence permanence)
354 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
355 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
356 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
358 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
359 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
361 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
362 return permanence == PERMANENCE_TEMPORARY;
365 DE_FATAL("Unknown external semaphore type");
370 Transference getHandelTypeTransferences (vk::VkExternalSemaphoreHandleTypeFlagBits type)
374 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
375 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
376 return TRANSFERENCE_REFERENCE;
378 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
379 return TRANSFERENCE_REFERENCE;
381 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
382 return TRANSFERENCE_COPY;
385 DE_FATAL("Unknown external semaphore type");
386 return TRANSFERENCE_REFERENCE;
390 bool isSupportedPermanence (vk::VkExternalFenceHandleTypeFlagBits type,
391 Permanence permanence)
395 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
396 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
397 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
399 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
400 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
402 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
403 return permanence == PERMANENCE_TEMPORARY;
406 DE_FATAL("Unknown external fence type");
411 Transference getHandelTypeTransferences (vk::VkExternalFenceHandleTypeFlagBits type)
415 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
416 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
417 return TRANSFERENCE_REFERENCE;
419 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
420 return TRANSFERENCE_REFERENCE;
422 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
423 return TRANSFERENCE_COPY;
426 DE_FATAL("Unknown external fence type");
427 return TRANSFERENCE_REFERENCE;
431 int getMemoryFd (const vk::DeviceInterface& vkd,
433 vk::VkDeviceMemory memory,
434 vk::VkExternalMemoryHandleTypeFlagBits externalType)
436 const vk::VkMemoryGetFdInfoKHR info =
438 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
446 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
452 void getMemoryNative (const vk::DeviceInterface& vkd,
454 vk::VkDeviceMemory memory,
455 vk::VkExternalMemoryHandleTypeFlagBits externalType,
456 NativeHandle& nativeHandle)
458 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT)
460 const vk::VkMemoryGetFdInfoKHR info =
462 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
470 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
474 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
475 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
477 const vk::VkMemoryGetWin32HandleInfoKHR info =
479 vk::VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
485 vk::pt::Win32Handle handle (DE_NULL);
487 VK_CHECK(vkd.getMemoryWin32HandleKHR(device, &info, &handle));
489 switch (externalType)
491 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
492 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
495 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
496 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
500 DE_FATAL("Unknown external memory handle type");
503 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
505 if (!AndroidHardwareBufferExternalApi::getInstance())
507 TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
509 const vk::VkMemoryGetAndroidHardwareBufferInfoANDROID info =
511 vk::VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
516 vk::pt::AndroidHardwareBufferPtr ahb (DE_NULL);
518 VK_CHECK(vkd.getMemoryAndroidHardwareBufferANDROID(device, &info, &ahb));
519 TCU_CHECK(ahb.internal);
523 DE_FATAL("Unknown external memory handle type");
526 vk::Move<vk::VkFence> createExportableFence (const vk::DeviceInterface& vkd,
528 vk::VkExternalFenceHandleTypeFlagBits externalType)
530 const vk::VkExportFenceCreateInfo exportCreateInfo =
532 vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
534 (vk::VkExternalFenceHandleTypeFlags)externalType
536 const vk::VkFenceCreateInfo createInfo =
538 vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
543 return vk::createFence(vkd, device, &createInfo);
546 int getFenceFd (const vk::DeviceInterface& vkd,
549 vk::VkExternalFenceHandleTypeFlagBits externalType)
551 const vk::VkFenceGetFdInfoKHR info =
553 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
561 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
567 void getFenceNative (const vk::DeviceInterface& vkd,
570 vk::VkExternalFenceHandleTypeFlagBits externalType,
571 NativeHandle& nativeHandle)
573 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
574 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
576 const vk::VkFenceGetFdInfoKHR info =
578 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
586 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
590 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
591 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
593 const vk::VkFenceGetWin32HandleInfoKHR info =
595 vk::VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,
601 vk::pt::Win32Handle handle (DE_NULL);
603 VK_CHECK(vkd.getFenceWin32HandleKHR(device, &info, &handle));
605 switch (externalType)
607 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
608 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
611 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
612 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
616 DE_FATAL("Unknow external memory handle type");
620 DE_FATAL("Unknow external fence handle type");
623 void importFence (const vk::DeviceInterface& vkd,
624 const vk::VkDevice device,
625 const vk::VkFence fence,
626 vk::VkExternalFenceHandleTypeFlagBits externalType,
627 NativeHandle& handle,
628 vk::VkFenceImportFlags flags)
630 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
631 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
633 const vk::VkImportFenceFdInfoKHR importInfo =
635 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
643 VK_CHECK(vkd.importFenceFdKHR(device, &importInfo));
646 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
647 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
649 const vk::VkImportFenceWin32HandleInfoKHR importInfo =
651 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
656 handle.getWin32Handle(),
660 VK_CHECK(vkd.importFenceWin32HandleKHR(device, &importInfo));
661 // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way
665 DE_FATAL("Unknown fence external handle type");
668 vk::Move<vk::VkFence> createAndImportFence (const vk::DeviceInterface& vkd,
669 const vk::VkDevice device,
670 vk::VkExternalFenceHandleTypeFlagBits externalType,
671 NativeHandle& handle,
672 vk::VkFenceImportFlags flags)
674 vk::Move<vk::VkFence> fence (createFence(vkd, device));
676 importFence(vkd, device, *fence, externalType, handle, flags);
681 vk::Move<vk::VkSemaphore> createExportableSemaphore (const vk::DeviceInterface& vkd,
683 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
685 const vk::VkExportSemaphoreCreateInfo exportCreateInfo =
687 vk::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
689 (vk::VkExternalSemaphoreHandleTypeFlags)externalType
691 const vk::VkSemaphoreCreateInfo createInfo =
693 vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
698 return vk::createSemaphore(vkd, device, &createInfo);
701 int getSemaphoreFd (const vk::DeviceInterface& vkd,
703 vk::VkSemaphore semaphore,
704 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
706 const vk::VkSemaphoreGetFdInfoKHR info =
708 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
716 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
722 void getSemaphoreNative (const vk::DeviceInterface& vkd,
724 vk::VkSemaphore semaphore,
725 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
726 NativeHandle& nativeHandle)
728 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
729 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
731 const vk::VkSemaphoreGetFdInfoKHR info =
733 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
741 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
745 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
746 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
748 const vk::VkSemaphoreGetWin32HandleInfoKHR info =
750 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
756 vk::pt::Win32Handle handle (DE_NULL);
758 VK_CHECK(vkd.getSemaphoreWin32HandleKHR(device, &info, &handle));
760 switch (externalType)
762 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
763 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
766 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
767 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
771 DE_FATAL("Unknow external memory handle type");
775 DE_FATAL("Unknow external semaphore handle type");
778 void importSemaphore (const vk::DeviceInterface& vkd,
779 const vk::VkDevice device,
780 const vk::VkSemaphore semaphore,
781 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
782 NativeHandle& handle,
783 vk::VkSemaphoreImportFlags flags)
785 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
786 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
788 const vk::VkImportSemaphoreFdInfoKHR importInfo =
790 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
798 VK_CHECK(vkd.importSemaphoreFdKHR(device, &importInfo));
801 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
802 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
804 const vk::VkImportSemaphoreWin32HandleInfoKHR importInfo =
806 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
811 handle.getWin32Handle(),
815 VK_CHECK(vkd.importSemaphoreWin32HandleKHR(device, &importInfo));
816 // \note File descriptors and win32 handles behave differently, but this call wil make it seem like they would behave in same way
820 DE_FATAL("Unknown semaphore external handle type");
823 vk::Move<vk::VkSemaphore> createAndImportSemaphore (const vk::DeviceInterface& vkd,
824 const vk::VkDevice device,
825 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
826 NativeHandle& handle,
827 vk::VkSemaphoreImportFlags flags)
829 vk::Move<vk::VkSemaphore> semaphore (createSemaphore(vkd, device));
831 importSemaphore(vkd, device, *semaphore, externalType, handle, flags);
836 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
838 const vk::VkMemoryRequirements& requirements,
839 vk::VkExternalMemoryHandleTypeFlagBits externalType,
841 deUint32& exportedMemoryTypeIndex)
843 exportedMemoryTypeIndex = chooseMemoryType(requirements.memoryTypeBits);
844 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
846 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
852 const vk::VkExportMemoryAllocateInfo exportInfo =
854 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
855 !!buffer ? &dedicatedInfo : DE_NULL,
856 (vk::VkExternalMemoryHandleTypeFlags)externalType
858 const vk::VkMemoryAllocateInfo info =
860 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
863 exportedMemoryTypeIndex
865 return vk::allocateMemory(vkd, device, &info);
868 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
870 const vk::VkMemoryRequirements& requirements,
871 vk::VkExternalMemoryHandleTypeFlagBits externalType,
873 deUint32& exportedMemoryTypeIndex)
875 exportedMemoryTypeIndex = chooseMemoryType(requirements.memoryTypeBits);
876 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
878 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
884 const vk::VkExportMemoryAllocateInfo exportInfo =
886 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
887 !!image ? &dedicatedInfo : DE_NULL,
888 (vk::VkExternalMemoryHandleTypeFlags)externalType
890 const vk::VkMemoryAllocateInfo info =
892 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
895 exportedMemoryTypeIndex
897 return vk::allocateMemory(vkd, device, &info);
900 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::InstanceInterface& vki,
901 vk::VkPhysicalDevice physicalDevice,
902 const vk::DeviceInterface& vkd,
904 const vk::VkMemoryRequirements& requirements,
905 vk::VkExternalMemoryHandleTypeFlagBits externalType,
908 deUint32& exportedMemoryTypeIndex)
910 const vk::VkPhysicalDeviceMemoryProperties properties = vk::getPhysicalDeviceMemoryProperties(vki, physicalDevice);
912 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= requirements.memoryTypeBits; memoryTypeIndex++)
914 if (((requirements.memoryTypeBits & (1u << memoryTypeIndex)) != 0)
915 && (((properties.memoryTypes[memoryTypeIndex].propertyFlags & vk::VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) == hostVisible))
917 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
919 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
925 const vk::VkExportMemoryAllocateInfo exportInfo =
927 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
928 !!buffer ? &dedicatedInfo : DE_NULL,
929 (vk::VkExternalMemoryHandleTypeFlags)externalType
931 const vk::VkMemoryAllocateInfo info =
933 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
939 exportedMemoryTypeIndex = memoryTypeIndex;
940 return vk::allocateMemory(vkd, device, &info);
944 TCU_THROW(NotSupportedError, "No supported memory type found");
947 static vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
951 const vk::VkMemoryRequirements& requirements,
952 vk::VkExternalMemoryHandleTypeFlagBits externalType,
953 deUint32 memoryTypeIndex,
954 NativeHandle& handle)
956 const bool isDedicated = !!buffer || !!image;
958 DE_ASSERT(!buffer || !image);
960 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT)
962 const vk::VkImportMemoryFdInfoKHR importInfo =
964 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
969 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
971 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
976 const vk::VkMemoryAllocateInfo info =
978 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
979 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
981 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
983 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
989 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
990 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
992 const vk::VkImportMemoryWin32HandleInfoKHR importInfo =
994 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
997 handle.getWin32Handle(),
1000 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1002 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1007 const vk::VkMemoryAllocateInfo info =
1009 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1010 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1012 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1014 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1016 // The handle's owned reference must also be released. Do not discard the handle below.
1017 if (externalType != vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT)
1022 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
1024 AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance();
1027 TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
1030 deUint32 ahbFormat = 0;
1031 ahbApi->describe(handle.getAndroidHardwareBuffer(), DE_NULL, DE_NULL, DE_NULL, &ahbFormat, DE_NULL, DE_NULL);
1032 DE_ASSERT(ahbApi->ahbFormatIsBlob(ahbFormat) || image != 0);
1034 vk::VkImportAndroidHardwareBufferInfoANDROID importInfo =
1036 vk::VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
1038 handle.getAndroidHardwareBuffer()
1040 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1042 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
1047 const vk::VkMemoryAllocateInfo info =
1049 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1050 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1052 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1054 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1058 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
1060 AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance();
1063 TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
1066 deUint32 ahbFormat = 0;
1067 ahbApi->describe(handle.getAndroidHardwareBuffer(), DE_NULL, DE_NULL, DE_NULL, &ahbFormat, DE_NULL, DE_NULL);
1068 DE_ASSERT(ahbApi->ahbFormatIsBlob(ahbFormat) || image != 0);
1070 vk::VkImportAndroidHardwareBufferInfoANDROID importInfo =
1072 vk::VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
1074 handle.getAndroidHardwareBuffer()
1076 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1078 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
1083 const vk::VkMemoryAllocateInfo info =
1085 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1086 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1088 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1090 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1096 DE_FATAL("Unknown external memory type");
1097 return vk::Move<vk::VkDeviceMemory>();
1101 vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
1102 vk::VkDevice device,
1103 const vk::VkMemoryRequirements& requirements,
1104 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1105 deUint32 memoryTypeIndex,
1106 NativeHandle& handle)
1108 return importMemory(vkd, device, (vk::VkBuffer)0, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1111 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1112 vk::VkDevice device,
1113 vk::VkBuffer buffer,
1114 const vk::VkMemoryRequirements& requirements,
1115 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1116 deUint32 memoryTypeIndex,
1117 NativeHandle& handle)
1119 return importMemory(vkd, device, buffer, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1122 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1123 vk::VkDevice device,
1125 const vk::VkMemoryRequirements& requirements,
1126 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1127 deUint32 memoryTypeIndex,
1128 NativeHandle& handle)
1130 return importMemory(vkd, device, (vk::VkBuffer)0, image, requirements, externalType, memoryTypeIndex, handle);
1133 vk::Move<vk::VkBuffer> createExternalBuffer (const vk::DeviceInterface& vkd,
1134 vk::VkDevice device,
1135 deUint32 queueFamilyIndex,
1136 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1137 vk::VkDeviceSize size,
1138 vk::VkBufferCreateFlags createFlags,
1139 vk::VkBufferUsageFlags usageFlags)
1141 const vk::VkExternalMemoryBufferCreateInfo externalCreateInfo =
1143 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1145 (vk::VkExternalMemoryHandleTypeFlags)externalType
1147 const vk::VkBufferCreateInfo createInfo =
1149 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1150 &externalCreateInfo,
1154 vk::VK_SHARING_MODE_EXCLUSIVE,
1159 return vk::createBuffer(vkd, device, &createInfo);
1162 vk::Move<vk::VkImage> createExternalImage (const vk::DeviceInterface& vkd,
1163 vk::VkDevice device,
1164 deUint32 queueFamilyIndex,
1165 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1166 vk::VkFormat format,
1169 vk::VkImageTiling tiling,
1170 vk::VkImageCreateFlags createFlags,
1171 vk::VkImageUsageFlags usageFlags,
1173 deUint32 arrayLayers)
1175 const vk::VkExternalMemoryImageCreateInfo externalCreateInfo =
1177 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
1179 (vk::VkExternalMemoryHandleTypeFlags)externalType
1181 const vk::VkImageCreateInfo createInfo =
1183 vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1184 &externalCreateInfo,
1186 vk::VK_IMAGE_TYPE_2D,
1188 { width, height, 1u, },
1191 vk::VK_SAMPLE_COUNT_1_BIT,
1194 vk::VK_SHARING_MODE_EXCLUSIVE,
1197 vk::VK_IMAGE_LAYOUT_UNDEFINED
1200 return vk::createImage(vkd, device, &createInfo);
1203 #if (DE_OS == DE_OS_ANDROID)
1204 # if defined(__ANDROID_API_P__) && (DE_ANDROID_API >= __ANDROID_API_P__)
1205 # define BUILT_WITH_ANDROID_P_HARDWARE_BUFFER 1
1208 static deInt32 androidGetSdkVersion()
1210 static deInt32 sdkVersion = -1;
1213 char value[128] = {0};
1214 __system_property_get("ro.build.version.sdk", value);
1215 sdkVersion = static_cast<deInt32>(strtol(value, DE_NULL, 10));
1216 printf("SDK Version is %d\n", sdkVersion);
1221 static deInt32 checkAnbApiBuild()
1223 deInt32 sdkVersion = androidGetSdkVersion();
1224 #if !defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1225 // When testing AHB on Android-O and newer the CTS must be compiled against API26 or newer.
1226 DE_TEST_ASSERT(!(sdkVersion >= 26)); /* __ANDROID_API_O__ */
1227 #endif // !defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1228 #if !defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1229 // When testing AHB on Android-P and newer the CTS must be compiled against API28 or newer.
1230 DE_TEST_ASSERT(!(sdkVersion >= 28)); /*__ANDROID_API_P__ */
1231 #endif // !defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1235 bool AndroidHardwareBufferExternalApi::supportsAhb()
1237 return (checkAnbApiBuild() >= __ANDROID_API_O__);
1240 AndroidHardwareBufferExternalApi::AndroidHardwareBufferExternalApi()
1242 deInt32 sdkVersion = checkAnbApiBuild();
1243 if(sdkVersion >= __ANDROID_API_O__)
1245 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1246 if (!loadAhbDynamicApis(sdkVersion))
1248 // Couldn't load Android AHB system APIs.
1249 DE_TEST_ASSERT(false);
1252 // Invalid Android AHB APIs configuration. Please check the instructions on how to build NDK for Android.
1253 DE_TEST_ASSERT(false);
1254 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1258 AndroidHardwareBufferExternalApi::~AndroidHardwareBufferExternalApi()
1262 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1263 typedef int (*pfn_system_property_get)(const char *, char *);
1264 typedef int (*pfnAHardwareBuffer_allocate)(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer);
1265 typedef void (*pfnAHardwareBuffer_describe)(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc);
1266 typedef void (*pfnAHardwareBuffer_acquire)(AHardwareBuffer* buffer);
1267 typedef void (*pfnAHardwareBuffer_release)(AHardwareBuffer* buffer);
1271 pfnAHardwareBuffer_allocate allocate;
1272 pfnAHardwareBuffer_describe describe;
1273 pfnAHardwareBuffer_acquire acquire;
1274 pfnAHardwareBuffer_release release;
1277 static AhbFunctions ahbFunctions;
1279 static bool ahbFunctionsLoaded(AhbFunctions* pAhbFunctions)
1281 static bool ahbApiLoaded = false;
1283 ((pAhbFunctions->allocate != DE_NULL) &&
1284 (pAhbFunctions->describe != DE_NULL) &&
1285 (pAhbFunctions->acquire != DE_NULL) &&
1286 (pAhbFunctions->release != DE_NULL)))
1288 ahbApiLoaded = true;
1294 bool AndroidHardwareBufferExternalApi::loadAhbDynamicApis(deInt32 sdkVersion)
1296 if(sdkVersion >= __ANDROID_API_O__)
1298 if (!ahbFunctionsLoaded(&ahbFunctions))
1300 de::DynamicLibrary libnativewindow("libnativewindow.so");
1301 ahbFunctions.allocate = reinterpret_cast<pfnAHardwareBuffer_allocate>(libnativewindow.getFunction("AHardwareBuffer_allocate"));
1302 ahbFunctions.describe = reinterpret_cast<pfnAHardwareBuffer_describe>(libnativewindow.getFunction("AHardwareBuffer_describe"));
1303 ahbFunctions.acquire = reinterpret_cast<pfnAHardwareBuffer_acquire>(libnativewindow.getFunction("AHardwareBuffer_acquire"));
1304 ahbFunctions.release = reinterpret_cast<pfnAHardwareBuffer_release>(libnativewindow.getFunction("AHardwareBuffer_release"));
1306 return ahbFunctionsLoaded(&ahbFunctions);
1318 class AndroidHardwareBufferExternalApi26 : public AndroidHardwareBufferExternalApi
1322 virtual vk::pt::AndroidHardwareBufferPtr allocate(deUint32 width, deUint32 height, deUint32 layers, deUint32 format, deUint64 usage);
1323 virtual void acquire(vk::pt::AndroidHardwareBufferPtr buffer);
1324 virtual void release(vk::pt::AndroidHardwareBufferPtr buffer);
1325 virtual void describe(const vk::pt::AndroidHardwareBufferPtr buffer,
1332 virtual deUint64 vkUsageToAhbUsage(vk::VkImageUsageFlagBits vkFlag);
1333 virtual deUint64 vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlag);
1334 virtual deUint32 vkFormatToAhbFormat(vk::VkFormat vkFormat);
1335 virtual deUint64 mustSupportAhbUsageFlags();
1336 virtual bool ahbFormatIsBlob(deUint32 ahbFormat) { return (ahbFormat == AHARDWAREBUFFER_FORMAT_BLOB); };
1338 AndroidHardwareBufferExternalApi26() : AndroidHardwareBufferExternalApi() {};
1339 virtual ~AndroidHardwareBufferExternalApi26() {};
1342 // Stop the compiler generating methods of copy the object
1343 AndroidHardwareBufferExternalApi26(AndroidHardwareBufferExternalApi26 const& copy); // Not Implemented
1344 AndroidHardwareBufferExternalApi26& operator=(AndroidHardwareBufferExternalApi26 const& copy); // Not Implemented
1347 vk::pt::AndroidHardwareBufferPtr AndroidHardwareBufferExternalApi26::allocate( deUint32 width,
1353 AHardwareBuffer_Desc hbufferdesc = {
1356 layers, // number of images
1359 0u, // Stride in pixels, ignored for AHardwareBuffer_allocate()
1360 0u, // Initialize to zero, reserved for future use
1361 0u // Initialize to zero, reserved for future use
1364 AHardwareBuffer* hbuffer = DE_NULL;
1365 ahbFunctions.allocate(&hbufferdesc, &hbuffer);
1367 return vk::pt::AndroidHardwareBufferPtr(hbuffer);
1370 void AndroidHardwareBufferExternalApi26::acquire(vk::pt::AndroidHardwareBufferPtr buffer)
1372 ahbFunctions.acquire(static_cast<AHardwareBuffer*>(buffer.internal));
1375 void AndroidHardwareBufferExternalApi26::release(vk::pt::AndroidHardwareBufferPtr buffer)
1377 ahbFunctions.release(static_cast<AHardwareBuffer*>(buffer.internal));
1380 void AndroidHardwareBufferExternalApi26::describe( const vk::pt::AndroidHardwareBufferPtr buffer,
1388 AHardwareBuffer_Desc desc;
1389 ahbFunctions.describe(static_cast<const AHardwareBuffer*>(buffer.internal), &desc);
1390 if (width) *width = desc.width;
1391 if (height) *height = desc.height;
1392 if (layers) *layers = desc.layers;
1393 if (format) *format = desc.format;
1394 if (usage) *usage = desc.usage;
1395 if (stride) *stride = desc.stride;
1398 deUint64 AndroidHardwareBufferExternalApi26::vkUsageToAhbUsage(vk::VkImageUsageFlagBits vkFlags)
1402 case vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT:
1403 case vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT:
1404 // No AHB equivalent.
1406 case vk::VK_IMAGE_USAGE_SAMPLED_BIT:
1407 return AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
1408 case vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT:
1409 return AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
1410 case vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT:
1411 return AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
1417 deUint64 AndroidHardwareBufferExternalApi26::vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlags)
1421 case vk::VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT:
1422 case vk::VK_IMAGE_CREATE_EXTENDED_USAGE_BIT:
1423 // No AHB equivalent.
1425 case vk::VK_IMAGE_CREATE_PROTECTED_BIT:
1426 return AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
1432 deUint32 AndroidHardwareBufferExternalApi26::vkFormatToAhbFormat(vk::VkFormat vkFormat)
1436 case vk::VK_FORMAT_R8G8B8A8_UNORM:
1437 return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
1438 case vk::VK_FORMAT_R8G8B8_UNORM:
1439 return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
1440 case vk::VK_FORMAT_R5G6B5_UNORM_PACK16:
1441 return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
1442 case vk::VK_FORMAT_R16G16B16A16_SFLOAT:
1443 return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
1444 case vk::VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1445 return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
1451 deUint64 AndroidHardwareBufferExternalApi26::mustSupportAhbUsageFlags()
1453 return (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT);
1456 #if defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1457 class AndroidHardwareBufferExternalApi28 : public AndroidHardwareBufferExternalApi26
1461 virtual deUint64 vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlag);
1462 virtual deUint64 mustSupportAhbUsageFlags();
1464 AndroidHardwareBufferExternalApi28() : AndroidHardwareBufferExternalApi26() {};
1465 virtual ~AndroidHardwareBufferExternalApi28() {};
1468 // Stop the compiler generating methods of copy the object
1469 AndroidHardwareBufferExternalApi28(AndroidHardwareBufferExternalApi28 const& copy); // Not Implemented
1470 AndroidHardwareBufferExternalApi28& operator=(AndroidHardwareBufferExternalApi28 const& copy); // Not Implemented
1473 deUint64 AndroidHardwareBufferExternalApi28::vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlags)
1477 case vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT:
1478 return AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP;
1480 return AndroidHardwareBufferExternalApi26::vkCreateToAhbUsage(vkFlags);
1484 deUint64 AndroidHardwareBufferExternalApi28::mustSupportAhbUsageFlags()
1486 return AndroidHardwareBufferExternalApi26::mustSupportAhbUsageFlags() | AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP | AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE;
1489 #endif // defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1490 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1491 #endif // (DE_OS == DE_OS_ANDROID)
1493 AndroidHardwareBufferExternalApi* AndroidHardwareBufferExternalApi::getInstance()
1495 #if (DE_OS == DE_OS_ANDROID)
1496 deInt32 sdkVersion = checkAnbApiBuild();
1497 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1498 # if defined(__ANDROID_API_P__) && (DE_ANDROID_API >= __ANDROID_API_P__)
1499 if (sdkVersion >= __ANDROID_API_P__ )
1501 static AndroidHardwareBufferExternalApi28 api28Instance;
1502 return &api28Instance;
1505 # if defined(__ANDROID_API_O__) && (DE_ANDROID_API >= __ANDROID_API_O__)
1506 if (sdkVersion >= __ANDROID_API_O__ )
1508 static AndroidHardwareBufferExternalApi26 api26Instance;
1509 return &api26Instance;
1512 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1513 DE_UNREF(sdkVersion);
1514 #endif // DE_OS == DE_OS_ANDROID
1518 } // ExternalMemoryUtil