summaryrefslogtreecommitdiff
path: root/chromium/gpu/vulkan/vma_wrapper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/vulkan/vma_wrapper.cc')
-rw-r--r--chromium/gpu/vulkan/vma_wrapper.cc153
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