VkCommonOperations: Accept non-cached staging memory

Came across this limitation while playing with memory types. I don't see
a reason other than performance that we can't use non-cached types for
staging memory. Instead, we can try looking for cached ones, and if we
fail then look again.

Bug: b/249823013
Test: Verified a memory type like this boots the emulator
Change-Id: I6fcf86cd27191c722685f7dbfd31a023088dd471
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp
index 70929f7..9a9fc6a 100644
--- a/stream-servers/vulkan/VkCommonOperations.cpp
+++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -140,7 +140,7 @@
     bool foundSuitableStagingMemoryType = false;
     uint32_t stagingMemoryTypeIndex = 0;
 
-    for (uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i) {
+    for (uint32_t i = 0; i < memProps->memoryTypeCount; ++i) {
         const auto& typeInfo = memProps->memoryTypes[i];
         bool hostVisible = typeInfo.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
         bool hostCached = typeInfo.propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
@@ -152,6 +152,21 @@
         }
     }
 
+    // If the previous loop failed, try to accept a type that is not HOST_CACHED.
+    if (!foundSuitableStagingMemoryType) {
+        for (uint32_t i = 0; i < memProps->memoryTypeCount; ++i) {
+            const auto& typeInfo = memProps->memoryTypes[i];
+            bool hostVisible = typeInfo.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
+            bool allowedInBuffer = (1 << i) & memReqs.memoryTypeBits;
+            if (hostVisible && allowedInBuffer) {
+                VK_COMMON_ERROR("Warning: using non-cached HOST_VISIBLE type for staging memory");
+                foundSuitableStagingMemoryType = true;
+                stagingMemoryTypeIndex = i;
+                break;
+            }
+        }
+    }
+
     vk->vkDestroyBuffer(device, testBuffer, nullptr);
 
     if (!foundSuitableStagingMemoryType) {