blob: 3dceae8e939a50c6abc59cc99929bc7fae2410f6 [file] [log] [blame]
// Copyright 2016 The Fuchsia 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 "lib/escher/vk/buffer.h"
#include "lib/escher/impl/vulkan_utils.h"
#include "lib/escher/resources/resource_manager.h"
#include "lib/escher/util/trace_macros.h"
#include "lib/escher/vk/gpu_allocator.h"
namespace escher {
const ResourceTypeInfo Buffer::kTypeInfo("Buffer", ResourceType::kResource,
ResourceType::kWaitableResource,
ResourceType::kBuffer);
BufferPtr Buffer::New(ResourceManager* manager, GpuMemPtr mem,
vk::BufferUsageFlags usage_flags) {
TRACE_DURATION("gfx", "escher::Buffer::New");
auto device = manager->vulkan_context().device;
// Create buffer.
vk::BufferCreateInfo buffer_create_info;
buffer_create_info.size = mem->size();
buffer_create_info.usage = usage_flags;
buffer_create_info.sharingMode = vk::SharingMode::eExclusive;
auto vk_buffer =
ESCHER_CHECKED_VK_RESULT(device.createBuffer(buffer_create_info));
return fxl::MakeRefCounted<Buffer>(manager, std::move(mem), vk_buffer);
}
Buffer::Buffer(ResourceManager* manager, GpuMemPtr mem, vk::Buffer buffer)
: WaitableResource(manager), mem_(std::move(mem)), buffer_(buffer) {
vulkan_context().device.bindBufferMemory(buffer_, mem_->base(),
mem_->offset());
}
Buffer::~Buffer() { vulkan_context().device.destroyBuffer(buffer_); }
} // namespace escher