910e62b5创建于 1月15日历史提交
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_VULKAN_SKIA_VK_MEMORY_ALLOCATOR_IMPL_H_
#define GPU_VULKAN_SKIA_VK_MEMORY_ALLOCATOR_IMPL_H_

#include "base/component_export.h"
#include "gpu/vulkan/vma_wrapper.h"
#include "third_party/skia/include/gpu/vk/VulkanMemoryAllocator.h"
#include "third_party/skia/include/gpu/vk/VulkanTypes.h"

namespace gpu {

class COMPONENT_EXPORT(VULKAN) SkiaVulkanMemoryAllocator
    : public skgpu::VulkanMemoryAllocator {
 public:
  explicit SkiaVulkanMemoryAllocator(VmaAllocator allocator);
  ~SkiaVulkanMemoryAllocator() override = default;

  SkiaVulkanMemoryAllocator(const SkiaVulkanMemoryAllocator&) = delete;
  SkiaVulkanMemoryAllocator& operator=(const SkiaVulkanMemoryAllocator&) =
      delete;

  uint64_t totalLazyAllocatedMemory() const { return lazy_allocated_size_; }

 private:
  // skgpu::VulkanMemoryAllocator:
  VkResult allocateImageMemory(
      VkImage image,
      uint32_t flags,
      skgpu::VulkanBackendMemory* backend_memory) override;
  VkResult allocateBufferMemory(
      VkBuffer buffer,
      BufferUsage usage,
      uint32_t flags,
      skgpu::VulkanBackendMemory* backend_memory) override;
  void freeMemory(const skgpu::VulkanBackendMemory& memory) override;

  void getAllocInfo(const skgpu::VulkanBackendMemory& memory,
                    skgpu::VulkanAlloc* alloc) const override;

  VkResult mapMemory(const skgpu::VulkanBackendMemory& memory,
                     void** data) override;
  void unmapMemory(const skgpu::VulkanBackendMemory& memory) override;

  VkResult flushMemory(const skgpu::VulkanBackendMemory& memory,
                       VkDeviceSize offset,
                       VkDeviceSize size) override;
  VkResult invalidateMemory(const skgpu::VulkanBackendMemory& memory,
                            VkDeviceSize offset,
                            VkDeviceSize size) override;

  std::pair<uint64_t, uint64_t> totalAllocatedAndUsedMemory() const override;

  const VmaAllocator allocator_;

  // Tracks vulkan memory that has lazily allocated flag.
  VkDeviceSize lazy_allocated_size_ = 0;
};

}  // namespace gpu

#endif  // GPU_VULKAN_SKIA_VK_MEMORY_ALLOCATOR_IMPL_H_