uint32_t findMemoryTypeIndex()

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;
}