blob: 3db50863c113fcfb73751a68716a13760953fb0f [file] [log] [blame]
// Copyright 2018 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/impl/naive_buffer.h"
#include "lib/escher/impl/vulkan_utils.h"
#include "lib/escher/resources/resource_manager.h"
#include "lib/escher/util/trace_macros.h"
namespace escher {
namespace impl {
BufferPtr NaiveBuffer::New(ResourceManager* manager, GpuMemPtr mem,
vk::BufferUsageFlags usage_flags) {
TRACE_DURATION("gfx", "escher::NaiveBuffer::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::AdoptRef(new NaiveBuffer(manager, std::move(mem), vk_buffer));
}
NaiveBuffer::NaiveBuffer(ResourceManager* manager, GpuMemPtr mem,
vk::Buffer buffer)
: Buffer(manager, buffer, mem->size(), mem->mapped_ptr()),
mem_(std::move(mem)) {
FXL_CHECK(vk());
FXL_CHECK(mem_);
auto status = vulkan_context().device.bindBufferMemory(vk(), mem_->base(),
mem_->offset());
FXL_CHECK(status == vk::Result::eSuccess)
<< "bindBufferMemory failed with status " << (VkResult)status;
}
NaiveBuffer::~NaiveBuffer() { vulkan_context().device.destroyBuffer(vk()); }
} // namespace impl
} // namespace escher