From a1920507dccdb963bde0228801955e608836b443 Mon Sep 17 00:00:00 2001 From: Aaron Ruby Date: Fri, 26 Apr 2024 13:52:40 -0400 Subject: [PATCH] gfxstream: Clean up VK_KHR_external_memory_fd support for Linux Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../codegen/scripts/cereal/functable.py | 2 ++ .../codegen/scripts/cerealgenerator.py | 6 ++-- .../guest/vulkan/gfxstream_vk_device.cpp | 23 ------------ .../guest/vulkan_enc/ResourceTracker.cpp | 36 +++++++++++++++++++ .../guest/vulkan_enc/ResourceTracker.h | 3 ++ 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/gfxstream/codegen/scripts/cereal/functable.py b/src/gfxstream/codegen/scripts/cereal/functable.py index 9fc0aef9f1a..90fddb33c46 100644 --- a/src/gfxstream/codegen/scripts/cereal/functable.py +++ b/src/gfxstream/codegen/scripts/cereal/functable.py @@ -44,6 +44,8 @@ RESOURCE_TRACKER_ENTRIES = [ # } end Warning: These need to be defined in vk.xml (currently no-op) "vkGetAndroidHardwareBufferPropertiesANDROID", "vkGetMemoryAndroidHardwareBufferANDROID", + "vkGetMemoryFdKHR", + "vkGetMemoryFdPropertiesKHR", "vkCreateSamplerYcbcrConversion", "vkDestroySamplerYcbcrConversion", "vkCreateSamplerYcbcrConversionKHR", diff --git a/src/gfxstream/codegen/scripts/cerealgenerator.py b/src/gfxstream/codegen/scripts/cerealgenerator.py index aa957f8724d..9fdddf7e916 100644 --- a/src/gfxstream/codegen/scripts/cerealgenerator.py +++ b/src/gfxstream/codegen/scripts/cerealgenerator.py @@ -122,11 +122,12 @@ SUPPORTED_FEATURES = [ "VK_MVK_moltenvk", "VK_KHR_external_semaphore_win32", "VK_KHR_external_memory_win32", - "VK_KHR_external_memory_fd", # Android "VK_ANDROID_native_buffer", "VK_ANDROID_external_memory_android_hardware_buffer", "VK_KHR_android_surface", + # Linux + "VK_KHR_external_memory_fd", # Custom "VK_GOOGLE_gfxstream", # Used in tests without proper support checks @@ -159,7 +160,8 @@ SUPPORTED_MODULES = { "VK_MVK_moltenvk": ["goldfish_vk_dispatch"], "VK_KHR_external_semaphore_win32" : ["goldfish_vk_dispatch"], "VK_KHR_external_memory_win32" : ["goldfish_vk_dispatch"], - "VK_KHR_external_memory_fd": ["goldfish_vk_dispatch"], + # Host dispatch for Linux hosts + and entrypoint for guests + "VK_KHR_external_memory_fd": ["goldfish_vk_dispatch", "func_table"], "VK_QNX_external_memory_screen_buffer": ["goldfish_vk_dispatch"], "VK_ANDROID_external_memory_android_hardware_buffer": ["func_table"], "VK_KHR_android_surface": ["func_table"], diff --git a/src/gfxstream/guest/vulkan/gfxstream_vk_device.cpp b/src/gfxstream/guest/vulkan/gfxstream_vk_device.cpp index e1bf4c0101d..40d5fb4466a 100644 --- a/src/gfxstream/guest/vulkan/gfxstream_vk_device.cpp +++ b/src/gfxstream/guest/vulkan/gfxstream_vk_device.cpp @@ -760,29 +760,6 @@ void gfxstream_vk_CmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, } } -VkResult gfxstream_vk_GetMemoryFdKHR(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, - int* pFd) { - AEMU_SCOPED_TRACE("vkGetMemoryFdKHR"); - VK_FROM_HANDLE(gfxstream_vk_device, gfxstream_device, device); - VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0; - - { - auto vkEnc = gfxstream::vk::ResourceTracker::getThreadLocalEncoder(); - std::vector internal_pGetFdInfo(1); - for (uint32_t i = 0; i < 1; ++i) { - internal_pGetFdInfo[i] = pGetFdInfo[i]; - /* VkMemoryGetFdInfoKHR::memory */ - VK_FROM_HANDLE(gfxstream_vk_device_memory, gfxstream_memory, - internal_pGetFdInfo[i].memory); - internal_pGetFdInfo[i].memory = gfxstream_memory->internal_object; - } - auto resources = gfxstream::vk::ResourceTracker::get(); - vkGetMemoryFdKHR_VkResult_return = resources->on_vkGetMemoryFdKHR( - vkEnc, VK_SUCCESS, gfxstream_device->internal_object, internal_pGetFdInfo.data(), pFd); - } - return vkGetMemoryFdKHR_VkResult_return; -} - VkResult gfxstream_vk_EnumerateInstanceLayerProperties(uint32_t* pPropertyCount, VkLayerProperties* pProperties) { AEMU_SCOPED_TRACE("vkEnumerateInstanceLayerProperties"); diff --git a/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp b/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp index ddd481554a7..bcc0b4ec285 100644 --- a/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp +++ b/src/gfxstream/guest/vulkan_enc/ResourceTracker.cpp @@ -5596,6 +5596,42 @@ VkResult ResourceTracker::on_vkImportSemaphoreFdKHR( #endif } +VkResult ResourceTracker::on_vkGetMemoryFdPropertiesKHR( + void* context, VkResult, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd, + VkMemoryFdPropertiesKHR* pMemoryFdProperties) { +#if defined(__linux__) && !defined(VK_USE_PLATFORM_ANDROID_KHR) + if (!(handleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)) { + ALOGE("%s: VK_KHR_external_memory_fd behavior not defined for handleType: 0x%x\n", __func__, + handleType); + return VK_ERROR_INVALID_EXTERNAL_HANDLE; + } + // Sanity-check device + AutoLock lock(mLock); + auto deviceIt = info_VkDevice.find(device); + if (deviceIt == info_VkDevice.end()) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + // TODO: Verify FD valid ? + (void)fd; + + if (mCaps.vulkanCapset.colorBufferMemoryIndex == 0xFFFFFFFF) { + mCaps.vulkanCapset.colorBufferMemoryIndex = getColorBufferMemoryIndex(context, device); + } + + updateMemoryTypeBits(&pMemoryFdProperties->memoryTypeBits, + mCaps.vulkanCapset.colorBufferMemoryIndex); + + return VK_SUCCESS; +#else + (void)context; + (void)device; + (void)handleType; + (void)fd; + (void)pMemoryFdProperties; + return VK_ERROR_INCOMPATIBLE_DRIVER; +#endif +} + VkResult ResourceTracker::on_vkGetMemoryFdKHR(void* context, VkResult, VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) { #if defined(__linux__) && !defined(VK_USE_PLATFORM_ANDROID_KHR) diff --git a/src/gfxstream/guest/vulkan_enc/ResourceTracker.h b/src/gfxstream/guest/vulkan_enc/ResourceTracker.h index bda7d91bcca..a93c369983f 100644 --- a/src/gfxstream/guest/vulkan_enc/ResourceTracker.h +++ b/src/gfxstream/guest/vulkan_enc/ResourceTracker.h @@ -272,6 +272,9 @@ class ResourceTracker { VkResult on_vkGetMemoryFdKHR(void* context, VkResult input_result, VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd); + VkResult on_vkGetMemoryFdPropertiesKHR(void* context, VkResult input_result, VkDevice device, + VkExternalMemoryHandleTypeFlagBits handleType, int fd, + VkMemoryFdPropertiesKHR* pMemoryFdProperties); #ifdef VK_USE_PLATFORM_FUCHSIA VkResult on_vkGetMemoryZirconHandleFUCHSIA(void* context, VkResult input_result,