diff options
Diffstat (limited to 'chromium/gpu/vulkan/vma_wrapper.cc')
-rw-r--r-- | chromium/gpu/vulkan/vma_wrapper.cc | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/chromium/gpu/vulkan/vma_wrapper.cc b/chromium/gpu/vulkan/vma_wrapper.cc new file mode 100644 index 00000000000..1c8d72f598d --- /dev/null +++ b/chromium/gpu/vulkan/vma_wrapper.cc @@ -0,0 +1,153 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/vulkan/vma_wrapper.h" + +#include <vk_mem_alloc.h> + +#include "build/build_config.h" +#include "gpu/vulkan/vulkan_function_pointers.h" + +namespace gpu { +namespace vma { + +VkResult CreateAllocator(VkPhysicalDevice physical_device, + VkDevice device, + VkInstance instance, + VmaAllocator* pAllocator) { + auto* function_pointers = gpu::GetVulkanFunctionPointers(); + VmaVulkanFunctions functions = { + function_pointers->vkGetPhysicalDevicePropertiesFn.get(), + function_pointers->vkGetPhysicalDeviceMemoryPropertiesFn.get(), + function_pointers->vkAllocateMemoryFn.get(), + function_pointers->vkFreeMemoryFn.get(), + function_pointers->vkMapMemoryFn.get(), + function_pointers->vkUnmapMemoryFn.get(), + function_pointers->vkFlushMappedMemoryRangesFn.get(), + function_pointers->vkInvalidateMappedMemoryRangesFn.get(), + function_pointers->vkBindBufferMemoryFn.get(), + function_pointers->vkBindImageMemoryFn.get(), + function_pointers->vkGetBufferMemoryRequirementsFn.get(), + function_pointers->vkGetImageMemoryRequirementsFn.get(), + function_pointers->vkCreateBufferFn.get(), + function_pointers->vkDestroyBufferFn.get(), + function_pointers->vkCreateImageFn.get(), + function_pointers->vkDestroyImageFn.get(), + function_pointers->vkCmdCopyBufferFn.get(), + function_pointers->vkGetBufferMemoryRequirements2Fn.get(), + function_pointers->vkGetImageMemoryRequirements2Fn.get(), + }; + + VmaAllocatorCreateInfo allocator_info = { + .flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, + .physicalDevice = physical_device, + .device = device, + // 4MB was picked for the size here by looking at memory usage of Android + // apps and runs of DM. It seems to be a good compromise of not wasting + // unused allocated space and not making too many small allocations. The + // AMD allocator will start making blocks at 1/8 the max size and builds + // up block size as needed before capping at the max set here. + .preferredLargeHeapBlockSize = 4 * 1024 * 1024, + .pVulkanFunctions = &functions, + .instance = instance, + }; + + return vmaCreateAllocator(&allocator_info, pAllocator); +} + +void DestroyAllocator(VmaAllocator allocator) { + vmaDestroyAllocator(allocator); +} + +VkResult AllocateMemoryForImage(VmaAllocator allocator, + VkImage image, + const VmaAllocationCreateInfo* create_info, + VmaAllocation* allocation, + VmaAllocationInfo* allocation_info) { + return vmaAllocateMemoryForImage(allocator, image, create_info, allocation, + allocation_info); +} + +VkResult AllocateMemoryForBuffer(VmaAllocator allocator, + VkBuffer buffer, + const VmaAllocationCreateInfo* create_info, + VmaAllocation* allocation, + VmaAllocationInfo* allocation_info) { + return vmaAllocateMemoryForBuffer(allocator, buffer, create_info, allocation, + allocation_info); +} + +VkResult CreateBuffer(VmaAllocator allocator, + const VkBufferCreateInfo* buffer_create_info, + VkMemoryPropertyFlags required_flags, + VkMemoryPropertyFlags preferred_flags, + VkBuffer* buffer, + VmaAllocation* allocation) { + VmaAllocationCreateInfo allocation_create_info = { + .requiredFlags = required_flags, + .preferredFlags = preferred_flags, + }; + + return vmaCreateBuffer(allocator, buffer_create_info, &allocation_create_info, + buffer, allocation, nullptr); +} + +void DestroyBuffer(VmaAllocator allocator, + VkBuffer buffer, + VmaAllocation allocation) { + vmaDestroyBuffer(allocator, buffer, allocation); +} + +VkResult MapMemory(VmaAllocator allocator, + VmaAllocation allocation, + void** data) { + return vmaMapMemory(allocator, allocation, data); +} + +void UnmapMemory(VmaAllocator allocator, VmaAllocation allocation) { + return vmaUnmapMemory(allocator, allocation); +} + +void FreeMemory(VmaAllocator allocator, VmaAllocation allocation) { + vmaFreeMemory(allocator, allocation); +} + +void FlushAllocation(VmaAllocator allocator, + VmaAllocation allocation, + VkDeviceSize offset, + VkDeviceSize size) { + vmaFlushAllocation(allocator, allocation, offset, size); +} + +void InvalidateAllocation(VmaAllocator allocator, + VmaAllocation allocation, + VkDeviceSize offset, + VkDeviceSize size) { + vmaInvalidateAllocation(allocator, allocation, offset, size); +} + +void GetAllocationInfo(VmaAllocator allocator, + VmaAllocation allocation, + VmaAllocationInfo* allocation_info) { + vmaGetAllocationInfo(allocator, allocation, allocation_info); +} + +void GetMemoryTypeProperties(VmaAllocator allocator, + uint32_t memory_type_index, + VkMemoryPropertyFlags* flags) { + vmaGetMemoryTypeProperties(allocator, memory_type_index, flags); +} + +void GetPhysicalDeviceProperties( + VmaAllocator allocator, + const VkPhysicalDeviceProperties** physical_device_properties) { + vmaGetPhysicalDeviceProperties(allocator, physical_device_properties); +} + +void CalculateStats(VmaAllocator allocator, VmaStats* stats) { + vmaCalculateStats(allocator, stats); +} + +} // namespace vma +} // namespace gpu
\ No newline at end of file |