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{
5 class RHIDevice;
7 {
8 bool isAlias{false}; // If true, the resource is an alias of another resource.
14 bool shared{false};
17 RHIDeviceQueueFlags sharedQueues{RHIDeviceQueueFlagsBits::Graphics | RHIDeviceQueueFlagsBits::Compute |
18 RHIDeviceQueueFlagsBits::Transfer};
21 bool coherent{false};
25 bool staging{false};
26 };
28 {
32 size_t size{}; // size in bytes
33 size_t alignment{4}; // alignment in bytes, may be ignored by implementations
34
36 {
37 return {
38 .resource =
39 {
42 .shared = false,
43 .coherent = true,
44 .staging = true,
45 },
46 .usage = RHIBufferUsageBits::TransferSource,
47 .size = size,
48 };
49 }
50 };
51 class RHIBuffer;
52 template <typename T>
54 template <typename T>
56 class RHIBuffer : public RHIObject
57 {
58 protected:
60
61 public:
63 RHIBuffer(RHIDevice const& device, RHIBufferDesc const& desc) : mDevice(device), mDesc(desc) {}
71 virtual void* Map() = 0;
76 virtual void Flush(size_t offset = 0, size_t size = kFullSize) = 0;
82 virtual void Unmap() = 0;
83
91 template <typename T>
92 Span<T> MapSpan(size_t count = kFullSize)
93 {
94 void* p = Map();
95 if (count == kFullSize)
96 count = mDesc.size / sizeof(T);
97 return {static_cast<T*>(p), count};
98 }
102 template <typename T>
104 {
105 return static_cast<T*>(Map());
106 }
107
109 size_t offset = 0) = 0;
110 [[nodiscard]] virtual RHIBuffer* GetAliasedBuffer(Handle handle) const = 0;
111 virtual void DestroyAliasedBuffer(Handle handle) = 0;
112 [[nodiscard]] virtual size_t GetAllocationSize() const = 0;
113
114 virtual void DebugSetObjectName(const char* name) = 0;
115 };
124 {
125 public:
126 static constexpr uint64_t kInvalidOffset = ~0ull;
131 [[nodiscard]] virtual uint64_t Allocate(uint64_t size, uint64_t alignment) = 0;
132 // Frees a range previously returned by Allocate.
133 virtual void Free(uint64_t offset) = 0;
134 // Frees all live allocations at once.
135 virtual void Clear() = 0;
136 [[nodiscard]] virtual uint64_t GetUsedBytes() const = 0;
137 [[nodiscard]] virtual uint64_t GetCapacity() const = 0;
138 // Highest (offset + size) ever allocated, for partial flushes of mapped buffers.
139 [[nodiscard]] virtual uint64_t GetPeakUsage() const = 0;
140 };
153 class RHITexture;
154 class RHITextureView;
155 template <typename T>
157 template <typename T>
167 {
168 // Single mip level and array layer range
170 // Number of mip levels in the range
172 /* @brief Mip level used (inclusive) */
177 /* @brief Array layers used (inclusive) */
191 static RHITextureSubresourceRange Create(RHITextureAspectFlag aspect = RHITextureAspectFlagBits::Color,
194 {
196 .layer =
197 {
198 .aspect = aspect,
199 .mipLevel = base_mip_level,
200 .baseArrayLayer = base_array_layer,
201 .layerCount = layer_count,
202 },
203 .mipCount = mip_count,
204 };
205 return res;
206 }
207 [[nodiscard]] constexpr bool IsValid() const { return layer.aspect.value && mipCount && layer.layerCount; }
208 };
215 class RHITexture : public RHIObject
216 {
217 protected:
219
220 public:
222 RHITexture(RHIDevice const& device, RHITextureDesc const& desc) : mDevice(device), mDesc(desc) {}
223
226 [[nodiscard]] virtual RHITextureView* GetImageView(Handle handle) const = 0;
227 virtual void DestroyImageView(Handle handle) = 0;
228
230 size_t offset = 0) = 0;
231 [[nodiscard]] virtual RHITexture* GetAliasedTexture(Handle handle) const = 0;
232 virtual void DestroyAliasedTexture(Handle handle) = 0;
233 [[nodiscard]] virtual size_t GetAllocationSize() const = 0;
234
235 virtual void DebugSetObjectName(const char* name) = 0;
236 };
238 {
239 protected:
242
243 public:
244 RHITextureView(RHITexture const& image, RHITextureViewDesc const& desc) : mImage(image), mDesc(desc) {}
245 [[nodiscard]] virtual RHITexture* GetTexture() const = 0;
246 virtual void DebugSetObjectName(const char* name) = 0;
247 };
276 {
277 float minX, minY, minZ;
278 float maxX, maxY, maxZ;
279 };
281 {
283 uint32_t offset; // Bytes
285 uint32_t stride; // Bytes. Must be >= sizeof(RHIAccelerationStructureAABB).
286 };
287 // For use with @ref RHIDevice::WriteAccelerationStructureInstanceData
332 {
333 protected:
336
337 public:
339 mDevice(device), mDesc(desc)
340 {
341 }
342
343 virtual void DebugSetObjectName(const char* name) = 0;
344 };
345 template <>
347 {
348 static RHITextureView* Get(RHITexture const* image, Handle handle) { return image->GetImageView(handle); }
349 static void Destroy(RHITexture* image, Handle handle) { image->DestroyImageView(handle); }
350 };
351 template <>
353 {
354 static RHIBuffer* Get(RHIBuffer const* buffer, Handle handle) { return buffer->GetAliasedBuffer(handle); }
355 static void Destroy(RHIBuffer* buffer, Handle handle) { buffer->DestroyAliasedBuffer(handle); }
356 };
357 template <>
359 {
360 static RHITexture* Get(RHITexture const* texture, Handle handle) { return texture->GetAliasedTexture(handle); }
361 static void Destroy(RHITexture* texture, Handle handle) { texture->DestroyAliasedTexture(handle); }
362 };
363} // namespace Foundation::RHI
virtual void DebugSetObjectName(const char *name)=0
RHIAccelerationStructure(const RHIDevice &device, RHIAccelerationStructureDesc const &desc)
Definition Resource.hpp:338
const RHIAccelerationStructureDesc & mDesc
Definition Resource.hpp:335
const RHIDevice & mDevice
Definition Resource.hpp:334
Definition Resource.hpp:57
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:92
virtual size_t GetAllocationSize() const =0
const RHIDevice & mDevice
Definition Resource.hpp:59
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:62
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:103
RHIBuffer(RHIDevice const &device, RHIBufferDesc const &desc)
Definition Resource.hpp:63
Definition Device.hpp:245
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:238
const RHITextureViewDesc & mDesc
Definition Resource.hpp:241
virtual void DebugSetObjectName(const char *name)=0
RHITextureView(RHITexture const &image, RHITextureViewDesc const &desc)
Definition Resource.hpp:244
virtual RHITexture * GetTexture() const =0
const RHITexture & mImage
Definition Resource.hpp:240
Definition Resource.hpp:216
const RHITextureDesc mDesc
Definition Resource.hpp:221
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:222
virtual void DestroyImageView(Handle handle)=0
virtual RHITextureView * GetImageView(Handle handle) const =0
const RHIDevice & mDevice
Definition Resource.hpp:218
virtual RHITextureScopedHandle< RHITextureView > CreateTextureView(RHITextureViewDesc const &desc)=0
virtual size_t GetAllocationSize() const =0
virtual RHITexture * GetAliasedTexture(Handle handle) const =0
Sub-allocates byte ranges within an abstract fixed-size space.
Definition Resource.hpp:124
virtual uint64_t Allocate(uint64_t size, uint64_t alignment)=0
Sub-allocates size bytes with the given alignment.
virtual void Free(uint64_t offset)=0
virtual uint64_t GetPeakUsage() const =0
static constexpr uint64_t kInvalidOffset
Definition Resource.hpp:126
virtual uint64_t GetUsedBytes() const =0
virtual uint64_t GetCapacity() 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:153
std::span< T > Span
Alias for std::span
Definition Container.hpp:60
Low-level Rendering Hardware Interface (RHI) abstractions.
Definition Application.hpp:4
RHIAccelerationStructureBuildOp
Definition Common.hpp:221
RHITextureLayout
Definition Common.hpp:203
RHIDeviceHeapType
Definition Common.hpp:197
uintptr_t Handle
Definition Details.hpp:8
RHIAccelerationStructureType
Definition Common.hpp:215
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIAccelerationGeometryType
Definition Common.hpp:227
RHITextureDimension
Definition Common.hpp:260
RHIResourceFormat
Definition Common.hpp:34
static constexpr size_t kFullSize
Definition Common.hpp:8
RHIMultisampleCount
Definition Common.hpp:257
RHIResourceHostAccess
Definition Common.hpp:233
float minX
Definition Resource.hpp:277
float minY
Definition Resource.hpp:277
float maxY
Definition Resource.hpp:278
float minZ
Definition Resource.hpp:277
float maxZ
Definition Resource.hpp:278
float maxX
Definition Resource.hpp:278
uint32_t scratchBufferOffset
Definition Resource.hpp:327
Span< const RHIAccelerationStructureGeometryInfo > geometries
Definition Resource.hpp:328
RHIAccelerationStructureType type
Definition Resource.hpp:321
RHIAccelerationStructureBuildOp operation
Definition Resource.hpp:323
RHIAccelerationStructure * dstAS
Definition Resource.hpp:325
RHIBuffer * scratchBuffer
Definition Resource.hpp:326
RHIAccelerationStructure * srcAS
Definition Resource.hpp:324
Span< const RHIAccelerationStructureBuildRangeInfo > ranges
Definition Resource.hpp:329
RHIAccelerationStructureBuildFlags flags
Definition Resource.hpp:322
uint32_t primitiveOffset
Definition Resource.hpp:315
uint32_t primitiveCount
Definition Resource.hpp:314
uint32_t firstVertex
Definition Resource.hpp:316
uint32_t transformOffset
Definition Resource.hpp:317
uint32_t offset
Definition Resource.hpp:260
uint32_t size
Definition Resource.hpp:261
RHIAccelerationStructureBuildFlags flags
Definition Resource.hpp:258
RHIAccelerationStructureType type
Definition Resource.hpp:257
RHIBuffer * buffer
Definition Resource.hpp:259
RHIBuffer * aabbBuffer
Definition Resource.hpp:282
RHIAccelerationStructureGeometryTriangleData triangleData
Definition Resource.hpp:307
RHIAccelerationStructureGeometryInstanceData instanceData
Definition Resource.hpp:309
RHIAccelerationStructureGeometryAABBData aabbData
Definition Resource.hpp:308
RHIAccelerationGeometryType type
Definition Resource.hpp:306
RHIBuffer * instanceBuffer
Definition Resource.hpp:300
uint32_t shaderBindingTableRecordOffset
Definition Resource.hpp:295
uint32_t instanceID
Definition Resource.hpp:293
RHIAccelerationStructure const * blas
Definition Resource.hpp:290
RHIAccelerationGeometryInstanceFlags flags
Definition Resource.hpp:296
float transformTranslation[3]
Definition Resource.hpp:292
float transformBasisRowMajor[3][3]
Definition Resource.hpp:291
RHIBuffer * vertexBuffer
Definition Resource.hpp:266
RHIResourceFormat vertexFormat
Definition Resource.hpp:265
RHIBuffer * indexBuffer
Definition Resource.hpp:271
RHIResourceFormat indexFormat
Definition Resource.hpp:270
uint32_t buildScratchSize
Definition Resource.hpp:252
uint32_t accelerationStructureSize
Definition Resource.hpp:251
uint32_t updateScratchSize
Definition Resource.hpp:253
Definition Resource.hpp:28
static RHIBufferDesc CreateStagingDesc(size_t size)
Definition Resource.hpp:35
RHIBufferUsage usage
How the buffer can be used by the device, initially.
Definition Resource.hpp:31
RHIResourceDesc resource
Definition Resource.hpp:29
size_t alignment
Definition Resource.hpp:33
size_t size
Definition Resource.hpp:32
static RHIBuffer * Get(RHIBuffer const *buffer, Handle handle)
Definition Resource.hpp:354
static void Destroy(RHIBuffer *buffer, Handle handle)
Definition Resource.hpp:355
static RHITextureView * Get(RHITexture const *image, Handle handle)
Definition Resource.hpp:348
static void Destroy(RHITexture *image, Handle handle)
Definition Resource.hpp:349
static void Destroy(RHITexture *texture, Handle handle)
Definition Resource.hpp:361
static RHITexture * Get(RHITexture const *texture, Handle handle)
Definition Resource.hpp:360
Provides type traits for types derived from RHIObject.
Definition Details.hpp:30
Definition Resource.hpp:7
bool coherent
Definition Resource.hpp:21
RHIDeviceQueueFlags sharedQueues
Definition Resource.hpp:17
RHIDeviceHeapType heap
Which heap the resource is allocated in.
Definition Resource.hpp:10
RHIResourceHostAccess hostAccess
How the resource can be accessed by the host (CPU)
Definition Resource.hpp:12
bool staging
Definition Resource.hpp:25
bool shared
Can be shared with other device queues.
Definition Resource.hpp:14
bool isAlias
Definition Resource.hpp:8
Definition Resource.hpp:142
RHITextureUsage usage
Definition Resource.hpp:145
RHIExtent3D extent
Definition Resource.hpp:146
RHIResourceDesc resource
Definition Resource.hpp:143
RHIMultisampleCount sampleCount
Definition Resource.hpp:148
RHIResourceFormat format
Definition Resource.hpp:147
RHITextureDimension dimension
Definition Resource.hpp:144
RHITextureLayout initialLayout
Definition Resource.hpp:151
uint32_t mipLevels
Definition Resource.hpp:149
uint32_t arrayLayers
Definition Resource.hpp:150
uint32_t baseArrayLayer
Definition Resource.hpp:163
uint32_t mipLevel
Definition Resource.hpp:162
RHITextureAspectFlag aspect
Definition Resource.hpp:161
uint32_t layerCount
Definition Resource.hpp:164
RHITextureSubresourceLayer layer
Definition Resource.hpp:169
Pair< uint32_t, uint32_t > GetMipLevelRange() const
Definition Resource.hpp:173
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:191
Pair< uint32_t, uint32_t > GetArrayLayerRange() const
Definition Resource.hpp:178
uint32_t mipCount
Definition Resource.hpp:171
constexpr bool IsValid() const
Definition Resource.hpp:207
Definition Resource.hpp:210
RHIResourceFormat format
Definition Resource.hpp:211
RHITextureDimension dimension
Definition Resource.hpp:212
RHITextureSubresourceRange range
Definition Resource.hpp:213