[vulkan] Properly send AHW usage to the guest
Fixes: 129296738
Change-Id: I0a692cc497dd4c47136f9004f902189c966074cc
diff --git a/system/vulkan/func_table.cpp b/system/vulkan/func_table.cpp
index 1c74ac8..3248d76 100644
--- a/system/vulkan/func_table.cpp
+++ b/system/vulkan/func_table.cpp
@@ -1655,7 +1655,8 @@
AEMU_SCOPED_TRACE("vkGetPhysicalDeviceImageFormatProperties2");
auto vkEnc = HostConnection::get()->vkEncoder();
VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = (VkResult)0;
- vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = vkEnc->vkGetPhysicalDeviceImageFormatProperties2(physicalDevice, pImageFormatInfo, pImageFormatProperties);
+ auto resources = ResourceTracker::get();
+ vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = resources->on_vkGetPhysicalDeviceImageFormatProperties2(vkEnc, VK_SUCCESS, physicalDevice, pImageFormatInfo, pImageFormatProperties);
return vkGetPhysicalDeviceImageFormatProperties2_VkResult_return;
}
static void entry_vkGetPhysicalDeviceQueueFamilyProperties2(
@@ -2233,7 +2234,8 @@
AEMU_SCOPED_TRACE("vkGetPhysicalDeviceImageFormatProperties2KHR");
auto vkEnc = HostConnection::get()->vkEncoder();
VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = (VkResult)0;
- vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties);
+ auto resources = ResourceTracker::get();
+ vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = resources->on_vkGetPhysicalDeviceImageFormatProperties2KHR(vkEnc, VK_SUCCESS, physicalDevice, pImageFormatInfo, pImageFormatProperties);
return vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return;
}
static void entry_vkGetPhysicalDeviceQueueFamilyProperties2KHR(
diff --git a/system/vulkan_enc/AndroidHardwareBuffer.cpp b/system/vulkan_enc/AndroidHardwareBuffer.cpp
index 620159d..a447830 100644
--- a/system/vulkan_enc/AndroidHardwareBuffer.cpp
+++ b/system/vulkan_enc/AndroidHardwareBuffer.cpp
@@ -24,8 +24,8 @@
/* Construct ahw usage mask from image usage bits, see
* 'AHardwareBuffer Usage Equivalence' in Vulkan spec.
*/
-static uint64_t
-goldfish_ahw_usage_from_vk_usage(const VkImageCreateFlags vk_create,
+uint64_t
+getAndroidHardwareBufferUsageFromVkUsage(const VkImageCreateFlags vk_create,
const VkImageUsageFlags vk_usage)
{
uint64_t ahw_usage = 0;
@@ -208,7 +208,7 @@
h = imageExtent.height;
layers = imageLayers;
format = android_format_from_vk(imageFormat);
- usage = goldfish_ahw_usage_from_vk_usage(imageCreateFlags, imageUsage);
+ usage = getAndroidHardwareBufferUsageFromVkUsage(imageCreateFlags, imageUsage);
} else if (hasDedicatedBuffer) {
w = bufferSize;
format = AHARDWAREBUFFER_FORMAT_BLOB;
@@ -239,4 +239,4 @@
return VK_SUCCESS;
}
-} // namespace goldfish_vk
\ No newline at end of file
+} // namespace goldfish_vk
diff --git a/system/vulkan_enc/AndroidHardwareBuffer.h b/system/vulkan_enc/AndroidHardwareBuffer.h
index fc6a27e..81e8cd9 100644
--- a/system/vulkan_enc/AndroidHardwareBuffer.h
+++ b/system/vulkan_enc/AndroidHardwareBuffer.h
@@ -24,6 +24,11 @@
namespace goldfish_vk {
+uint64_t
+getAndroidHardwareBufferUsageFromVkUsage(
+ const VkImageCreateFlags vk_create,
+ const VkImageUsageFlags vk_usage);
+
VkResult getAndroidHardwareBufferPropertiesANDROID(
const HostVisibleMemoryVirtualizationInfo* hostMemVirtInfo,
VkDevice device,
@@ -49,4 +54,4 @@
VkDeviceSize allocationInfoAllocSize,
struct AHardwareBuffer **out);
-} // namespace goldfish_vk
\ No newline at end of file
+} // namespace goldfish_vk
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 24a46e1..c02d5f4 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -2982,6 +2982,65 @@
info.bufferViews.data());
}
+ VkResult on_vkGetPhysicalDeviceImageFormatProperties2_common(
+ bool isKhr,
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties) {
+
+ VkEncoder* enc = (VkEncoder*)context;
+ (void)input_result;
+
+ VkAndroidHardwareBufferUsageANDROID* output_ahw_usage =
+ (VkAndroidHardwareBufferUsageANDROID*)vk_find_struct(
+ (vk_struct_common*)pImageFormatProperties,
+ VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID);
+
+ VkResult hostRes;
+
+ if (isKhr) {
+ hostRes = enc->vkGetPhysicalDeviceImageFormatProperties2KHR(
+ physicalDevice, pImageFormatInfo,
+ pImageFormatProperties);
+ } else {
+ hostRes = enc->vkGetPhysicalDeviceImageFormatProperties2(
+ physicalDevice, pImageFormatInfo,
+ pImageFormatProperties);
+ }
+
+ if (hostRes != VK_SUCCESS) return hostRes;
+
+ if (output_ahw_usage) {
+ output_ahw_usage->androidHardwareBufferUsage =
+ getAndroidHardwareBufferUsageFromVkUsage(
+ pImageFormatInfo->flags,
+ pImageFormatInfo->usage);
+ }
+
+ return hostRes;
+ }
+
+ VkResult on_vkGetPhysicalDeviceImageFormatProperties2(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties) {
+ return on_vkGetPhysicalDeviceImageFormatProperties2_common(
+ false /* not KHR */, context, input_result,
+ physicalDevice, pImageFormatInfo, pImageFormatProperties);
+ }
+
+ VkResult on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties) {
+ return on_vkGetPhysicalDeviceImageFormatProperties2_common(
+ true /* is KHR */, context, input_result,
+ physicalDevice, pImageFormatInfo, pImageFormatProperties);
+ }
+
uint32_t getApiVersionFromInstance(VkInstance instance) const {
AutoLock lock(mLock);
uint32_t api = kMinApiVersion;
@@ -3580,6 +3639,26 @@
descriptorUpdateTemplate, pData);
}
+VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties) {
+ return mImpl->on_vkGetPhysicalDeviceImageFormatProperties2(
+ context, input_result, physicalDevice, pImageFormatInfo,
+ pImageFormatProperties);
+}
+
+VkResult ResourceTracker::on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties) {
+ return mImpl->on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+ context, input_result, physicalDevice, pImageFormatInfo,
+ pImageFormatProperties);
+}
+
void ResourceTracker::deviceMemoryTransform_tohost(
VkDeviceMemory* memory, uint32_t memoryCount,
VkDeviceSize* offset, uint32_t offsetCount,
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 830537f..3a7177b 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -309,6 +309,18 @@
VkDescriptorUpdateTemplate descriptorUpdateTemplate,
const void* pData);
+ VkResult on_vkGetPhysicalDeviceImageFormatProperties2(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties);
+
+ VkResult on_vkGetPhysicalDeviceImageFormatProperties2KHR(
+ void* context, VkResult input_result,
+ VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
+ VkImageFormatProperties2* pImageFormatProperties);
+
bool isMemoryTypeHostVisible(VkDevice device, uint32_t typeIndex) const;
uint8_t* getMappedPointer(VkDeviceMemory memory);
VkDeviceSize getMappedSize(VkDeviceMemory memory);