gfxstream: Clean up VK_KHR_external_memory_fd support for Linux
BUG=333133323
TEST=launch_cvd --gpu_mode=gfxstream_guest_angle
Change-Id: I3e884c632e6752ed87b91c5b9f44daa3303ead89
diff --git a/guest/vulkan/gfxstream_vk_device.cpp b/guest/vulkan/gfxstream_vk_device.cpp
index e1bf4c0..40d5fb4 100644
--- a/guest/vulkan/gfxstream_vk_device.cpp
+++ b/guest/vulkan/gfxstream_vk_device.cpp
@@ -760,29 +760,6 @@
}
}
-VkResult gfxstream_vk_GetMemoryFdKHR(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo,
- int* pFd) {
- AEMU_SCOPED_TRACE("vkGetMemoryFdKHR");
- VK_FROM_HANDLE(gfxstream_vk_device, gfxstream_device, device);
- VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
-
- {
- auto vkEnc = gfxstream::vk::ResourceTracker::getThreadLocalEncoder();
- std::vector<VkMemoryGetFdInfoKHR> internal_pGetFdInfo(1);
- for (uint32_t i = 0; i < 1; ++i) {
- internal_pGetFdInfo[i] = pGetFdInfo[i];
- /* VkMemoryGetFdInfoKHR::memory */
- VK_FROM_HANDLE(gfxstream_vk_device_memory, gfxstream_memory,
- internal_pGetFdInfo[i].memory);
- internal_pGetFdInfo[i].memory = gfxstream_memory->internal_object;
- }
- auto resources = gfxstream::vk::ResourceTracker::get();
- vkGetMemoryFdKHR_VkResult_return = resources->on_vkGetMemoryFdKHR(
- vkEnc, VK_SUCCESS, gfxstream_device->internal_object, internal_pGetFdInfo.data(), pFd);
- }
- return vkGetMemoryFdKHR_VkResult_return;
-}
-
VkResult gfxstream_vk_EnumerateInstanceLayerProperties(uint32_t* pPropertyCount,
VkLayerProperties* pProperties) {
AEMU_SCOPED_TRACE("vkEnumerateInstanceLayerProperties");
diff --git a/guest/vulkan_enc/ResourceTracker.cpp b/guest/vulkan_enc/ResourceTracker.cpp
index ddd4815..bcc0b4e 100644
--- a/guest/vulkan_enc/ResourceTracker.cpp
+++ b/guest/vulkan_enc/ResourceTracker.cpp
@@ -5596,6 +5596,42 @@
#endif
}
+VkResult ResourceTracker::on_vkGetMemoryFdPropertiesKHR(
+ void* context, VkResult, VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd,
+ VkMemoryFdPropertiesKHR* pMemoryFdProperties) {
+#if defined(__linux__) && !defined(VK_USE_PLATFORM_ANDROID_KHR)
+ if (!(handleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT)) {
+ ALOGE("%s: VK_KHR_external_memory_fd behavior not defined for handleType: 0x%x\n", __func__,
+ handleType);
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+ }
+ // Sanity-check device
+ AutoLock<RecursiveLock> lock(mLock);
+ auto deviceIt = info_VkDevice.find(device);
+ if (deviceIt == info_VkDevice.end()) {
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+ }
+ // TODO: Verify FD valid ?
+ (void)fd;
+
+ if (mCaps.vulkanCapset.colorBufferMemoryIndex == 0xFFFFFFFF) {
+ mCaps.vulkanCapset.colorBufferMemoryIndex = getColorBufferMemoryIndex(context, device);
+ }
+
+ updateMemoryTypeBits(&pMemoryFdProperties->memoryTypeBits,
+ mCaps.vulkanCapset.colorBufferMemoryIndex);
+
+ return VK_SUCCESS;
+#else
+ (void)context;
+ (void)device;
+ (void)handleType;
+ (void)fd;
+ (void)pMemoryFdProperties;
+ return VK_ERROR_INCOMPATIBLE_DRIVER;
+#endif
+}
+
VkResult ResourceTracker::on_vkGetMemoryFdKHR(void* context, VkResult, VkDevice device,
const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd) {
#if defined(__linux__) && !defined(VK_USE_PLATFORM_ANDROID_KHR)
diff --git a/guest/vulkan_enc/ResourceTracker.h b/guest/vulkan_enc/ResourceTracker.h
index bda7d91..a93c369 100644
--- a/guest/vulkan_enc/ResourceTracker.h
+++ b/guest/vulkan_enc/ResourceTracker.h
@@ -272,6 +272,9 @@
VkResult on_vkGetMemoryFdKHR(void* context, VkResult input_result, VkDevice device,
const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd);
+ VkResult on_vkGetMemoryFdPropertiesKHR(void* context, VkResult input_result, VkDevice device,
+ VkExternalMemoryHandleTypeFlagBits handleType, int fd,
+ VkMemoryFdPropertiesKHR* pMemoryFdProperties);
#ifdef VK_USE_PLATFORM_FUCHSIA
VkResult on_vkGetMemoryZirconHandleFUCHSIA(void* context, VkResult input_result,
diff --git a/guest/vulkan_enc/func_table.cpp b/guest/vulkan_enc/func_table.cpp
index 11d1206..e5b4532 100644
--- a/guest/vulkan_enc/func_table.cpp
+++ b/guest/vulkan_enc/func_table.cpp
@@ -3874,6 +3874,43 @@
#ifdef VK_KHR_external_memory_win32
#endif
#ifdef VK_KHR_external_memory_fd
+VkResult gfxstream_vk_GetMemoryFdKHR(VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo,
+ int* pFd) {
+ AEMU_SCOPED_TRACE("vkGetMemoryFdKHR");
+ VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
+ VK_FROM_HANDLE(gfxstream_vk_device, gfxstream_device, device);
+ {
+ auto vkEnc = gfxstream::vk::ResourceTracker::getThreadLocalEncoder();
+ std::vector<VkMemoryGetFdInfoKHR> internal_pGetFdInfo(1);
+ for (uint32_t i = 0; i < 1; ++i) {
+ internal_pGetFdInfo[i] = pGetFdInfo[i];
+ /* VkMemoryGetFdInfoKHR::memory */
+ VK_FROM_HANDLE(gfxstream_vk_device_memory, gfxstream_memory,
+ internal_pGetFdInfo[i].memory);
+ internal_pGetFdInfo[i].memory = gfxstream_memory->internal_object;
+ }
+ auto resources = gfxstream::vk::ResourceTracker::get();
+ vkGetMemoryFdKHR_VkResult_return = resources->on_vkGetMemoryFdKHR(
+ vkEnc, VK_SUCCESS, gfxstream_device->internal_object, internal_pGetFdInfo.data(), pFd);
+ }
+ return vkGetMemoryFdKHR_VkResult_return;
+}
+VkResult gfxstream_vk_GetMemoryFdPropertiesKHR(VkDevice device,
+ VkExternalMemoryHandleTypeFlagBits handleType,
+ int fd,
+ VkMemoryFdPropertiesKHR* pMemoryFdProperties) {
+ AEMU_SCOPED_TRACE("vkGetMemoryFdPropertiesKHR");
+ VkResult vkGetMemoryFdPropertiesKHR_VkResult_return = (VkResult)0;
+ VK_FROM_HANDLE(gfxstream_vk_device, gfxstream_device, device);
+ {
+ auto vkEnc = gfxstream::vk::ResourceTracker::getThreadLocalEncoder();
+ auto resources = gfxstream::vk::ResourceTracker::get();
+ vkGetMemoryFdPropertiesKHR_VkResult_return = resources->on_vkGetMemoryFdPropertiesKHR(
+ vkEnc, VK_SUCCESS, gfxstream_device->internal_object, handleType, fd,
+ pMemoryFdProperties);
+ }
+ return vkGetMemoryFdPropertiesKHR_VkResult_return;
+}
#endif
#ifdef VK_KHR_external_semaphore_capabilities
void gfxstream_vk_GetPhysicalDeviceExternalSemaphorePropertiesKHR(