blob: a5d69406b564fb64a0ab6a163323c57eb525bfe4 [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.
#pragma once
#include "lib/escher/forward_declarations.h"
#include "lib/escher/resources/waitable_resource.h"
namespace escher {
class Buffer;
typedef fxl::RefPtr<Buffer> BufferPtr;
// 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; }
// Construct an ownerless Buffer. When the Buffer is destroyed, all resources
// are immediately freed/destroyed.
Buffer(ResourceManager* manager,
GpuAllocator* allocator,
vk::DeviceSize size,
vk::BufferUsageFlags usage_flags,
vk::MemoryPropertyFlags memory_property_flags);
static BufferPtr New(ResourceManager* manager,
GpuAllocator* allocator,
vk::DeviceSize size,
vk::BufferUsageFlags usage_flags,
vk::MemoryPropertyFlags memory_property_flags);
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,
vk::DeviceSize size,
vk::DeviceSize offset = 0);
~Buffer() override;
// Return the underlying Vulkan buffer object.
// TODO(ES-44): Deprecated. Use vk() instead.
vk::Buffer get() { return buffer_; }
vk::Buffer vk() { return buffer_; }
// Return the size of the buffer.
vk::DeviceSize size() const { return size_; }
// If the buffer is host-accessible, then this returns a direct pointer to
// cache-coherent device memory. Otherwise, returns nullptr.
uint8_t* ptr() const { return ptr_; }
const GpuMemPtr& mem() const { return mem_; }
private:
GpuMemPtr mem_;
// Underlying Vulkan buffer object.
vk::Buffer buffer_;
// Size of the buffer.
vk::DeviceSize size_;
// Pointer to mapped, cache-coherent, host-accessible memory. Or nullptr.
uint8_t* ptr_;
};
} // namespace escher