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) || (DE_OS == DE_OS_OSX)
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
58 NativeHandle::NativeHandle (void)
60 , m_win32HandleType (WIN32HANDLETYPE_LAST)
61 , m_win32Handle (DE_NULL)
62 , m_androidHardwareBuffer (DE_NULL)
67 NativeHandle::NativeHandle (const NativeHandle& other)
69 , m_win32HandleType (WIN32HANDLETYPE_LAST)
70 , m_win32Handle (DE_NULL)
71 , m_androidHardwareBuffer (DE_NULL)
76 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_OSX)
77 DE_ASSERT(!other.m_win32Handle.internal);
78 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
79 m_fd = dup(other.m_fd);
82 DE_FATAL("Platform doesn't support file descriptors");
85 else if (other.m_win32Handle.internal)
87 #if (DE_OS == DE_OS_WIN32)
88 m_win32HandleType = other.m_win32HandleType;
90 switch (other.m_win32HandleType)
92 case WIN32HANDLETYPE_NT:
94 DE_ASSERT(other.m_fd == -1);
95 DE_ASSERT(!other.m_androidHardwareBuffer.internal);
97 const HANDLE process = ::GetCurrentProcess();
98 ::DuplicateHandle(process, other.m_win32Handle.internal, process, &m_win32Handle.internal, 0, TRUE, DUPLICATE_SAME_ACCESS);
103 case WIN32HANDLETYPE_KMT:
105 m_win32Handle = other.m_win32Handle;
110 DE_FATAL("Unknown win32 handle type");
113 DE_FATAL("Platform doesn't support win32 handles");
116 else if (other.m_androidHardwareBuffer.internal)
118 DE_ASSERT(other.m_fd == -1);
119 DE_ASSERT(!other.m_win32Handle.internal);
120 m_androidHardwareBuffer = other.m_androidHardwareBuffer;
122 if (AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance())
123 ahbApi->acquire(m_androidHardwareBuffer);
125 DE_FATAL("Platform doesn't support Android Hardware Buffer handles");
128 DE_FATAL("Native handle can't be duplicated");
131 NativeHandle::NativeHandle (int fd)
133 , m_win32HandleType (WIN32HANDLETYPE_LAST)
134 , m_win32Handle (DE_NULL)
135 , m_androidHardwareBuffer (DE_NULL)
136 , m_hostPtr (DE_NULL)
140 NativeHandle::NativeHandle (Win32HandleType handleType, vk::pt::Win32Handle handle)
142 , m_win32HandleType (handleType)
143 , m_win32Handle (handle)
144 , m_androidHardwareBuffer (DE_NULL)
145 , m_hostPtr (DE_NULL)
149 NativeHandle::NativeHandle (vk::pt::AndroidHardwareBufferPtr buffer)
151 , m_win32HandleType (WIN32HANDLETYPE_LAST)
152 , m_win32Handle (DE_NULL)
153 , m_androidHardwareBuffer (buffer)
154 , m_hostPtr (DE_NULL)
158 NativeHandle::~NativeHandle (void)
163 void NativeHandle::reset (void)
167 #if (DE_OS == DE_OS_ANDROID) || (DE_OS == DE_OS_UNIX) || (DE_OS == DE_OS_OSX)
168 DE_ASSERT(!m_win32Handle.internal);
169 DE_ASSERT(!m_androidHardwareBuffer.internal);
172 DE_FATAL("Platform doesn't support file descriptors");
176 if (m_win32Handle.internal)
178 #if (DE_OS == DE_OS_WIN32)
179 switch (m_win32HandleType)
181 case WIN32HANDLETYPE_NT:
182 DE_ASSERT(m_fd == -1);
183 DE_ASSERT(!m_androidHardwareBuffer.internal);
184 ::CloseHandle((HANDLE)m_win32Handle.internal);
187 case WIN32HANDLETYPE_KMT:
191 DE_FATAL("Unknown win32 handle type");
194 DE_FATAL("Platform doesn't support win32 handles");
197 if (m_androidHardwareBuffer.internal)
199 DE_ASSERT(m_fd == -1);
200 DE_ASSERT(!m_win32Handle.internal);
202 if (AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance())
203 ahbApi->release(m_androidHardwareBuffer);
205 DE_FATAL("Platform doesn't support Android Hardware Buffer handles");
208 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
209 m_win32HandleType = WIN32HANDLETYPE_LAST;
210 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::setHostPtr(void* hostPtr)
247 void NativeHandle::disown (void)
250 m_win32Handle = vk::pt::Win32Handle(DE_NULL);
251 m_androidHardwareBuffer = vk::pt::AndroidHardwareBufferPtr(DE_NULL);
255 vk::pt::Win32Handle NativeHandle::getWin32Handle (void) const
257 DE_ASSERT(m_fd == -1);
258 DE_ASSERT(!m_androidHardwareBuffer.internal);
259 DE_ASSERT(m_hostPtr == DE_NULL);
261 return m_win32Handle;
264 int NativeHandle::getFd (void) const
266 DE_ASSERT(!m_win32Handle.internal);
267 DE_ASSERT(!m_androidHardwareBuffer.internal);
268 DE_ASSERT(m_hostPtr == DE_NULL);
272 vk::pt::AndroidHardwareBufferPtr NativeHandle::getAndroidHardwareBuffer (void) const
274 DE_ASSERT(m_fd == -1);
275 DE_ASSERT(!m_win32Handle.internal);
276 DE_ASSERT(m_hostPtr == DE_NULL);
277 return m_androidHardwareBuffer;
280 void* NativeHandle::getHostPtr(void) const
282 DE_ASSERT(m_fd == -1);
283 DE_ASSERT(!m_win32Handle.internal);
287 const char* externalSemaphoreTypeToName (vk::VkExternalSemaphoreHandleTypeFlagBits type)
291 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
294 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
295 return "opaque_win32";
297 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
298 return "opaque_win32_kmt";
300 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT:
303 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
307 DE_FATAL("Unknown external semaphore type");
312 const char* externalFenceTypeToName (vk::VkExternalFenceHandleTypeFlagBits type)
316 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
319 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
320 return "opaque_win32";
322 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
323 return "opaque_win32_kmt";
325 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
329 DE_FATAL("Unknown external fence type");
334 const char* externalMemoryTypeToName (vk::VkExternalMemoryHandleTypeFlagBits type)
338 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT:
341 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
342 return "opaque_win32";
344 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
345 return "opaque_win32_kmt";
347 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT:
348 return "d3d11_texture";
350 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT:
351 return "d3d11_texture_kmt";
353 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT:
356 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT:
357 return "d3d12_resource";
359 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID:
360 return "android_hardware_buffer";
362 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT:
365 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
366 return "host_allocation";
369 DE_FATAL("Unknown external memory type");
374 bool isSupportedPermanence (vk::VkExternalSemaphoreHandleTypeFlagBits type,
375 Permanence permanence)
379 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
380 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
381 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
383 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
384 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
386 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
387 return permanence == PERMANENCE_TEMPORARY;
390 DE_FATAL("Unknown external semaphore type");
395 Transference getHandelTypeTransferences (vk::VkExternalSemaphoreHandleTypeFlagBits type)
399 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
400 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
401 return TRANSFERENCE_REFERENCE;
403 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
404 return TRANSFERENCE_REFERENCE;
406 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
407 return TRANSFERENCE_COPY;
410 DE_FATAL("Unknown external semaphore type");
411 return TRANSFERENCE_REFERENCE;
415 bool isSupportedPermanence (vk::VkExternalFenceHandleTypeFlagBits type,
416 Permanence permanence)
420 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
421 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
422 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
424 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
425 return permanence == PERMANENCE_PERMANENT || permanence == PERMANENCE_TEMPORARY;
427 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
428 return permanence == PERMANENCE_TEMPORARY;
431 DE_FATAL("Unknown external fence type");
436 Transference getHandelTypeTransferences (vk::VkExternalFenceHandleTypeFlagBits type)
440 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
441 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
442 return TRANSFERENCE_REFERENCE;
444 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
445 return TRANSFERENCE_REFERENCE;
447 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
448 return TRANSFERENCE_COPY;
451 DE_FATAL("Unknown external fence type");
452 return TRANSFERENCE_REFERENCE;
456 int getMemoryFd (const vk::DeviceInterface& vkd,
458 vk::VkDeviceMemory memory,
459 vk::VkExternalMemoryHandleTypeFlagBits externalType)
461 const vk::VkMemoryGetFdInfoKHR info =
463 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
471 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
477 void getMemoryNative (const vk::DeviceInterface& vkd,
479 vk::VkDeviceMemory memory,
480 vk::VkExternalMemoryHandleTypeFlagBits externalType,
481 NativeHandle& nativeHandle)
483 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT
484 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)
486 const vk::VkMemoryGetFdInfoKHR info =
488 vk::VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
496 VK_CHECK(vkd.getMemoryFdKHR(device, &info, &fd));
500 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
501 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
503 const vk::VkMemoryGetWin32HandleInfoKHR info =
505 vk::VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
511 vk::pt::Win32Handle handle (DE_NULL);
513 VK_CHECK(vkd.getMemoryWin32HandleKHR(device, &info, &handle));
515 switch (externalType)
517 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT:
518 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
521 case vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
522 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
526 DE_FATAL("Unknown external memory handle type");
529 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
531 if (!AndroidHardwareBufferExternalApi::getInstance())
533 TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
535 const vk::VkMemoryGetAndroidHardwareBufferInfoANDROID info =
537 vk::VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
542 vk::pt::AndroidHardwareBufferPtr ahb (DE_NULL);
544 VK_CHECK(vkd.getMemoryAndroidHardwareBufferANDROID(device, &info, &ahb));
545 TCU_CHECK(ahb.internal);
549 DE_FATAL("Unknown external memory handle type");
552 vk::Move<vk::VkFence> createExportableFence (const vk::DeviceInterface& vkd,
554 vk::VkExternalFenceHandleTypeFlagBits externalType)
556 const vk::VkExportFenceCreateInfo exportCreateInfo =
558 vk::VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
560 (vk::VkExternalFenceHandleTypeFlags)externalType
562 const vk::VkFenceCreateInfo createInfo =
564 vk::VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
569 return vk::createFence(vkd, device, &createInfo);
572 int getFenceFd (const vk::DeviceInterface& vkd,
575 vk::VkExternalFenceHandleTypeFlagBits externalType)
577 const vk::VkFenceGetFdInfoKHR info =
579 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
587 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
593 void getFenceNative (const vk::DeviceInterface& vkd,
596 vk::VkExternalFenceHandleTypeFlagBits externalType,
597 NativeHandle& nativeHandle,
598 bool expectFenceUnsignaled)
600 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
601 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
603 const vk::VkFenceGetFdInfoKHR info =
605 vk::VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
613 VK_CHECK(vkd.getFenceFdKHR(device, &info, &fd));
615 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT)
617 TCU_CHECK(!expectFenceUnsignaled || (fd >= 0));
626 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
627 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
629 const vk::VkFenceGetWin32HandleInfoKHR info =
631 vk::VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR,
637 vk::pt::Win32Handle handle (DE_NULL);
639 VK_CHECK(vkd.getFenceWin32HandleKHR(device, &info, &handle));
641 switch (externalType)
643 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
644 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
647 case vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
648 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
652 DE_FATAL("Unknow external memory handle type");
656 DE_FATAL("Unknow external fence handle type");
659 void importFence (const vk::DeviceInterface& vkd,
660 const vk::VkDevice device,
661 const vk::VkFence fence,
662 vk::VkExternalFenceHandleTypeFlagBits externalType,
663 NativeHandle& handle,
664 vk::VkFenceImportFlags flags)
666 if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT
667 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT)
669 const vk::VkImportFenceFdInfoKHR importInfo =
671 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR,
679 VK_CHECK(vkd.importFenceFdKHR(device, &importInfo));
682 else if (externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT
683 || externalType == vk::VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
685 const vk::VkImportFenceWin32HandleInfoKHR importInfo =
687 vk::VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR,
692 handle.getWin32Handle(),
693 (vk::pt::Win32LPCWSTR)DE_NULL
696 VK_CHECK(vkd.importFenceWin32HandleKHR(device, &importInfo));
697 // \note Importing a fence payload from Windows handles does not transfer ownership of the handle to the Vulkan implementation,
698 // so we do not disown the handle until after all use has complete.
701 DE_FATAL("Unknown fence external handle type");
704 vk::Move<vk::VkFence> createAndImportFence (const vk::DeviceInterface& vkd,
705 const vk::VkDevice device,
706 vk::VkExternalFenceHandleTypeFlagBits externalType,
707 NativeHandle& handle,
708 vk::VkFenceImportFlags flags)
710 vk::Move<vk::VkFence> fence (createFence(vkd, device));
712 importFence(vkd, device, *fence, externalType, handle, flags);
717 vk::Move<vk::VkSemaphore> createExportableSemaphore (const vk::DeviceInterface& vkd,
719 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
721 const vk::VkExportSemaphoreCreateInfo exportCreateInfo =
723 vk::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
725 (vk::VkExternalSemaphoreHandleTypeFlags)externalType
727 const vk::VkSemaphoreCreateInfo createInfo =
729 vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
734 return vk::createSemaphore(vkd, device, &createInfo);
737 vk::Move<vk::VkSemaphore> createExportableSemaphoreType (const vk::DeviceInterface& vkd,
739 vk::VkSemaphoreType semaphoreType,
740 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
742 const vk::VkSemaphoreTypeCreateInfo semaphoreTypeCreateInfo =
744 vk::VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
749 const vk::VkExportSemaphoreCreateInfo exportCreateInfo =
751 vk::VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
752 &semaphoreTypeCreateInfo,
753 (vk::VkExternalSemaphoreHandleTypeFlags)externalType
755 const vk::VkSemaphoreCreateInfo createInfo =
757 vk::VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
762 return vk::createSemaphore(vkd, device, &createInfo);
765 int getSemaphoreFd (const vk::DeviceInterface& vkd,
767 vk::VkSemaphore semaphore,
768 vk::VkExternalSemaphoreHandleTypeFlagBits externalType)
770 const vk::VkSemaphoreGetFdInfoKHR info =
772 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
780 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
786 void getSemaphoreNative (const vk::DeviceInterface& vkd,
788 vk::VkSemaphore semaphore,
789 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
790 NativeHandle& nativeHandle)
792 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
793 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
795 const vk::VkSemaphoreGetFdInfoKHR info =
797 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
805 VK_CHECK(vkd.getSemaphoreFdKHR(device, &info, &fd));
809 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
810 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
812 const vk::VkSemaphoreGetWin32HandleInfoKHR info =
814 vk::VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
820 vk::pt::Win32Handle handle (DE_NULL);
822 VK_CHECK(vkd.getSemaphoreWin32HandleKHR(device, &info, &handle));
824 switch (externalType)
826 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
827 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_NT, handle);
830 case vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
831 nativeHandle.setWin32Handle(NativeHandle::WIN32HANDLETYPE_KMT, handle);
835 DE_FATAL("Unknow external memory handle type");
839 DE_FATAL("Unknow external semaphore handle type");
842 void importSemaphore (const vk::DeviceInterface& vkd,
843 const vk::VkDevice device,
844 const vk::VkSemaphore semaphore,
845 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
846 NativeHandle& handle,
847 vk::VkSemaphoreImportFlags flags)
849 if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
850 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT)
852 const vk::VkImportSemaphoreFdInfoKHR importInfo =
854 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
862 VK_CHECK(vkd.importSemaphoreFdKHR(device, &importInfo));
865 else if (externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
866 || externalType == vk::VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
868 const vk::VkImportSemaphoreWin32HandleInfoKHR importInfo =
870 vk::VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
875 handle.getWin32Handle(),
876 (vk::pt::Win32LPCWSTR)DE_NULL
879 VK_CHECK(vkd.importSemaphoreWin32HandleKHR(device, &importInfo));
880 // \note Importing a semaphore payload from Windows handles does not transfer ownership of the handle to the Vulkan implementation,
881 // so we do not disown the handle until after all use has complete.
884 DE_FATAL("Unknown semaphore external handle type");
887 vk::Move<vk::VkSemaphore> createAndImportSemaphore (const vk::DeviceInterface& vkd,
888 const vk::VkDevice device,
889 vk::VkExternalSemaphoreHandleTypeFlagBits externalType,
890 NativeHandle& handle,
891 vk::VkSemaphoreImportFlags flags)
893 vk::Move<vk::VkSemaphore> semaphore (createSemaphore(vkd, device));
895 importSemaphore(vkd, device, *semaphore, externalType, handle, flags);
900 deUint32 chooseMemoryType(deUint32 bits)
905 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= bits; memoryTypeIndex++)
907 if ((bits & (1u << memoryTypeIndex)) != 0)
908 return memoryTypeIndex;
911 DE_FATAL("No supported memory types");
915 deUint32 chooseHostVisibleMemoryType (deUint32 bits, const vk::VkPhysicalDeviceMemoryProperties properties)
917 DE_ASSERT(bits != 0);
919 for (deUint32 memoryTypeIndex = 0; (1u << memoryTypeIndex) <= bits; memoryTypeIndex++)
921 if (((bits & (1u << memoryTypeIndex)) != 0) &&
922 ((properties.memoryTypes[memoryTypeIndex].propertyFlags & vk::VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0))
923 return memoryTypeIndex;
926 TCU_THROW(NotSupportedError, "No supported memory type found");
930 vk::VkMemoryRequirements getImageMemoryRequirements (const vk::DeviceInterface& vkd,
933 vk::VkExternalMemoryHandleTypeFlagBits externalType)
935 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
937 return { 0u, 0u, 0u };
941 return vk::getImageMemoryRequirements(vkd, device, image);
945 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
947 vk::VkDeviceSize allocationSize,
948 deUint32 memoryTypeIndex,
949 vk::VkExternalMemoryHandleTypeFlagBits externalType,
952 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
954 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
960 const vk::VkExportMemoryAllocateInfo exportInfo =
962 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
963 !!buffer ? &dedicatedInfo : DE_NULL,
964 (vk::VkExternalMemoryHandleTypeFlags)externalType
966 const vk::VkMemoryAllocateInfo info =
968 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
973 return vk::allocateMemory(vkd, device, &info);
976 vk::Move<vk::VkDeviceMemory> allocateExportableMemory (const vk::DeviceInterface& vkd,
978 vk::VkDeviceSize allocationSize,
979 deUint32 memoryTypeIndex,
980 vk::VkExternalMemoryHandleTypeFlagBits externalType,
983 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
985 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
991 const vk::VkExportMemoryAllocateInfo exportInfo =
993 vk::VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
994 !!image ? &dedicatedInfo : DE_NULL,
995 (vk::VkExternalMemoryHandleTypeFlags)externalType
997 const vk::VkMemoryAllocateInfo info =
999 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1004 return vk::allocateMemory(vkd, device, &info);
1007 static vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
1008 vk::VkDevice device,
1009 vk::VkBuffer buffer,
1011 const vk::VkMemoryRequirements& requirements,
1012 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1013 deUint32 memoryTypeIndex,
1014 NativeHandle& handle)
1016 const bool isDedicated = !!buffer || !!image;
1018 DE_ASSERT(!buffer || !image);
1020 if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT
1021 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)
1023 const vk::VkImportMemoryFdInfoKHR importInfo =
1025 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
1030 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1032 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1037 const vk::VkMemoryAllocateInfo info =
1039 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1040 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1042 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1044 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1050 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
1051 || externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT)
1053 const vk::VkImportMemoryWin32HandleInfoKHR importInfo =
1055 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR,
1058 handle.getWin32Handle(),
1059 (vk::pt::Win32LPCWSTR)DE_NULL
1061 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1063 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1068 const vk::VkMemoryAllocateInfo info =
1070 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1071 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1073 (memoryTypeIndex == ~0U) ? chooseMemoryType(requirements.memoryTypeBits) : memoryTypeIndex
1075 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1077 // The handle's owned reference must also be released. Do not discard the handle below.
1078 if (externalType != vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT)
1083 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)
1085 AndroidHardwareBufferExternalApi* ahbApi = AndroidHardwareBufferExternalApi::getInstance();
1088 TCU_THROW(NotSupportedError, "Platform doesn't support Android Hardware Buffer handles");
1091 deUint32 ahbFormat = 0;
1092 ahbApi->describe(handle.getAndroidHardwareBuffer(), DE_NULL, DE_NULL, DE_NULL, &ahbFormat, DE_NULL, DE_NULL);
1093 DE_ASSERT(ahbApi->ahbFormatIsBlob(ahbFormat) || image != 0);
1095 vk::VkAndroidHardwareBufferPropertiesANDROID ahbProperties =
1097 vk::VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID,
1103 VK_CHECK(vkd.getAndroidHardwareBufferPropertiesANDROID(device, handle.getAndroidHardwareBuffer(), &ahbProperties));
1105 vk::VkImportAndroidHardwareBufferInfoANDROID importInfo =
1107 vk::VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID,
1109 handle.getAndroidHardwareBuffer()
1111 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1113 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR,
1118 const vk::VkMemoryAllocateInfo info =
1120 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1121 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1122 ahbProperties.allocationSize,
1123 (memoryTypeIndex == ~0U) ? chooseMemoryType(ahbProperties.memoryTypeBits) : memoryTypeIndex
1125 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1129 else if (externalType == vk::VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT)
1131 DE_ASSERT(memoryTypeIndex != ~0U);
1133 const vk::VkImportMemoryHostPointerInfoEXT importInfo =
1135 vk::VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
1140 const vk::VkMemoryDedicatedAllocateInfo dedicatedInfo =
1142 vk::VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1147 const vk::VkMemoryAllocateInfo info =
1149 vk::VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1150 (isDedicated ? (const void*)&dedicatedInfo : (const void*)&importInfo),
1154 vk::Move<vk::VkDeviceMemory> memory (vk::allocateMemory(vkd, device, &info));
1160 DE_FATAL("Unknown external memory type");
1161 return vk::Move<vk::VkDeviceMemory>();
1165 vk::Move<vk::VkDeviceMemory> importMemory (const vk::DeviceInterface& vkd,
1166 vk::VkDevice device,
1167 const vk::VkMemoryRequirements& requirements,
1168 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1169 deUint32 memoryTypeIndex,
1170 NativeHandle& handle)
1172 return importMemory(vkd, device, (vk::VkBuffer)0, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1175 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1176 vk::VkDevice device,
1177 vk::VkBuffer buffer,
1178 const vk::VkMemoryRequirements& requirements,
1179 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1180 deUint32 memoryTypeIndex,
1181 NativeHandle& handle)
1183 return importMemory(vkd, device, buffer, (vk::VkImage)0, requirements, externalType, memoryTypeIndex, handle);
1186 vk::Move<vk::VkDeviceMemory> importDedicatedMemory (const vk::DeviceInterface& vkd,
1187 vk::VkDevice device,
1189 const vk::VkMemoryRequirements& requirements,
1190 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1191 deUint32 memoryTypeIndex,
1192 NativeHandle& handle)
1194 return importMemory(vkd, device, (vk::VkBuffer)0, image, requirements, externalType, memoryTypeIndex, handle);
1197 vk::Move<vk::VkBuffer> createExternalBuffer (const vk::DeviceInterface& vkd,
1198 vk::VkDevice device,
1199 deUint32 queueFamilyIndex,
1200 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1201 vk::VkDeviceSize size,
1202 vk::VkBufferCreateFlags createFlags,
1203 vk::VkBufferUsageFlags usageFlags)
1205 const vk::VkExternalMemoryBufferCreateInfo externalCreateInfo =
1207 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1209 (vk::VkExternalMemoryHandleTypeFlags)externalType
1211 const vk::VkBufferCreateInfo createInfo =
1213 vk::VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1214 &externalCreateInfo,
1218 vk::VK_SHARING_MODE_EXCLUSIVE,
1223 return vk::createBuffer(vkd, device, &createInfo);
1226 vk::Move<vk::VkImage> createExternalImage (const vk::DeviceInterface& vkd,
1227 vk::VkDevice device,
1228 deUint32 queueFamilyIndex,
1229 vk::VkExternalMemoryHandleTypeFlagBits externalType,
1230 vk::VkFormat format,
1233 vk::VkImageTiling tiling,
1234 vk::VkImageCreateFlags createFlags,
1235 vk::VkImageUsageFlags usageFlags,
1237 deUint32 arrayLayers)
1239 if (createFlags & vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT && arrayLayers < 6u)
1242 const vk::VkExternalMemoryImageCreateInfo externalCreateInfo =
1244 vk::VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
1246 (vk::VkExternalMemoryHandleTypeFlags)externalType
1248 const vk::VkImageCreateInfo createInfo =
1250 vk::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1251 &externalCreateInfo,
1253 vk::VK_IMAGE_TYPE_2D,
1255 { width, height, 1u, },
1258 vk::VK_SAMPLE_COUNT_1_BIT,
1261 vk::VK_SHARING_MODE_EXCLUSIVE,
1264 vk::VK_IMAGE_LAYOUT_UNDEFINED
1267 return vk::createImage(vkd, device, &createInfo);
1270 #if (DE_OS == DE_OS_ANDROID)
1271 # if defined(__ANDROID_API_P__) && (DE_ANDROID_API >= __ANDROID_API_P__)
1272 # define BUILT_WITH_ANDROID_P_HARDWARE_BUFFER 1
1275 static deInt32 androidGetSdkVersion()
1277 static deInt32 sdkVersion = -1;
1280 char value[128] = {0};
1281 __system_property_get("ro.build.version.sdk", value);
1282 sdkVersion = static_cast<deInt32>(strtol(value, DE_NULL, 10));
1283 printf("SDK Version is %d\n", sdkVersion);
1288 static deInt32 checkAnbApiBuild()
1290 deInt32 sdkVersion = androidGetSdkVersion();
1291 #if !defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1292 // When testing AHB on Android-O and newer the CTS must be compiled against API26 or newer.
1293 DE_TEST_ASSERT(!(sdkVersion >= 26)); /* __ANDROID_API_O__ */
1294 #endif // !defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1295 #if !defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1296 // When testing AHB on Android-P and newer the CTS must be compiled against API28 or newer.
1297 DE_TEST_ASSERT(!(sdkVersion >= 28)); /*__ANDROID_API_P__ */
1298 #endif // !defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1302 bool AndroidHardwareBufferExternalApi::supportsAhb()
1304 return (checkAnbApiBuild() >= __ANDROID_API_O__);
1307 bool AndroidHardwareBufferExternalApi::supportsCubeMap()
1309 return (checkAnbApiBuild() >= 28);
1312 AndroidHardwareBufferExternalApi::AndroidHardwareBufferExternalApi()
1314 deInt32 sdkVersion = checkAnbApiBuild();
1315 if(sdkVersion >= __ANDROID_API_O__)
1317 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1318 if (!loadAhbDynamicApis(sdkVersion))
1320 // Couldn't load Android AHB system APIs.
1321 DE_TEST_ASSERT(false);
1324 // Invalid Android AHB APIs configuration. Please check the instructions on how to build NDK for Android.
1325 DE_TEST_ASSERT(false);
1326 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1330 AndroidHardwareBufferExternalApi::~AndroidHardwareBufferExternalApi()
1334 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1335 typedef int (*pfn_system_property_get)(const char *, char *);
1336 typedef int (*pfnAHardwareBuffer_allocate)(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer);
1337 typedef void (*pfnAHardwareBuffer_describe)(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc);
1338 typedef void (*pfnAHardwareBuffer_acquire)(AHardwareBuffer* buffer);
1339 typedef void (*pfnAHardwareBuffer_release)(AHardwareBuffer* buffer);
1343 pfnAHardwareBuffer_allocate allocate;
1344 pfnAHardwareBuffer_describe describe;
1345 pfnAHardwareBuffer_acquire acquire;
1346 pfnAHardwareBuffer_release release;
1349 static AhbFunctions ahbFunctions;
1351 static bool ahbFunctionsLoaded(AhbFunctions* pAhbFunctions)
1353 static bool ahbApiLoaded = false;
1355 ((pAhbFunctions->allocate != DE_NULL) &&
1356 (pAhbFunctions->describe != DE_NULL) &&
1357 (pAhbFunctions->acquire != DE_NULL) &&
1358 (pAhbFunctions->release != DE_NULL)))
1360 ahbApiLoaded = true;
1366 bool AndroidHardwareBufferExternalApi::loadAhbDynamicApis(deInt32 sdkVersion)
1368 if(sdkVersion >= __ANDROID_API_O__)
1370 if (!ahbFunctionsLoaded(&ahbFunctions))
1372 static de::DynamicLibrary libnativewindow("libnativewindow.so");
1373 ahbFunctions.allocate = reinterpret_cast<pfnAHardwareBuffer_allocate>(libnativewindow.getFunction("AHardwareBuffer_allocate"));
1374 ahbFunctions.describe = reinterpret_cast<pfnAHardwareBuffer_describe>(libnativewindow.getFunction("AHardwareBuffer_describe"));
1375 ahbFunctions.acquire = reinterpret_cast<pfnAHardwareBuffer_acquire>(libnativewindow.getFunction("AHardwareBuffer_acquire"));
1376 ahbFunctions.release = reinterpret_cast<pfnAHardwareBuffer_release>(libnativewindow.getFunction("AHardwareBuffer_release"));
1378 return ahbFunctionsLoaded(&ahbFunctions);
1390 class AndroidHardwareBufferExternalApi26 : public AndroidHardwareBufferExternalApi
1394 virtual vk::pt::AndroidHardwareBufferPtr allocate(deUint32 width, deUint32 height, deUint32 layers, deUint32 format, deUint64 usage);
1395 virtual void acquire(vk::pt::AndroidHardwareBufferPtr buffer);
1396 virtual void release(vk::pt::AndroidHardwareBufferPtr buffer);
1397 virtual void describe(const vk::pt::AndroidHardwareBufferPtr buffer,
1404 virtual deUint64 vkUsageToAhbUsage(vk::VkImageUsageFlagBits vkFlag);
1405 virtual deUint64 vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlag);
1406 virtual deUint32 vkFormatToAhbFormat(vk::VkFormat vkFormat);
1407 virtual deUint64 mustSupportAhbUsageFlags();
1408 virtual bool ahbFormatIsBlob(deUint32 ahbFormat) { return (ahbFormat == AHARDWAREBUFFER_FORMAT_BLOB); };
1410 AndroidHardwareBufferExternalApi26() : AndroidHardwareBufferExternalApi() {};
1411 virtual ~AndroidHardwareBufferExternalApi26() {};
1414 // Stop the compiler generating methods of copy the object
1415 AndroidHardwareBufferExternalApi26(AndroidHardwareBufferExternalApi26 const& copy); // Not Implemented
1416 AndroidHardwareBufferExternalApi26& operator=(AndroidHardwareBufferExternalApi26 const& copy); // Not Implemented
1419 vk::pt::AndroidHardwareBufferPtr AndroidHardwareBufferExternalApi26::allocate( deUint32 width,
1425 AHardwareBuffer_Desc hbufferdesc = {
1428 layers, // number of images
1431 0u, // Stride in pixels, ignored for AHardwareBuffer_allocate()
1432 0u, // Initialize to zero, reserved for future use
1433 0u // Initialize to zero, reserved for future use
1436 AHardwareBuffer* hbuffer = DE_NULL;
1437 ahbFunctions.allocate(&hbufferdesc, &hbuffer);
1439 return vk::pt::AndroidHardwareBufferPtr(hbuffer);
1442 void AndroidHardwareBufferExternalApi26::acquire(vk::pt::AndroidHardwareBufferPtr buffer)
1444 ahbFunctions.acquire(static_cast<AHardwareBuffer*>(buffer.internal));
1447 void AndroidHardwareBufferExternalApi26::release(vk::pt::AndroidHardwareBufferPtr buffer)
1449 ahbFunctions.release(static_cast<AHardwareBuffer*>(buffer.internal));
1452 void AndroidHardwareBufferExternalApi26::describe( const vk::pt::AndroidHardwareBufferPtr buffer,
1460 AHardwareBuffer_Desc desc;
1461 ahbFunctions.describe(static_cast<const AHardwareBuffer*>(buffer.internal), &desc);
1462 if (width) *width = desc.width;
1463 if (height) *height = desc.height;
1464 if (layers) *layers = desc.layers;
1465 if (format) *format = desc.format;
1466 if (usage) *usage = desc.usage;
1467 if (stride) *stride = desc.stride;
1470 deUint64 AndroidHardwareBufferExternalApi26::vkUsageToAhbUsage(vk::VkImageUsageFlagBits vkFlags)
1474 case vk::VK_IMAGE_USAGE_TRANSFER_SRC_BIT:
1475 case vk::VK_IMAGE_USAGE_TRANSFER_DST_BIT:
1476 // No AHB equivalent.
1478 case vk::VK_IMAGE_USAGE_SAMPLED_BIT:
1479 return AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
1480 case vk::VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT:
1481 return AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
1482 case vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT:
1483 case vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT:
1484 // Alias of AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER which is defined in later Android API versions.
1485 return AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
1491 deUint64 AndroidHardwareBufferExternalApi26::vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlags)
1495 case vk::VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT:
1496 case vk::VK_IMAGE_CREATE_EXTENDED_USAGE_BIT:
1497 // No AHB equivalent.
1499 case vk::VK_IMAGE_CREATE_PROTECTED_BIT:
1500 return AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
1506 deUint32 AndroidHardwareBufferExternalApi26::vkFormatToAhbFormat(vk::VkFormat vkFormat)
1510 case vk::VK_FORMAT_R8G8B8A8_UNORM:
1511 return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
1512 case vk::VK_FORMAT_R8G8B8_UNORM:
1513 return AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM;
1514 case vk::VK_FORMAT_R5G6B5_UNORM_PACK16:
1515 return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM;
1516 case vk::VK_FORMAT_R16G16B16A16_SFLOAT:
1517 return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT;
1518 case vk::VK_FORMAT_A2B10G10R10_UNORM_PACK32:
1519 return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM;
1525 deUint64 AndroidHardwareBufferExternalApi26::mustSupportAhbUsageFlags()
1527 return (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT);
1530 #if defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1531 class AndroidHardwareBufferExternalApi28 : public AndroidHardwareBufferExternalApi26
1535 virtual deUint64 vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlag);
1536 virtual deUint32 vkFormatToAhbFormat(vk::VkFormat vkFormat);
1537 virtual deUint64 mustSupportAhbUsageFlags();
1539 AndroidHardwareBufferExternalApi28() : AndroidHardwareBufferExternalApi26() {};
1540 virtual ~AndroidHardwareBufferExternalApi28() {};
1543 // Stop the compiler generating methods of copy the object
1544 AndroidHardwareBufferExternalApi28(AndroidHardwareBufferExternalApi28 const& copy); // Not Implemented
1545 AndroidHardwareBufferExternalApi28& operator=(AndroidHardwareBufferExternalApi28 const& copy); // Not Implemented
1548 deUint64 AndroidHardwareBufferExternalApi28::vkCreateToAhbUsage(vk::VkImageCreateFlagBits vkFlags)
1552 case vk::VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT:
1553 return AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP;
1555 return AndroidHardwareBufferExternalApi26::vkCreateToAhbUsage(vkFlags);
1559 deUint32 AndroidHardwareBufferExternalApi28::vkFormatToAhbFormat(vk::VkFormat vkFormat)
1563 case vk::VK_FORMAT_D16_UNORM:
1564 return AHARDWAREBUFFER_FORMAT_D16_UNORM;
1565 case vk::VK_FORMAT_X8_D24_UNORM_PACK32:
1566 return AHARDWAREBUFFER_FORMAT_D24_UNORM;
1567 case vk::VK_FORMAT_D24_UNORM_S8_UINT:
1568 return AHARDWAREBUFFER_FORMAT_D24_UNORM_S8_UINT;
1569 case vk::VK_FORMAT_D32_SFLOAT:
1570 return AHARDWAREBUFFER_FORMAT_D32_FLOAT;
1571 case vk::VK_FORMAT_D32_SFLOAT_S8_UINT:
1572 return AHARDWAREBUFFER_FORMAT_D32_FLOAT_S8_UINT;
1573 case vk::VK_FORMAT_S8_UINT:
1574 return AHARDWAREBUFFER_FORMAT_S8_UINT;
1576 return AndroidHardwareBufferExternalApi26::vkFormatToAhbFormat(vkFormat);
1580 deUint64 AndroidHardwareBufferExternalApi28::mustSupportAhbUsageFlags()
1582 return AndroidHardwareBufferExternalApi26::mustSupportAhbUsageFlags() | AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP | AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE;
1585 #endif // defined(BUILT_WITH_ANDROID_P_HARDWARE_BUFFER)
1586 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1587 #endif // (DE_OS == DE_OS_ANDROID)
1589 AndroidHardwareBufferExternalApi* AndroidHardwareBufferExternalApi::getInstance()
1591 #if (DE_OS == DE_OS_ANDROID)
1592 deInt32 sdkVersion = checkAnbApiBuild();
1593 #if defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1594 # if defined(__ANDROID_API_P__) && (DE_ANDROID_API >= __ANDROID_API_P__)
1595 if (sdkVersion >= __ANDROID_API_P__ )
1597 static AndroidHardwareBufferExternalApi28 api28Instance;
1598 return &api28Instance;
1601 # if defined(__ANDROID_API_O__) && (DE_ANDROID_API >= __ANDROID_API_O__)
1602 if (sdkVersion >= __ANDROID_API_O__ )
1604 static AndroidHardwareBufferExternalApi26 api26Instance;
1605 return &api26Instance;
1608 #endif // defined(BUILT_WITH_ANDROID_HARDWARE_BUFFER)
1609 DE_UNREF(sdkVersion);
1610 #endif // DE_OS == DE_OS_ANDROID
1614 vk::VkPhysicalDeviceExternalMemoryHostPropertiesEXT getPhysicalDeviceExternalMemoryHostProperties(const vk::InstanceInterface& vki,
1615 vk::VkPhysicalDevice physicalDevice)
1617 vk::VkPhysicalDeviceExternalMemoryHostPropertiesEXT externalProps =
1619 vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT,
1624 vk::VkPhysicalDeviceProperties2 props2;
1625 deMemset(&props2, 0, sizeof(props2));
1626 props2.sType = vk::VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
1627 props2.pNext = &externalProps;
1629 vki.getPhysicalDeviceProperties2(physicalDevice, &props2);
1631 return externalProps;
1634 } // ExternalMemoryUtil