[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,