blob: 6410af5044015a4d89acb5d019bf65ccdefb0d74 [file] [log] [blame] [edit]
// Copyright 2017 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 "garnet/bin/ui/sketchy/buffer/shared_buffer.h"
#include "garnet/bin/ui/sketchy/buffer/shared_buffer_pool.h"
#include "garnet/bin/ui/sketchy/frame.h"
#include "lib/escher/escher.h"
#include "lib/escher/impl/command_buffer_pool.h"
#include "lib/escher/util/fuchsia_utils.h"
#include "lib/escher/vk/gpu_mem.h"
namespace {
const vk::BufferUsageFlags kBufferUsageFlags =
vk::BufferUsageFlagBits::eVertexBuffer |
vk::BufferUsageFlagBits::eIndexBuffer |
vk::BufferUsageFlagBits::eStorageBuffer |
vk::BufferUsageFlagBits::eTransferSrc |
vk::BufferUsageFlagBits::eTransferDst;
const vk::MemoryPropertyFlags kMemoryPropertyFlags =
vk::MemoryPropertyFlagBits::eDeviceLocal;
std::unique_ptr<scenic_lib::Buffer> NewScenicBufferFromEscherBuffer(
const escher::BufferPtr& buffer, scenic_lib::Session* session) {
zx::vmo vmo = escher::ExportMemoryAsVmo(buffer->escher(), buffer->mem());
scenic_lib::Memory memory(session, std::move(vmo),
fuchsia::images::MemoryType::VK_DEVICE_MEMORY);
return std::make_unique<scenic_lib::Buffer>(memory, 0, buffer->size());
}
} // namespace
namespace sketchy_service {
SharedBufferPtr SharedBuffer::New(scenic_lib::Session* session,
escher::BufferFactory* factory,
vk::DeviceSize capacity) {
return fxl::AdoptRef(new SharedBuffer(session, factory, capacity));
}
SharedBuffer::SharedBuffer(scenic_lib::Session* session,
escher::BufferFactory* factory,
vk::DeviceSize capacity)
: session_(session),
escher_buffer_(factory->NewBuffer(capacity, kBufferUsageFlags,
kMemoryPropertyFlags)),
scenic_buffer_(NewScenicBufferFromEscherBuffer(escher_buffer_, session)) {
}
escher::BufferRange SharedBuffer::Reserve(vk::DeviceSize size) {
FXL_DCHECK(size_ + size <= capacity());
auto old_size = size_;
size_ += size;
return {old_size, size};
}
void SharedBuffer::Copy(Frame* frame, const SharedBufferPtr& from) {
FXL_DCHECK(from->size() <= capacity());
frame->command()->CopyBufferAfterBarrier(
from->escher_buffer(), escher_buffer_, {0, 0, from->size()},
vk::AccessFlagBits::eTransferWrite | vk::AccessFlagBits::eShaderWrite,
vk::PipelineStageFlagBits::eTransfer |
vk::PipelineStageFlagBits::eComputeShader);
size_ = from->size();
}
void SharedBuffer::Reset() { size_ = 0; }
} // namespace sketchy_service