[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,