[vulkan] Refactor all custom logic into ResourceTracker

bug: 111137294

Taking new generated code that lets us consolidate all custom logic into
ResourceTracker. Resources.cpp now contains only trivial definitions.

Change-Id: I5f7ef0237004ccb7b7229c9eedc852f7d0490079
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 0bb42b2..2a572fe 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -21,9 +21,14 @@
 #include "android/base/AlignedBuf.h"
 #include "android/base/synchronization/AndroidLock.h"
 
+#include "gralloc_cb.h"
+#include "goldfish_vk_private_defs.h"
+
 #include <unordered_map>
 
 #include <log/log.h>
+#include <stdlib.h>
+#include <sync/sync.h>
 
 #define RESOURCE_TRACKER_DEBUG 0
 
@@ -110,8 +115,10 @@
     };
 
     struct VkDeviceMemory_Info {
-        VkDeviceSize allocationSize;
-        uint32_t memoryTypeIndex;
+        VkDeviceSize allocationSize = 0;
+        VkDeviceSize mappedSize = 0;
+        uint8_t* mappedPtr = nullptr;
+        uint32_t memoryTypeIndex = 0;
     };
 
 #define HANDLE_REGISTER_IMPL_IMPL(type) \
@@ -120,12 +127,31 @@
         AutoLock lock(mLock); \
         info_##type[obj] = type##_Info(); \
     } \
+
+#define HANDLE_UNREGISTER_IMPL_IMPL(type) \
     void unregister_##type(type obj) { \
         AutoLock lock(mLock); \
         info_##type.erase(obj); \
     } \
 
     GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_IMPL_IMPL)
+    GOLDFISH_VK_LIST_TRIVIAL_HANDLE_TYPES(HANDLE_UNREGISTER_IMPL_IMPL)
+
+    void unregister_VkDevice(VkDevice device) {
+        AutoLock lock(mLock);
+        info_VkDevice.erase(device);
+    }
+
+    void unregister_VkDeviceMemory(VkDeviceMemory mem) {
+        AutoLock lock(mLock);
+        auto it = info_VkDeviceMemory.find(mem);
+        if (it == info_VkDeviceMemory.end()) return;
+
+        auto& memInfo = it->second;
+        if (memInfo.mappedPtr) {
+            aligned_buf_free(memInfo.mappedPtr);
+        }
+    }
 
     void setDeviceInfo(VkDevice device,
                        VkPhysicalDevice physdev,
@@ -138,6 +164,19 @@
         info.memProps = memProps;
     }
 
+    void setDeviceMemoryInfo(VkDeviceMemory memory,
+                             VkDeviceSize allocationSize,
+                             VkDeviceSize mappedSize,
+                             uint8_t* ptr,
+                             uint32_t memoryTypeIndex) {
+        AutoLock lock(mLock);
+        auto& info = info_VkDeviceMemory[memory];
+        info.allocationSize = allocationSize;
+        info.mappedSize = mappedSize;
+        info.mappedPtr = ptr;
+        info.memoryTypeIndex = memoryTypeIndex;
+    }
+
     bool isMemoryTypeHostVisible(VkDevice device, uint32_t typeIndex) const {
         AutoLock lock(mLock);
         const auto it = info_VkDevice.find(device);
@@ -145,10 +184,28 @@
         if (it == info_VkDevice.end()) return false;
 
         const auto& info = it->second;
-        return info.memProps.memoryTypes[typeIndex].propertyFlags & 
+        return info.memProps.memoryTypes[typeIndex].propertyFlags &
                VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
     }
 
+    uint8_t* getMappedPointer(VkDeviceMemory memory) {
+        AutoLock lock(mLock);
+        const auto it = info_VkDeviceMemory.find(memory);
+        if (it == info_VkDeviceMemory.end()) return nullptr;
+
+        const auto& info = it->second;
+        return info.mappedPtr;
+    }
+
+    VkDeviceSize getMappedSize(VkDeviceMemory memory) {
+        AutoLock lock(mLock);
+        const auto it = info_VkDeviceMemory.find(memory);
+        if (it == info_VkDeviceMemory.end()) return 0;
+
+        const auto& info = it->second;
+        return info.mappedSize;
+    }
+
     VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const {
         AutoLock lock(mLock);
         const auto it = info_VkDevice.find(device);
@@ -162,6 +219,52 @@
         return atoms * nonCoherentAtomSize;
     }
 
+    bool isValidMemoryRange(const VkMappedMemoryRange& range) const {
+        AutoLock lock(mLock);
+        const auto it = info_VkDeviceMemory.find(range.memory);
+        if (it == info_VkDeviceMemory.end()) return false;
+        const auto& info = it->second;
+
+        if (!info.mappedPtr) return false;
+
+        VkDeviceSize offset = range.offset;
+        VkDeviceSize size = range.size;
+
+        if (size == VK_WHOLE_SIZE) {
+            return offset <= info.mappedSize;
+        }
+
+        return offset + size <= info.mappedSize;
+    }
+
+    VkResult on_vkEnumerateInstanceVersion(
+        void*,
+        VkResult,
+        uint32_t* apiVersion) {
+        if (apiVersion) {
+            *apiVersion = VK_MAKE_VERSION(1, 0, 0);
+        }
+        return VK_SUCCESS;
+    }
+
+    VkResult on_vkEnumerateDeviceExtensionProperties(
+        void*,
+        VkResult,
+        VkPhysicalDevice,
+        const char*,
+        uint32_t* pPropertyCount,
+        VkExtensionProperties*) {
+        *pPropertyCount = 0;
+        return VK_SUCCESS;
+    }
+
+    void on_vkGetPhysicalDeviceProperties2(
+        void*,
+        VkPhysicalDevice,
+        VkPhysicalDeviceProperties2*) {
+        // no-op
+    }
+
     VkResult on_vkCreateDevice(
         void* context,
         VkResult input_result,
@@ -194,30 +297,97 @@
 
         if (input_result != VK_SUCCESS) return input_result;
 
-        // Assumes pMemory has already been allocated.
-        goldfish_VkDeviceMemory* mem = as_goldfish_VkDeviceMemory(*pMemory);
-        VkDeviceSize size = pAllocateInfo->allocationSize;
+        VkDeviceSize allocationSize = pAllocateInfo->allocationSize;
+        VkDeviceSize mappedSize = getNonCoherentExtendedSize(device, allocationSize);
+        uint8_t* mappedPtr = nullptr;
 
-        // assume memory is not host visible.
-        mem->ptr = nullptr;
-        mem->size = size;
-        mem->mappedSize = getNonCoherentExtendedSize(device, size);
-
-        if (!isMemoryTypeHostVisible(device, pAllocateInfo->memoryTypeIndex)) {
-            return input_result;
+        if (isMemoryTypeHostVisible(device, pAllocateInfo->memoryTypeIndex)) {
+            mappedPtr = (uint8_t*)aligned_buf_alloc(4096, mappedSize);
+            D("host visible alloc: size 0x%llx host ptr %p mapped size 0x%llx",
+              (unsigned long long)size, mem->ptr,
+              (unsigned long long)mem->mappedSize);
         }
 
-        // This is a strict alignment; we do not expect any
-        // actual device to have more stringent requirements
-        // than this.
-        mem->ptr = (uint8_t*)aligned_buf_alloc(4096, mem->mappedSize);
-        D("host visible alloc: size 0x%llx host ptr %p mapped size 0x%llx",
-          (unsigned long long)size, mem->ptr,
-          (unsigned long long)mem->mappedSize);
+        setDeviceMemoryInfo(
+            *pMemory, allocationSize, mappedSize, mappedPtr,
+            pAllocateInfo->memoryTypeIndex);
 
         return input_result;
     }
 
+    VkResult on_vkMapMemory(
+        void*,
+        VkResult host_result,
+        VkDevice,
+        VkDeviceMemory memory,
+        VkDeviceSize offset,
+        VkDeviceSize size,
+        VkMemoryMapFlags,
+        void** ppData) {
+
+        if (host_result != VK_SUCCESS) return host_result;
+
+        AutoLock lock(mLock);
+
+        auto it = info_VkDeviceMemory.find(memory);
+        if (it == info_VkDeviceMemory.end()) return VK_ERROR_MEMORY_MAP_FAILED;
+
+        auto& info = it->second;
+
+        if (!info.mappedPtr) return VK_ERROR_MEMORY_MAP_FAILED;
+
+        if (size != VK_WHOLE_SIZE &&
+            (info.mappedPtr + offset + size > info.mappedPtr + info.allocationSize)) {
+            return VK_ERROR_MEMORY_MAP_FAILED;
+        }
+
+        *ppData = info.mappedPtr + offset;
+
+        return host_result;
+    }
+
+    void on_vkUnmapMemory(
+        void*,
+        VkDevice,
+        VkDeviceMemory) {
+        // no-op
+    }
+
+    void unwrap_VkNativeBufferANDROID(
+        const VkImageCreateInfo* pCreateInfo,
+        VkImageCreateInfo* local_pCreateInfo) {
+
+        if (!pCreateInfo->pNext) return;
+
+        const VkNativeBufferANDROID* nativeInfo =
+            reinterpret_cast<const VkNativeBufferANDROID*>(pCreateInfo->pNext);
+
+        if (VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID != nativeInfo->sType) {
+            return;
+        }
+
+        const cb_handle_t* cb_handle =
+            reinterpret_cast<const cb_handle_t*>(nativeInfo->handle);
+
+        if (!cb_handle) return;
+
+        VkNativeBufferANDROID* nativeInfoOut =
+            reinterpret_cast<VkNativeBufferANDROID*>(local_pCreateInfo);
+
+        if (!nativeInfoOut->handle) {
+            ALOGE("FATAL: Local native buffer info not properly allocated!");
+            abort();
+        }
+
+        *(uint32_t*)(nativeInfoOut->handle) = cb_handle->hostHandle;
+    }
+
+    void unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int*) {
+        if (fd != -1) {
+            sync_wait(fd, 3000);
+        }
+    }
+
 private:
     mutable Lock mLock;
 
@@ -269,10 +439,47 @@
     return mImpl->isMemoryTypeHostVisible(device, typeIndex);
 }
 
+uint8_t* ResourceTracker::getMappedPointer(VkDeviceMemory memory) {
+    return mImpl->getMappedPointer(memory);
+}
+
+VkDeviceSize ResourceTracker::getMappedSize(VkDeviceMemory memory) {
+    return mImpl->getMappedSize(memory);
+}
+
 VkDeviceSize ResourceTracker::getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const {
     return mImpl->getNonCoherentExtendedSize(device, basicSize);
 }
 
+bool ResourceTracker::isValidMemoryRange(const VkMappedMemoryRange& range) const {
+    return mImpl->isValidMemoryRange(range);
+}
+
+VkResult ResourceTracker::on_vkEnumerateInstanceVersion(
+    void* context,
+    VkResult input_result,
+    uint32_t* apiVersion) {
+    return mImpl->on_vkEnumerateInstanceVersion(context, input_result, apiVersion);
+}
+
+VkResult ResourceTracker::on_vkEnumerateDeviceExtensionProperties(
+    void* context,
+    VkResult input_result,
+    VkPhysicalDevice physicalDevice,
+    const char* pLayerName,
+    uint32_t* pPropertyCount,
+    VkExtensionProperties* pProperties) {
+    return mImpl->on_vkEnumerateDeviceExtensionProperties(
+        context, input_result, physicalDevice, pLayerName, pPropertyCount, pProperties);
+}
+
+void ResourceTracker::on_vkGetPhysicalDeviceProperties2(
+    void* context,
+    VkPhysicalDevice physicalDevice,
+    VkPhysicalDeviceProperties2* pProperties) {
+    mImpl->on_vkGetPhysicalDeviceProperties2(context, physicalDevice, pProperties);
+}
+
 VkResult ResourceTracker::on_vkCreateDevice(
     void* context,
     VkResult input_result,
@@ -295,4 +502,34 @@
         context, input_result, device, pAllocateInfo, pAllocator, pMemory);
 }
 
+VkResult ResourceTracker::on_vkMapMemory(
+    void* context,
+    VkResult input_result,
+    VkDevice device,
+    VkDeviceMemory memory,
+    VkDeviceSize offset,
+    VkDeviceSize size,
+    VkMemoryMapFlags flags,
+    void** ppData) {
+    return mImpl->on_vkMapMemory(
+        context, input_result, device, memory, offset, size, flags, ppData);
+}
+
+void ResourceTracker::on_vkUnmapMemory(
+    void* context,
+    VkDevice device,
+    VkDeviceMemory memory) {
+    mImpl->on_vkUnmapMemory(context, device, memory);
+}
+
+void ResourceTracker::unwrap_VkNativeBufferANDROID(
+    const VkImageCreateInfo* pCreateInfo,
+    VkImageCreateInfo* local_pCreateInfo) {
+    mImpl->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo);
+}
+
+void ResourceTracker::unwrap_vkAcquireImageANDROID_nativeFenceFd(int fd, int* fd_out) {
+    mImpl->unwrap_vkAcquireImageANDROID_nativeFenceFd(fd, fd_out);
+}
+
 } // namespace goldfish_vk