[vulkan] Fill in missing pieces for AHardwareBuffer and sync fd supporti
bug: 122080810
- Add goldfish_sync_signal ioctl.
This requires a newer guest kernel.
- Add external AHB format, which is really a Vulkan format
(VK_FORMAT_G8B8G8R8_422_UNORM);
this is meant to satisfy the external buffer path of AHB/Vulkan interop.
- Use this external format (which is not really external)
when appropriate VkExternalFormatANDROID structs are passed to either
vkCreateImage or vkCreateSamplerYcbcrConversion.
- Do not allow any kind of buffer/image, external or not,
to use memory types that are not device local nor host visible.
These memory types occur on NVIDIA and guest apps will land on
those memory types if we so much as look at it wrong.
- Do not pass through dedicated allocation info to the host
if we are importing AHardwareBuffer. That's because on the host,
we are not using dedicated allocations for the ColorBuffer,
and according to the spec, if we import allocate a dedicated-image
memory, the memory that we imported must also be a dedicated-image
allocation, and the image must be identical to boot.
- Advertise that dedicated allocation is required and preferred
for external buffers/images, in line with the AHardwareBuffer spec.
- Integrate the sync device; similarly to Fuchsia events,
wait on pre signal semaphores sync fd's and signal post wait sync fd's.
- Finally, treat AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM as
VK_FORMAT_R8G8B8A8_UNORM, not VK_FORMAT_R8G8B8_UNORM.
Change-Id: I995ac11071867ee55adaeb1acdee040bba0a8762
diff --git a/system/vulkan/func_table.cpp b/system/vulkan/func_table.cpp
index 943ac96..d5ebf2d 100644
--- a/system/vulkan/func_table.cpp
+++ b/system/vulkan/func_table.cpp
@@ -1712,7 +1712,8 @@
AEMU_SCOPED_TRACE("vkCreateSamplerYcbcrConversion");
auto vkEnc = HostConnection::get()->vkEncoder();
VkResult vkCreateSamplerYcbcrConversion_VkResult_return = (VkResult)0;
- vkCreateSamplerYcbcrConversion_VkResult_return = vkEnc->vkCreateSamplerYcbcrConversion(device, pCreateInfo, pAllocator, pYcbcrConversion);
+ auto resources = ResourceTracker::get();
+ vkCreateSamplerYcbcrConversion_VkResult_return = resources->on_vkCreateSamplerYcbcrConversion(vkEnc, VK_SUCCESS, device, pCreateInfo, pAllocator, pYcbcrConversion);
return vkCreateSamplerYcbcrConversion_VkResult_return;
}
static void entry_vkDestroySamplerYcbcrConversion(
@@ -2747,7 +2748,8 @@
AEMU_SCOPED_TRACE("vkCreateSamplerYcbcrConversionKHR");
auto vkEnc = HostConnection::get()->vkEncoder();
VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return = (VkResult)0;
- vkCreateSamplerYcbcrConversionKHR_VkResult_return = vkEnc->vkCreateSamplerYcbcrConversionKHR(device, pCreateInfo, pAllocator, pYcbcrConversion);
+ auto resources = ResourceTracker::get();
+ vkCreateSamplerYcbcrConversionKHR_VkResult_return = resources->on_vkCreateSamplerYcbcrConversionKHR(vkEnc, VK_SUCCESS, device, pCreateInfo, pAllocator, pYcbcrConversion);
return vkCreateSamplerYcbcrConversionKHR_VkResult_return;
}
static void entry_vkDestroySamplerYcbcrConversionKHR(