blob: 4a9bdaf9c6ed81077248cb2e87c66aa566fb06dc [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_FLUTTER_VMA_FLUTTER_SKIA_VMA_H_
#define FLUTTER_FLUTTER_VMA_FLUTTER_SKIA_VMA_H_
#include "flutter/flutter_vma/flutter_vma.h"
#include "flutter/fml/memory/ref_ptr.h"
#include "flutter/vulkan/procs/vulkan_proc_table.h"
#include "third_party/skia/include/gpu/vk/GrVkBackendContext.h"
namespace flutter {
class FlutterSkiaVulkanMemoryAllocator : public skgpu::VulkanMemoryAllocator {
public:
static sk_sp<VulkanMemoryAllocator> Make(
uint32_t vulkan_api_version,
VkInstance instance,
VkPhysicalDevice physicalDevice,
VkDevice device,
const fml::RefPtr<vulkan::VulkanProcTable>& vk,
bool mustUseCoherentHostVisibleMemory);
~FlutterSkiaVulkanMemoryAllocator() override;
VkResult allocateImageMemory(VkImage image,
uint32_t allocationPropertyFlags,
skgpu::VulkanBackendMemory*) override;
VkResult allocateBufferMemory(VkBuffer buffer,
BufferUsage usage,
uint32_t allocationPropertyFlags,
skgpu::VulkanBackendMemory*) override;
void freeMemory(const skgpu::VulkanBackendMemory&) override;
void getAllocInfo(const skgpu::VulkanBackendMemory&,
skgpu::VulkanAlloc*) const override;
VkResult mapMemory(const skgpu::VulkanBackendMemory&, void** data) override;
void unmapMemory(const skgpu::VulkanBackendMemory&) override;
VkResult flushMemory(const skgpu::VulkanBackendMemory&,
VkDeviceSize offset,
VkDeviceSize size) override;
VkResult invalidateMemory(const skgpu::VulkanBackendMemory&,
VkDeviceSize offset,
VkDeviceSize size) override;
std::pair<uint64_t, uint64_t> totalAllocatedAndUsedMemory() const override;
private:
FlutterSkiaVulkanMemoryAllocator(
fml::RefPtr<vulkan::VulkanProcTable> vk_proc_table,
VmaAllocator allocator,
bool mustUseCoherentHostVisibleMemory);
fml::RefPtr<vulkan::VulkanProcTable> vk_proc_table_;
VmaAllocator allocator_;
// For host visible allocations do we require they are coherent or not. All
// devices are required to support a host visible and coherent memory type.
// This is used to work around bugs for devices that don't handle non coherent
// memory correctly.
bool must_use_coherent_host_visible_memory_;
};
} // namespace flutter
#endif // FLUTTER_FLUTTER_VMA_FLUTTER_SKIA_VMA_H_