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(