in Cthulhu/src/VulkanUtil.cpp [73:129]
uint32_t findMemoryTypeIndex(
const VkPhysicalDeviceMemoryProperties& memoryProperties,
uint32_t memoryTypeBits,
VkFlags required,
VkFlags preferred,
VkFlags preferredNot) {
// first try, find required and with preferred and without preferred_not
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
bool isSupported = (1 << i) & memoryTypeBits;
if (isSupported) {
const VkMemoryType& memoryType = memoryProperties.memoryTypes[i];
if ((memoryType.propertyFlags & required) == required &&
(preferred && (memoryType.propertyFlags & preferred)) &&
(preferredNot && !(memoryType.propertyFlags & preferredNot))) {
return i;
}
}
}
// second try, find required and with preferred
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
bool isSupported = (1 << i) & memoryTypeBits;
if (isSupported) {
const VkMemoryType& memoryType = memoryProperties.memoryTypes[i];
if ((memoryType.propertyFlags & required) == required &&
(preferred && (memoryType.propertyFlags & preferred))) {
return i;
}
}
}
// third try, find required and without preferred_not
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
bool isSupported = (1 << i) & memoryTypeBits;
if (isSupported) {
const VkMemoryType& memoryType = memoryProperties.memoryTypes[i];
if ((memoryType.propertyFlags & required) == required &&
(preferredNot && !(memoryType.propertyFlags & preferredNot))) {
return i;
}
}
}
// fourth try, find any required
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++) {
bool isSupported = (1 << i) & memoryTypeBits;
if (isSupported) {
const VkMemoryType& memoryType = memoryProperties.memoryTypes[i];
if ((memoryType.propertyFlags & required) == required) {
return i;
}
}
}
XR_LOGE("No such memory type {} {} {} {}", memoryTypeBits, required, preferred, preferredNot);
return -1;
}