Ensure AHBs use the reserved emulated memory type index
... so that the guest never tries to map AHB memory.
Bug: b/272079201
Test: cts -m CtsNativeHardwareTestCases
Test: cts -m CtsDeqpTestCases --module-arg
CtsDeqpTestCases:include-filter:dEQP-VK.api.external.memory.android_hardware_buffer*
Change-Id: I0b8030bdfdcedc5429191a3e76c9ff6355e9acbf
diff --git a/system/vulkan_enc/AndroidHardwareBuffer.cpp b/system/vulkan_enc/AndroidHardwareBuffer.cpp
index f31c04d..4a46421 100644
--- a/system/vulkan_enc/AndroidHardwareBuffer.cpp
+++ b/system/vulkan_enc/AndroidHardwareBuffer.cpp
@@ -62,10 +62,13 @@
return ahw_usage;
}
+void updateMemoryTypeBitsForAndroidHardwareBuffers(uint32_t* memoryTypeBits) {
+ constexpr const uint32_t kReservedAndroidHardwareBufferMemoryTypeIndex = 0;
+ *memoryTypeBits = 1u << kReservedAndroidHardwareBufferMemoryTypeIndex;
+}
+
VkResult getAndroidHardwareBufferPropertiesANDROID(
Gralloc* grallocHelper,
- const VkPhysicalDeviceMemoryProperties* memProps,
- VkDevice,
const AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
@@ -232,8 +235,9 @@
if (!colorBufferHandle) {
return VK_ERROR_INVALID_EXTERNAL_HANDLE;
}
- assert(memProps->memoryTypeCount < VK_MAX_MEMORY_TYPES);
- pProperties->memoryTypeBits = (1u << memProps->memoryTypeCount) - 1;
+
+ updateMemoryTypeBitsForAndroidHardwareBuffers(&pProperties->memoryTypeBits);
+
pProperties->allocationSize =
grallocHelper->getAllocatedSize(handle);
diff --git a/system/vulkan_enc/AndroidHardwareBuffer.h b/system/vulkan_enc/AndroidHardwareBuffer.h
index 9c9cb94..cab626b 100644
--- a/system/vulkan_enc/AndroidHardwareBuffer.h
+++ b/system/vulkan_enc/AndroidHardwareBuffer.h
@@ -32,10 +32,11 @@
const VkImageCreateFlags vk_create,
const VkImageUsageFlags vk_usage);
+void updateMemoryTypeBitsForAndroidHardwareBuffers(
+ uint32_t* memoryTypeBits);
+
VkResult getAndroidHardwareBufferPropertiesANDROID(
Gralloc* grallocHelper,
- const VkPhysicalDeviceMemoryProperties* memProps,
- VkDevice,
const AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties);
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 624239c..106321a 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -1657,18 +1657,14 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(
- void* context, VkResult,
- VkDevice device,
+ void*, VkResult,
+ VkDevice,
const AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
- const VkPhysicalDeviceMemoryProperties& memoryProperties =
- getPhysicalDeviceMemoryProperties(context, device, VK_NULL_HANDLE);
auto grallocHelper =
ResourceTracker::threadingCallbacks.hostConnectionGetFunc()->grallocHelper();
return getAndroidHardwareBufferPropertiesANDROID(
- grallocHelper,
- &memoryProperties,
- device, buffer, pProperties);
+ grallocHelper, buffer, pProperties);
}
VkResult on_vkGetMemoryAndroidHardwareBufferANDROID(
@@ -4252,6 +4248,13 @@
info.isSysmemBackedMemory = true;
}
#endif
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ if (extImgCiPtr &&
+ (extImgCiPtr->handleTypes &
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+ updateMemoryTypeBitsForAndroidHardwareBuffers(&memReqs.memoryTypeBits);
+ }
+#endif
if (info.baseRequirementsKnown) {
transformImageMemoryRequirementsForGuestLocked(*pImage, &memReqs);
@@ -5288,6 +5291,14 @@
if (res != VK_SUCCESS) return res;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ if (extBufCiPtr &&
+ (extBufCiPtr->handleTypes &
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+ updateMemoryTypeBitsForAndroidHardwareBuffers(&memReqs.memoryTypeBits);
+ }
+#endif
+
AutoLock<RecursiveLock> lock(mLock);
auto it = info_VkBuffer.find(*pBuffer);