@ -242,11 +242,7 @@ namespace Vulkan {
VmaAllocation allocation { } ;
VkMemoryPropertyFlags property_flags { } ;
VkResult result = vmaCreateBuffer ( allocator , & ci , & alloc_ci , & handle , & allocation , & alloc_info ) ;
if ( result = = VK_ERROR_OUT_OF_DEVICE_MEMORY ) {
LOG_ERROR ( Render_Vulkan , " Out of memory creating buffer (size: {}) " , ci . size ) ;
}
vk : : Check ( result ) ;
vk : : Check ( vmaCreateBuffer ( allocator , & ci , & alloc_ci , & handle , & allocation , & alloc_info ) ) ;
vmaGetAllocationMemoryProperties ( allocator , allocation , & property_flags ) ;
u8 * data = reinterpret_cast < u8 * > ( alloc_info . pMappedData ) ;
@ -260,36 +256,30 @@ namespace Vulkan {
MemoryCommit MemoryAllocator : : Commit ( const VkMemoryRequirements & reqs , MemoryUsage usage )
{
// Adreno stands firm - ensure 4KB alignment for Qualcomm GPUs
VkMemoryRequirements adjusted_reqs = reqs ;
if ( device . GetDriverID ( ) = = VK_DRIVER_ID_QUALCOMM_PROPRIETARY ) {
adjusted_reqs . size = Common : : AlignUp ( reqs . size , 4096 ) ;
}
const auto vma_usage = MemoryUsageVma ( usage ) ;
VmaAllocationCreateInfo ci { } ;
ci . flags = VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT | MemoryUsageVmaFlags ( usage ) ;
ci . usage = vma_usage ;
ci . memoryTypeBits = adjusted_ reqs. memoryTypeBits & valid_memory_types ;
ci . memoryTypeBits = reqs . memoryTypeBits & valid_memory_types ;
ci . requiredFlags = 0 ;
ci . preferredFlags = MemoryUsagePreferredVmaFlags ( usage ) ;
VmaAllocation a { } ;
VmaAllocationInfo info { } ;
VkResult res = vmaAllocateMemory ( allocator , & adjusted_ reqs, & ci , & a , & info ) ;
VkResult res = vmaAllocateMemory ( allocator , & reqs , & ci , & a , & info ) ;
if ( res ! = VK_SUCCESS ) {
// Relax 1: drop budget constraint
auto ci2 = ci ;
ci2 . flags & = ~ VMA_ALLOCATION_CREATE_WITHIN_BUDGET_BIT ;
res = vmaAllocateMemory ( allocator , & adjusted_ reqs, & ci2 , & a , & info ) ;
res = vmaAllocateMemory ( allocator , & reqs , & ci2 , & a , & info ) ;
// Relax 2: if we preferred DEVICE_LOCAL, drop that preference
if ( res ! = VK_SUCCESS & & ( ci . preferredFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT ) ) {
auto ci3 = ci2 ;
ci3 . preferredFlags & = ~ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT ;
res = vmaAllocateMemory ( allocator , & adjusted_ reqs, & ci3 , & a , & info ) ;
res = vmaAllocateMemory ( allocator , & reqs , & ci3 , & a , & info ) ;
}
}