blob: e73bdea6104f64c4b1a60ce6f187984ff82eb22f [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.
#ifndef LIB_ESCHER_VK_BUFFER_H_
#define LIB_ESCHER_VK_BUFFER_H_
#include "lib/escher/forward_declarations.h"
#include "lib/escher/resources/waitable_resource.h"
namespace escher {
class Buffer;
typedef fxl::RefPtr<Buffer> BufferPtr;
// Range within the buffer.
struct BufferRange {
vk::DeviceSize offset;
vk::DeviceSize size;
BufferRange(vk::DeviceSize _offset, vk::DeviceSize _size)
: offset(_offset), size(_size) {}
};
// Escher's standard interface to Vulkan buffer objects.
class Buffer : public WaitableResource {
public:
static const ResourceTypeInfo kTypeInfo;
const ResourceTypeInfo& type_info() const override { return kTypeInfo; }
static BufferPtr New(ResourceManager* manager, GpuAllocator* allocator,
vk::DeviceSize size, vk::BufferUsageFlags usage_flags,
vk::MemoryPropertyFlags memory_property_flags,
vk::DeviceSize offset = 0);
static BufferPtr New(ResourceManager* manager, GpuMemPtr mem,
vk::BufferUsageFlags usage_flags, vk::DeviceSize size,
vk::DeviceSize offset = 0);
Buffer(ResourceManager* manager, GpuMemPtr mem, vk::Buffer buffer,
BufferRange range);
~Buffer() override;
// Return the underlying Vulkan buffer object.
vk::Buffer vk() { return buffer_; }
// Return the size of the buffer.
vk::DeviceSize size() const { return range_.size; }
// If the buffer is host-accessible, then this returns a direct pointer to
// cache-coherent device memory. Otherwise, returns nullptr.
uint8_t* host_ptr() const { return host_ptr_; }
const GpuMemPtr& mem() const { return mem_; }
private:
GpuMemPtr mem_;
// Underlying Vulkan buffer object.
vk::Buffer buffer_;
// Size of the buffer.
BufferRange range_;
// Pointer to mapped, cache-coherent, host-accessible memory. Or nullptr.
uint8_t* host_ptr_;
};
} // namespace escher
#endif // LIB_ESCHER_VK_BUFFER_H_