// 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.

#include "impeller/renderer/backend/vulkan/device_buffer_vk.h"

#include "fml/logging.h"
#include "vulkan/vulkan_handles.hpp"

namespace impeller {

DeviceBufferAllocationVK::DeviceBufferAllocationVK(
    const VmaAllocator& allocator,
    VkBuffer buffer,
    VmaAllocation allocation,
    VmaAllocationInfo allocation_info)
    : allocator_(allocator),
      buffer_(buffer),
      allocation_(allocation),
      allocation_info_(allocation_info) {}

DeviceBufferAllocationVK::~DeviceBufferAllocationVK() {
  if (buffer_) {
    // https://github.com/flutter/flutter/issues/112387
    // This buffer can be freed once the command buffer is disposed.
    // vmaDestroyBuffer(allocator_, buffer_, allocation_);
  }
}

vk::Buffer DeviceBufferAllocationVK::GetBufferHandle() const {
  return buffer_;
}

void* DeviceBufferAllocationVK::GetMapping() const {
  return allocation_info_.pMappedData;
}

DeviceBufferVK::DeviceBufferVK(
    DeviceBufferDescriptor desc,
    ContextVK& context,
    std::unique_ptr<DeviceBufferAllocationVK> device_allocation)
    : DeviceBuffer(desc),
      context_(context),
      device_allocation_(std::move(device_allocation)) {}

DeviceBufferVK::~DeviceBufferVK() = default;

uint8_t* DeviceBufferVK::OnGetContents() const {
  return reinterpret_cast<uint8_t*>(device_allocation_->GetMapping());
}

bool DeviceBufferVK::OnCopyHostBuffer(const uint8_t* source,
                                      Range source_range,
                                      size_t offset) {
  auto dest = static_cast<uint8_t*>(device_allocation_->GetMapping());

  if (!dest) {
    return false;
  }

  if (source) {
    ::memmove(dest + offset, source + source_range.offset, source_range.length);
  }

  return true;
}

bool DeviceBufferVK::SetLabel(const std::string& label) {
  context_.SetDebugName(device_allocation_->GetBufferHandle(), label);
  return true;
}

bool DeviceBufferVK::SetLabel(const std::string& label, Range range) {
  return SetLabel(label);
}

vk::Buffer DeviceBufferVK::GetVKBufferHandle() const {
  return device_allocation_->GetBufferHandle();
}

}  // namespace impeller
