[vulkan] Add AHB support functions

bug: 122080810

This CL adds support functions for use with AHardwareBuffer
for getting buffer info and
acquiring/importing/creating buffers.

This is inspired by / based on Intel ANV
https://github.com/mesa3d/mesa/blob/master/src/intel/vulkan/anv_android.c

which has a similar layering between implementation-specific Vulkan
and AHardwareBuffer.

No new entry points are exposed yet.

Test: Builds

Change-Id: Ieb5bfcb8b65b87650cd4a2658668efac99f9105c
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 980f4bf..df75721 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -16,6 +16,7 @@
 #include "ResourceTracker.h"
 
 #include "../OpenglSystemCommon/EmulatorFeatureInfo.h"
+#include "AndroidHardwareBuffer.h"
 #include "HostVisibleMemoryVirtualization.h"
 #include "Resources.h"
 #include "VkEncoder.h"
@@ -139,6 +140,7 @@
         GoldfishAddressSpaceBlock*
             goldfishAddressSpaceBlock = nullptr;
         SubAlloc subAlloc;
+        AHardwareBuffer** ahbHandle = nullptr;
     };
 
 #define HANDLE_REGISTER_IMPL_IMPL(type) \
@@ -694,6 +696,49 @@
         }
     }
 
+    VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(
+        VkDevice device,
+        const AHardwareBuffer* buffer,
+        VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
+        return getAndroidHardwareBufferPropertiesANDROID(
+            &mHostVisibleMemoryVirtInfo,
+            device, buffer, pProperties);
+    }
+
+    VkResult on_vkGetMemoryAndroidHardwareBufferANDROID(
+        VkDevice device,
+        const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo,
+        struct AHardwareBuffer** pBuffer) {
+
+        if (!pInfo) return VK_ERROR_INITIALIZATION_FAILED;
+        if (!pInfo->memory) return VK_ERROR_INITIALIZATION_FAILED;
+
+        AutoLock lock(mLock);
+
+        auto deviceIt = info_VkDevice.find(device);
+
+        if (deviceIt == info_VkDevice.end()) {
+            return VK_ERROR_INITIALIZATION_FAILED;
+        }
+
+        auto memoryIt = info_VkDeviceMemory.find(pInfo->memory);
+
+        if (memoryIt == info_VkDeviceMemory.end()) {
+            return VK_ERROR_INITIALIZATION_FAILED;
+        }
+
+        auto& info = memoryIt->second;
+
+        VkResult queryRes =
+            getMemoryAndroidHardwareBufferANDROID(info.ahbHandle);
+
+        if (queryRes != VK_SUCCESS) return queryRes;
+
+        *pBuffer = *(info.ahbHandle);
+
+        return queryRes;
+    }
+
     VkResult on_vkAllocateMemory(
         void* context,
         VkResult input_result,