diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp index cb2425a51ee177d062120b0eb61ae089f6f1692f..db314e21d09379e3acf29c24405926466e52e151 100644 --- a/src/vkcv/BufferManager.cpp +++ b/src/vkcv/BufferManager.cpp @@ -28,28 +28,29 @@ namespace vkcv { } /** - * @brief searches memory type index for buffer allocation, inspired by vulkan tutorial and "https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp" + * @brief searches memory type index for buffer allocation, combines requirements of buffer and application * @param physicalMemoryProperties Memory Properties of physical device - * @param typeBits + * @param typeBits Bit field for suitable memory types * @param requirements Property flags that are required * @return memory type index for Buffer */ - uint32_t searchMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { - uint32_t memoryTypeIndex = 0; - - for (uint32_t i = 0; i < physicalMemoryProperties.memoryTypeCount; i++) - { - if ((typeBits & 1) && - ((physicalMemoryProperties.memoryTypes[i].propertyFlags & requirements) == requirements)) - { - memoryTypeIndex = i; - break; - } - - typeBits >>= 1; + uint32_t searchBufferMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { + const uint32_t memoryCount = physicalMemoryProperties.memoryTypeCount; + for (uint32_t memoryIndex = 0; memoryIndex < memoryCount; ++memoryIndex) { + const uint32_t memoryTypeBits = (1 << memoryIndex); + const bool isRequiredMemoryType = typeBits & memoryTypeBits; + + const vk::MemoryPropertyFlags properties = + physicalMemoryProperties.memoryTypes[memoryIndex].propertyFlags; + const bool hasRequiredProperties = + (properties & requirements) == requirements; + + if (isRequiredMemoryType && hasRequiredProperties) + return static_cast<int32_t>(memoryIndex); } - - return memoryTypeIndex; + + // failed to find memory type + return -1; } uint64_t BufferManager::createBuffer(BufferType type, size_t size, BufferMemoryType memoryType) { @@ -103,7 +104,7 @@ namespace vkcv { break; } - const uint32_t memoryTypeIndex = searchMemoryType( + const uint32_t memoryTypeIndex = searchBufferMemoryType( physicalDevice.getMemoryProperties(), requirements.memoryTypeBits, memoryTypeFlags diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp index c99f1b8a278f825c46f8fe7d3540ec47041d7be2..a77976f548cc54556f0a12695faccb5664fbbb48 100644 --- a/src/vkcv/ImageManager.cpp +++ b/src/vkcv/ImageManager.cpp @@ -8,7 +8,14 @@ namespace vkcv { - uint32_t searchMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { + /** + * @brief searches memory type index for image allocation, combines requirements of image and application + * @param physicalMemoryProperties Memory Properties of physical device + * @param typeBits Bit field for suitable memory types + * @param requirements Property flags that are required + * @return memory type index for image + */ + uint32_t searchImageMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) { const uint32_t memoryCount = physicalMemoryProperties.memoryTypeCount; for (uint32_t memoryIndex = 0; memoryIndex < memoryCount; ++memoryIndex) { const uint32_t memoryTypeBits = (1 << memoryIndex); @@ -75,7 +82,7 @@ namespace vkcv { vk::MemoryPropertyFlags memoryTypeFlags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent; bool mappable = false; - const uint32_t memoryTypeIndex = searchMemoryType( + const uint32_t memoryTypeIndex = searchImageMemoryType( physicalDevice.getMemoryProperties(), requirements.memoryTypeBits, memoryTypeFlags