blob: 20db2803e074799e20b174ce9ae5f3ae6e0d4a1f [file] [log] [blame]
// 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.
#ifndef GARNET_BIN_UI_SKETCHY_BUFFER_SHARED_BUFFER_H_
#define GARNET_BIN_UI_SKETCHY_BUFFER_SHARED_BUFFER_H_
#include "garnet/public/lib/escher/impl/compute_shader.h"
#include "lib/escher/resources/resource_recycler.h"
#include "lib/escher/vk/buffer_factory.h"
#include "lib/ui/scenic/cpp/resources.h"
#include "lib/ui/scenic/cpp/session.h"
namespace sketchy_service {
class Frame;
class SharedBufferPool;
class SharedBuffer;
using SharedBufferPtr = fxl::RefPtr<SharedBuffer>;
// Encapsulates an Escher buffer and a Scenic buffer, which share the
// same memory. The Escher buffer is exported as a VMO, which is used to
// create the Scenic buffer.
class SharedBuffer final : public fxl::RefCountedThreadSafe<SharedBuffer> {
public:
static SharedBufferPtr New(scenic::Session* session,
escher::BufferFactory* factory,
vk::DeviceSize capacity);
// Reserve a chunk of |size| for use. The requested |size| MUST fit in the
// remaining unused space in the buffer. Return the range in the buffer
// that may be used by the caller; it is unsafe to use anything outside
// this range (unless the caller somehow knows about the previously-reserved
// ranges).
escher::impl::BufferRange Reserve(vk::DeviceSize size);
// Discard the original content, and copy the content from the other one.
void Copy(Frame* frame, const SharedBufferPtr& from);
// Reset the buffer to unused state.
void Reset();
const escher::BufferPtr& escher_buffer() const { return escher_buffer_; }
const scenic::Buffer& scenic_buffer() const { return *scenic_buffer_.get(); }
vk::DeviceSize capacity() const { return escher_buffer_->size(); }
vk::DeviceSize size() const { return size_; }
private:
friend class SharedBufferPool;
SharedBuffer(scenic::Session* session, escher::BufferFactory* factory,
vk::DeviceSize capacity);
escher::BufferPtr escher_buffer_;
std::unique_ptr<scenic::Buffer> scenic_buffer_;
vk::DeviceSize size_ = 0;
FXL_DISALLOW_COPY_AND_ASSIGN(SharedBuffer);
};
} // namespace sketchy_service
#endif // GARNET_BIN_UI_SKETCHY_BUFFER_SHARED_BUFFER_H_