From f5786077e5a14de3836eaa7f466b27cd2a90c52c Mon Sep 17 00:00:00 2001 From: Omar El Sheikh Date: Tue, 1 Sep 2020 17:42:23 -0400 Subject: [PATCH] Added Android Hardware Buffer Extension Support Added support for the VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER device extension on Android *Created necessary hooks for vkGetAndroidHardwareBufferPropertiesANDROID and vkGetMemoryAndroidHardwareBufferANDROID --- renderdoc/driver/vulkan/vk_android.cpp | 20 ++++++++++++++++++++ renderdoc/driver/vulkan/vk_core.cpp | 6 ++++++ renderdoc/driver/vulkan/vk_core.h | 10 ++++++++++ renderdoc/driver/vulkan/vk_hookset_defs.h | 23 ++++++++++++++++++----- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_android.cpp b/renderdoc/driver/vulkan/vk_android.cpp index 7cfb2befe..4e63a6052 100644 --- a/renderdoc/driver/vulkan/vk_android.cpp +++ b/renderdoc/driver/vulkan/vk_android.cpp @@ -50,6 +50,26 @@ VkResult WrappedVulkan::vkCreateAndroidSurfaceKHR(VkInstance instance, return ret; } +// VK_ANDROID_external_memory_android_hardware_buffer +VkResult WrappedVulkan::vkGetAndroidHardwareBufferPropertiesANDROID( + VkDevice device, const struct AHardwareBuffer *buffer, + VkAndroidHardwareBufferPropertiesANDROID *pProperties) +{ + return ObjDisp(device)->GetAndroidHardwareBufferPropertiesANDROID(Unwrap(device), buffer, + pProperties); +} + +// VK_ANDROID_external_memory_android_hardware_buffer +VkResult WrappedVulkan::vkGetMemoryAndroidHardwareBufferANDROID( + VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo, + struct AHardwareBuffer **pBuffer) +{ + VkMemoryGetAndroidHardwareBufferInfoANDROID unwrappedInfo = *pInfo; + unwrappedInfo.memory = Unwrap(unwrappedInfo.memory); + return ObjDisp(device)->GetMemoryAndroidHardwareBufferANDROID(Unwrap(device), &unwrappedInfo, + pBuffer); +} + void VulkanReplay::OutputWindow::SetWindowHandle(WindowingData window) { RDCASSERT(window.system == WindowingSystem::Android, window.system); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 3e7be0052..b94a8d386 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -748,6 +748,12 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME, VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION, }, +#ifdef VK_ANDROID_external_memory_android_hardware_buffer + { + VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, + VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION, + }, +#endif #ifdef VK_EXT_acquire_xlib_display { VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME, VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index af897cddb..a915a8cf7 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1776,6 +1776,16 @@ public: VkResult vkCreateAndroidSurfaceKHR(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); + + // VK_ANDROID_external_memory_android_hardware_buffer + VkResult vkGetAndroidHardwareBufferPropertiesANDROID( + VkDevice device, const struct AHardwareBuffer *buffer, + VkAndroidHardwareBufferPropertiesANDROID *pProperties); + + // VK_ANDROID_external_memory_android_hardware_buffer + VkResult vkGetMemoryAndroidHardwareBufferANDROID( + VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo, + struct AHardwareBuffer **pBuffer); #endif #if defined(VK_USE_PLATFORM_MACOS_MVK) diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 223441f9f..c22f97dc0 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -144,20 +144,33 @@ #define HookInitExtension_Instance_Android() \ HookInitExtension(VK_KHR_android_surface, CreateAndroidSurfaceKHR); -#define HookDefine_Android() \ - HookDefine4(VkResult, vkCreateAndroidSurfaceKHR, VkInstance, instance, \ - const VkAndroidSurfaceCreateInfoKHR *, pCreateInfo, const VkAllocationCallbacks *, \ - pAllocator, VkSurfaceKHR *, pSurface); + +#define HookInitExtension_Device_Android() \ + HookInitExtension(VK_ANDROID_external_memory_android_hardware_buffer, \ + GetMemoryAndroidHardwareBufferANDROID); \ + HookInitExtension(VK_ANDROID_external_memory_android_hardware_buffer, \ + GetAndroidHardwareBufferPropertiesANDROID); + +#define HookDefine_Android() \ + HookDefine4(VkResult, vkCreateAndroidSurfaceKHR, VkInstance, instance, \ + const VkAndroidSurfaceCreateInfoKHR *, pCreateInfo, const VkAllocationCallbacks *, \ + pAllocator, VkSurfaceKHR *, pSurface); \ + HookDefine3(VkResult, vkGetAndroidHardwareBufferPropertiesANDROID, VkDevice, device, \ + const struct AHardwareBuffer *, buffer, VkAndroidHardwareBufferPropertiesANDROID *, \ + pProperties); \ + HookDefine3(VkResult, vkGetMemoryAndroidHardwareBufferANDROID, VkDevice, device, \ + const VkMemoryGetAndroidHardwareBufferInfoANDROID *, pInfo, \ + struct AHardwareBuffer **, pBuffer); #else // defined(VK_USE_PLATFORM_ANDROID_KHR) #define HookInitExtension_Instance_Android() +#define HookInitExtension_Device_Android() #define HookDefine_Android() #endif // defined(VK_USE_PLATFORM_ANDROID_KHR) #define HookInitExtension_PhysDev_Android() -#define HookInitExtension_Device_Android() #if defined(VK_USE_PLATFORM_GGP)