Foundation
Loading...
Searching...
No Matches
Resource.hpp
Go to the documentation of this file.
1#pragma once
2#include "Common.hpp"
3namespace Foundation::RHI {
4 class RHIDevice;
6 bool isAlias{ false }; // If true, the resource is an alias of another resource.
12 bool shared{ false };
15 RHIDeviceQueueFlags sharedQueues{RHIDeviceQueueFlagsBits::Graphics | RHIDeviceQueueFlagsBits::Compute | RHIDeviceQueueFlagsBits::Transfer};
18 bool coherent{ false };
22 bool staging{ false };
23 };
28 size_t size{}; // size in bytes
29
31 {
32 return {
33 .resource = {
36 .shared = false,
37 .coherent = true,
38 .staging = true,
39 },
40 .usage = RHIBufferUsageBits::TransferSource,
41 .size = size,
42 };
43 }
44 };
45 class RHIBuffer;
47 template<typename T> using RHIBufferHandle = RHIHandle<RHIBuffer, T>;
48 class RHIBuffer : public RHIObject {
49 protected:
51 public:
53 RHIBuffer(RHIDevice const& device, RHIBufferDesc const& desc)
54 : mDevice(device), mDesc(desc) {
55 }
63 virtual void* Map() = 0;
68 virtual void Flush(size_t offset = 0, size_t size = kFullSize) = 0;
74 virtual void Unmap() = 0;
75
83 template<typename T> Span<T> MapSpan(size_t count = kFullSize) {
84 void* p = Map();
85 if (count == kFullSize)
86 count = mDesc.size / sizeof(T);
87 return { static_cast<T*>(p) , count };
88 }
92 template <typename T> T* Map()
93 {
94 return static_cast<T*>(Map());
95 }
96
97 [[nodiscard]] virtual RHIBufferScopedHandle<RHIBuffer> CreateAliasedBuffer(RHIBufferDesc const& desc, size_t offset = 0) = 0;
98 [[nodiscard]] virtual RHIBuffer* GetAliasedBuffer(Handle handle) const = 0;
99 virtual void DestroyAliasedBuffer(Handle handle) = 0;
100
101 virtual void DebugSetObjectName(const char* name) = 0;
102 };
114 class RHITexture;
115 class RHITextureView;
117 template<typename T> using RHITextureHandle = RHIHandle<RHITexture, T>;
125 // Single mip level and array layer range
127 // Number of mip levels in the range
129 /* @brief Mip level used (inclusive) */
133 /* @brief Array layers used (inclusive) */
147 {
149 .layer = {
150 .aspect = aspect,
151 .mipLevel = base_mip_level,
152 .baseArrayLayer = base_array_layer,
153 .layerCount = layer_count,
154 },
155 .mipCount = mip_count,
156 };
157 return res;
158 }
159 [[nodiscard]] constexpr bool IsValid() const
160 {
161 return layer.aspect.value && mipCount && layer.layerCount;
162 }
163 };
169 class RHITexture : public RHIObject {
170 protected:
172 public:
174 RHITexture(RHIDevice const& device, RHITextureDesc const& desc)
175 : mDevice(device), mDesc(desc) {
176 }
177
179 [[nodiscard]] virtual RHITextureView* GetImageView(Handle handle) const = 0;
180 virtual void DestroyImageView(Handle handle) = 0;
181
183 [[nodiscard]] virtual RHITexture* GetAliasedTexture(Handle handle) const = 0;
184 virtual void DestroyAliasedTexture(Handle handle) = 0;
185
186 virtual void DebugSetObjectName(const char* name) = 0;
187 };
188 class RHITextureView : public RHIObject {
189 protected:
192 public:
194 : mImage(image), mDesc(desc) {
195 }
196 [[nodiscard]] virtual RHITexture* GetTexture() const = 0;
197 virtual void DebugSetObjectName(const char* name) = 0;
198 };
232 {
233 protected:
236 public:
237 RHIAccelerationStructure(const RHIDevice& device, RHIAccelerationStructureDesc const& desc) : mDevice(device), mDesc(desc) {}
238
239 virtual void DebugSetObjectName(const char* name) = 0;
240 };
242 static RHITextureView* Get(RHITexture const* image, Handle handle) {
243 return image->GetImageView(handle);
244 }
245 static void Destroy(RHITexture* image, Handle handle) {
246 image->DestroyImageView(handle);
247 }
248 };
249 template<> struct RHIObjectTraits<RHIBuffer, RHIBuffer> {
250 static RHIBuffer* Get(RHIBuffer const* buffer, Handle handle) {
251 return buffer->GetAliasedBuffer(handle);
252 }
253 static void Destroy(RHIBuffer* buffer, Handle handle) {
254 buffer->DestroyAliasedBuffer(handle);
255 }
256 };
258 static RHITexture* Get(RHITexture const* texture, Handle handle) {
259 return texture->GetAliasedTexture(handle);
260 }
261 static void Destroy(RHITexture* texture, Handle handle) {
262 texture->DestroyAliasedTexture(handle);
263 }
264 };
265}
virtual void DebugSetObjectName(const char *name)=0
RHIAccelerationStructure(const RHIDevice &device, RHIAccelerationStructureDesc const &desc)
Definition Resource.hpp:237
const RHIAccelerationStructureDesc & mDesc
Definition Resource.hpp:235
const RHIDevice & mDevice
Definition Resource.hpp:234
Definition Resource.hpp:48
virtual void Flush(size_t offset=0, size_t size=kFullSize)=0
Flushes the mapped region to the device. Depending on the implementation, this may be a no-op.
virtual void DestroyAliasedBuffer(Handle handle)=0
virtual void Unmap()=0
Releases or unmaps a previously mapped resource. Implementations MUST guarantee that Unmap() is calle...
Span< T > MapSpan(size_t count=kFullSize)
Creates a span that maps a contiguous region of the buffer to the host memory. Behaviour of the memor...
Definition Resource.hpp:83
const RHIDevice & mDevice
Definition Resource.hpp:50
virtual RHIBufferScopedHandle< RHIBuffer > CreateAliasedBuffer(RHIBufferDesc const &desc, size_t offset=0)=0
virtual void DebugSetObjectName(const char *name)=0
const RHIBufferDesc mDesc
Definition Resource.hpp:52
virtual RHIBuffer * GetAliasedBuffer(Handle handle) const =0
virtual void * Map()=0
Maps the entire buffer to the host memory. Alignment is implementation-defined. Implementations MUST ...
T * Map()
Maps as pointer of T.
Definition Resource.hpp:92
RHIBuffer(RHIDevice const &device, RHIBufferDesc const &desc)
Definition Resource.hpp:53
Definition Device.hpp:188
Handle type for RHI Objects.
Definition Details.hpp:42
Base class for all RHI objects.
Definition Details.hpp:16
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
Definition Resource.hpp:188
const RHITextureViewDesc & mDesc
Definition Resource.hpp:191
virtual void DebugSetObjectName(const char *name)=0
RHITextureView(RHITexture const &image, RHITextureViewDesc const &desc)
Definition Resource.hpp:193
virtual RHITexture * GetTexture() const =0
const RHITexture & mImage
Definition Resource.hpp:190
Definition Resource.hpp:169
const RHITextureDesc mDesc
Definition Resource.hpp:173
virtual void DestroyAliasedTexture(Handle handle)=0
virtual RHITextureScopedHandle< RHITexture > CreateAliasedTexture(RHITextureDesc const &desc, size_t offset=0)=0
virtual void DebugSetObjectName(const char *name)=0
RHITexture(RHIDevice const &device, RHITextureDesc const &desc)
Definition Resource.hpp:174
virtual void DestroyImageView(Handle handle)=0
virtual RHITextureView * GetImageView(Handle handle) const =0
const RHIDevice & mDevice
Definition Resource.hpp:171
virtual RHITextureScopedHandle< RHITextureView > CreateTextureView(RHITextureViewDesc const &desc)=0
virtual RHITexture * GetAliasedTexture(Handle handle) const =0
std::pair< First, Second > Pair
Alias for std::pair
Definition Container.hpp:32
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:4
RHITextureLayout
Definition Common.hpp:144
RHIDeviceHeapType
Definition Common.hpp:138
uintptr_t Handle
Definition Details.hpp:8
RHIAccelerationStructureType
Definition Common.hpp:156
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIAccelerationGeometryType
Definition Common.hpp:162
RHITextureDimension
Definition Common.hpp:192
RHIResourceFormat
Definition Common.hpp:20
static constexpr size_t kFullSize
Definition Common.hpp:8
RHIMultisampleCount
Definition Common.hpp:189
RHIResourceHostAccess
Definition Common.hpp:167
uint32_t offset
Definition Resource.hpp:204
uint32_t size
Definition Resource.hpp:205
RHIAccelerationStructureType type
Definition Resource.hpp:202
RHIBuffer * buffer
Definition Resource.hpp:203
RHIAccelerationStructure * accelerationStructure
Definition Resource.hpp:224
RHIResourceFormat vertexFormat
Definition Resource.hpp:212
struct Foundation::RHI::RHIAccelerationStructureGeometryDesc::TriangleData triangleData
RHIAccelerationGeometryType type
Definition Resource.hpp:209
struct Foundation::RHI::RHIAccelerationStructureGeometryDesc::InstanceData instanceData
Definition Resource.hpp:24
static RHIBufferDesc CreateStagingDesc(size_t size)
Definition Resource.hpp:30
RHIBufferUsage usage
How the buffer can be used by the device, initially.
Definition Resource.hpp:27
RHIResourceDesc resource
Definition Resource.hpp:25
size_t size
Definition Resource.hpp:28
static RHIBuffer * Get(RHIBuffer const *buffer, Handle handle)
Definition Resource.hpp:250
static void Destroy(RHIBuffer *buffer, Handle handle)
Definition Resource.hpp:253
static RHITextureView * Get(RHITexture const *image, Handle handle)
Definition Resource.hpp:242
static void Destroy(RHITexture *image, Handle handle)
Definition Resource.hpp:245
static void Destroy(RHITexture *texture, Handle handle)
Definition Resource.hpp:261
static RHITexture * Get(RHITexture const *texture, Handle handle)
Definition Resource.hpp:258
Provides type traits for types derived from RHIObject.
Definition Details.hpp:30
Definition Resource.hpp:5
bool coherent
Definition Resource.hpp:18
RHIDeviceQueueFlags sharedQueues
Definition Resource.hpp:15
RHIDeviceHeapType heap
Which heap the resource is allocated in.
Definition Resource.hpp:8
RHIResourceHostAccess hostAccess
How the resource can be accessed by the host (CPU)
Definition Resource.hpp:10
bool staging
Definition Resource.hpp:22
bool shared
Can be shared with other device queues.
Definition Resource.hpp:12
bool isAlias
Definition Resource.hpp:6
Definition Resource.hpp:103
RHITextureUsage usage
Definition Resource.hpp:106
RHIExtent3D extent
Definition Resource.hpp:107
RHIResourceDesc resource
Definition Resource.hpp:104
RHIMultisampleCount sampleCount
Definition Resource.hpp:109
RHIResourceFormat format
Definition Resource.hpp:108
RHITextureDimension dimension
Definition Resource.hpp:105
RHITextureLayout initialLayout
Definition Resource.hpp:112
uint32_t mipLevels
Definition Resource.hpp:110
uint32_t arrayLayers
Definition Resource.hpp:111
uint32_t baseArrayLayer
Definition Resource.hpp:121
uint32_t mipLevel
Definition Resource.hpp:120
RHITextureAspectFlag aspect
Definition Resource.hpp:119
uint32_t layerCount
Definition Resource.hpp:122
RHITextureSubresourceLayer layer
Definition Resource.hpp:126
Pair< uint32_t, uint32_t > GetMipLevelRange() const
Definition Resource.hpp:130
static RHITextureSubresourceRange Create(RHITextureAspectFlag aspect=RHITextureAspectFlagBits::Color, uint32_t base_mip_level=0, uint32_t mip_count=1, uint32_t base_array_layer=0, uint32_t layer_count=1)
Helper function to create a Subresource Range with default parameters.
Definition Resource.hpp:146
Pair< uint32_t, uint32_t > GetArrayLayerRange() const
Definition Resource.hpp:134
uint32_t mipCount
Definition Resource.hpp:128
constexpr bool IsValid() const
Definition Resource.hpp:159
Definition Resource.hpp:164
RHIResourceFormat format
Definition Resource.hpp:165
RHITextureDimension dimension
Definition Resource.hpp:166
RHITextureSubresourceRange range
Definition Resource.hpp:167