Foundation
Loading...
Searching...
No Matches
GPUScene.hpp
Go to the documentation of this file.
1#pragma once
2#include <Bits/Format.hpp>
3#include <Core/Pool.hpp>
4#include "StagingBuffer.hpp"
5#include "UploadContext.hpp"
8{
9 using namespace Foundation;
10 using namespace RenderCore;
11 using namespace Bits;
13 {
14 // Instance: Full update every frame, fixed allocation sizes
17 // Shared: Partial update every frame, dynamic allocation
18 size_t sharedBudget = 1_MB;
19 size_t sharedStaging = 1_MB;
20 // Const: Partial update every frame, dynamic allocation
21 size_t constBudget = 128_MB;
22 size_t constStaging = 16_MB;
23 [[nodiscard]] constexpr size_t totalBudget() const { return instanceBudget + sharedBudget + constBudget; }
24 [[nodiscard]] constexpr size_t totalStaging() const { return instanceBudget + sharedStaging; }
25 };
50 {
55 {
57 char* const data;
58 const size_t size;
59 const size_t alignment;
60
63
66
67 template <typename T>
69 {
70 CHECK_MSG(alignment % alignof(T) == 0,
71 "Bad alignment for type. Type must be aligned on multiples of {}", alignment);
72 return {reinterpret_cast<T*>(data), size / sizeof(T)};
73 }
74 };
76 /* -- Instance -- */
77 StagedDoubleBuffer mInstance; // Instance data [updated every frame as a whole]
78 bool mInstanceDirty{false};
79 Async::Mutex mInstanceMutex; // Mutex for instance data mapping
80 /* -- Shared -- */
81 StagedDoubleBuffer mShared; // Shared (instance) data [partially updated every frame, could be empty]
82 VirtualAllocator mSharedAlloc; // Allocator for Shared data
83 Vector<Pair<size_t, size_t>> mSharedUpdateRegions; // Shared regions to update next frame
84 /* -- Const -- */
85 StagedDoubleBuffer mConst; // Const data [updated on demand, could be empty]
86 VirtualAllocator mConstAlloc; // Allocator for Const data
87 Vector<Pair<size_t, size_t>> mConstUpdateRegions; // Const regions to update next frame
88 public:
90
99 RHIDeviceQueueType queue = RHIDeviceQueueType::Graphics);
100 /* -- Instance -- */
116 template <typename T>
118 {
119 mInstanceMutex.lock();
120 return mInstance.View<T>();
121 }
128 {
129 mInstanceMutex.unlock();
130 mInstanceDirty = true;
131 }
132 /* -- Shared -- */
153 VirtualAllocation PushShared(Span<const char> data, size_t alignment);
177 /* -- Const -- */
197 VirtualAllocation PushConst(Span<const char> data, size_t alignment);
222 };
223} // namespace Foundation::Rendering
#define CHECK_MSG(expr, format_str,...)
Definition Logging.hpp:31
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Definition Device.hpp:131
Renderer implementing a Frame Graph system with automatic resource tracking and synchronization.
Definition Renderer.hpp:78
Scene data management for asynchronous data updates/uploads on the GPU.
Definition GPUScene.hpp:50
Pair< size_t, size_t > QueryShared(VirtualAllocation allocation)
Definition GPUScene.cpp:42
void UpdateConst(VirtualAllocation allocation, Span< const char > data)
Updates a previously allocated Const allocation.
Definition GPUScene.cpp:63
StagedDoubleBuffer mConst
Definition GPUScene.hpp:85
void FreeConst(VirtualAllocation allocation)
Frees a previously allocated const.
Definition GPUScene.cpp:71
VirtualAllocator mConstAlloc
Definition GPUScene.hpp:86
void UpdateShared(VirtualAllocation allocation, Span< const char > data)
Updates a previously allocated Shared allocation.
Definition GPUScene.cpp:43
Vector< Pair< size_t, size_t > > mSharedUpdateRegions
Definition GPUScene.hpp:83
Span< T > MapInstanceData()
Maps the instance data for writing. The returned span is valid until UnmapInstanceData is called.
Definition GPUScene.hpp:117
StagedDoubleBuffer mInstance
Definition GPUScene.hpp:77
void FreeShared(VirtualAllocation allocation)
Frees a previously allocated Shared allocation.
Definition GPUScene.cpp:51
void UnmapInstanceData()
Unmaps the instance data, allowing other threads to map it again.
Definition GPUScene.hpp:127
Vector< Pair< size_t, size_t > > mConstUpdateRegions
Definition GPUScene.hpp:87
VirtualAllocation PushShared(Span< const char > data, size_t alignment)
Push a block of data into the Shared buffer.
Definition GPUScene.cpp:33
Pair< size_t, size_t > QueryConst(VirtualAllocation id)
Query a previous const allocation.
Definition GPUScene.cpp:62
StagedDoubleBuffer mShared
Definition GPUScene.hpp:81
VirtualAllocation PushConst(Span< const char > data, size_t alignment)
Push a block of data into the Const buffer.
Definition GPUScene.cpp:53
Async::Mutex mInstanceMutex
Definition GPUScene.hpp:79
void CreateUpdatePasses(Renderer *renderer, ResourceHandle &outInstanceBuffer, ResourceHandle &outSharedBuffer, ResourceHandle &outConstBuffer, RHIDeviceQueueType queue=RHIDeviceQueueType::Graphics)
Creates a pass that performs per-frame updates with correct synchronization.
Definition GPUScene.cpp:73
bool mInstanceDirty
Definition GPUScene.hpp:78
VirtualAllocator mSharedAlloc
Definition GPUScene.hpp:82
Allocator * mAllocator
Definition GPUScene.hpp:75
Helper class for GPU buffer updates.
Definition StagingBuffer.hpp:72
Thread-safe wrapper around VulkanMemoryAllocator's Virtual Allocator interface.
Definition VirtualAllocator.hpp:26
std::mutex Mutex
Definition Future.hpp:15
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161
RHIDeviceQueueType
Definition Common.hpp:69
size_t ResourceHandle
Definition RenderPass.hpp:12
Reference implementations of real-time rendering routines.
Definition Application.hpp:18
uint32_t VirtualAllocation
Definition VirtualAllocator.hpp:9
Definition Future.hpp:8
Definition GPUScene.hpp:13
constexpr size_t totalBudget() const
Definition GPUScene.hpp:23
size_t instanceAlignment
Definition GPUScene.hpp:16
constexpr size_t totalStaging() const
Definition GPUScene.hpp:24
size_t constBudget
Definition GPUScene.hpp:21
size_t instanceBudget
Definition GPUScene.hpp:15
size_t constStaging
Definition GPUScene.hpp:22
size_t sharedStaging
Definition GPUScene.hpp:19
size_t sharedBudget
Definition GPUScene.hpp:18
Internal staged buffer with a CPU-side (non-driver) data for immediate writes.
Definition GPUScene.hpp:55
Async::Mutex mutex
Definition GPUScene.hpp:62
Span< T > View()
Definition GPUScene.hpp:68
StagedBuffer buffer
Definition GPUScene.hpp:61
char *const data
Definition GPUScene.hpp:57
Allocator *const alloc
Definition GPUScene.hpp:56
const size_t alignment
Definition GPUScene.hpp:59
const size_t size
Definition GPUScene.hpp:58