[vulkan] host visible virt: virtualize memory types

bug: 111137294
bug: 121420031

An initial test to see if host visible memory virtualization will work,
is whether or not device memory type indices/heaps can be virtualized.

Change-Id: Ie2eb5c4a6601a0d358abd550cf1685521ed76719
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 28466b1..a3ff456 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -281,6 +281,10 @@
         (void)memoryCount;
         (void)offsetCount;
         (void)sizeCount;
+        const auto& hostVirt =
+            mHostVisibleMemoryVirtInfo;
+
+        if (!hostVirt.virtualizationSupported) return;
 
         for (uint32_t i = 0; i < memoryCount; ++i) {
             // TODO
@@ -290,13 +294,19 @@
         }
 
         for (uint32_t i = 0; i < typeIndexCount; ++i) {
-            // TODO
-            (void)typeIndex;
+            typeIndex[i] =
+                hostVirt.memoryTypeIndexMappingToHost[typeIndex[i]];
         }
 
         for (uint32_t i = 0; i < typeBitsCount; ++i) {
-            // TODO
-            (void)typeBits;
+            uint32_t bits = 0;
+            for (uint32_t j = 0; j < VK_MAX_MEMORY_TYPES; ++j) {
+                bool guestHas = typeBits[i] & (1 << j);
+                uint32_t hostIndex =
+                    hostVirt.memoryTypeIndexMappingToHost[j];
+                bits |= guestHas ? (1 << hostIndex) : 0;
+            }
+            typeBits[i] = bits;
         }
     }
 
@@ -311,6 +321,11 @@
         (void)offsetCount;
         (void)sizeCount;
         
+        const auto& hostVirt =
+            mHostVisibleMemoryVirtInfo;
+
+        if (!hostVirt.virtualizationSupported) return;
+
         for (uint32_t i = 0; i < memoryCount; ++i) {
             // TODO
             (void)memory;
@@ -319,13 +334,23 @@
         }
 
         for (uint32_t i = 0; i < typeIndexCount; ++i) {
-            // TODO
-            (void)typeIndex;
+            typeIndex[i] =
+                hostVirt.memoryTypeIndexMappingFromHost[typeIndex[i]];
         }
 
         for (uint32_t i = 0; i < typeBitsCount; ++i) {
-            // TODO
-            (void)typeBits;
+            uint32_t bits = 0;
+            for (uint32_t j = 0; j < VK_MAX_MEMORY_TYPES; ++j) {
+                bool hostHas = typeBits[i] & (1 << j);
+                uint32_t guestIndex =
+                    hostVirt.memoryTypeIndexMappingFromHost[j];
+                bits |= hostHas ? (1 << guestIndex) : 0;
+
+                if (hostVirt.memoryTypeBitsShouldAdvertiseBoth[j]) {
+                    bits |= hostHas ? (1 << j) : 0;
+                }
+            }
+            typeBits[i] = bits;
         }
     }
 
@@ -359,8 +384,19 @@
 
     void on_vkGetPhysicalDeviceMemoryProperties(
         void*,
-        VkPhysicalDevice,
-        VkPhysicalDeviceMemoryProperties*) { }
+        VkPhysicalDevice physdev,
+        VkPhysicalDeviceMemoryProperties* out) {
+        
+        initHostVisibleMemoryVirtualizationInfo(
+            physdev,
+            out,
+            mFeatureInfo->hasDirectMem,
+            &mHostVisibleMemoryVirtInfo);
+        
+        if (mHostVisibleMemoryVirtInfo.virtualizationSupported) {
+            *out = mHostVisibleMemoryVirtInfo.guestMemoryProperties;
+        }
+    }
 
     VkResult on_vkCreateDevice(
         void* context,