Foundation
Loading...
Searching...
No Matches
ImmediateContext.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <RHICore/Command.hpp>
4#include <RHICore/Device.hpp>
7{
8 using namespace RHI;
9
17
43
51 {
53 {
54 friend struct ImmediateUpload;
56 size_t mLane{SIZE_MAX};
58
59 UploadBatch(ImmediateUpload* owner, size_t lane) noexcept;
60
61 public:
62 char *begin{}, *ptr{}, *end{};
63
64 UploadBatch() = default;
65 UploadBatch(UploadBatch const&) = delete;
67 UploadBatch(UploadBatch&& other) noexcept;
68 UploadBatch& operator=(UploadBatch&& other) noexcept;
69 ~UploadBatch() noexcept;
70
71 [[nodiscard]] bool IsValid() const noexcept { return mOwner != nullptr; }
72 [[nodiscard]] RHICommandList* Get() const;
73 [[nodiscard]] size_t CompletionValue() const noexcept { return mCompletionValue; }
74 [[nodiscard]] RHIDeviceSemaphore* CompletionTimeline() const;
75
76 char* Upload(RHIBuffer* dst, size_t dataSize, size_t dstOffset);
77 char* Upload(RHITexture* dst, size_t dataSize,
78 RHITextureSubresourceLayer dstLayer = {.aspect = RHITextureAspectFlagBits::Color},
79 RHIOffset2D dstOffset = {}, RHIExtent2D dstExtent = {});
80 char* Upload(RHITexture* dst, size_t dataSize, RHITextureSubresourceLayer dstLayer, RHIOffset3D dstOffset,
81 RHIExtent3D dstExtent);
82 bool Align(uint32_t alignment);
83 void End(RHIDeviceFence* completionFence = nullptr);
84 void End(ImmediateSubmitDesc const& desc);
85 void Abort();
86 };
87
88 ImmediateUpload(RHIDevice* device, size_t capacity, RHIDeviceQueueType type = RHIDeviceQueueType::Graphics,
89 size_t buffers = 1);
90
91 [[nodiscard]] size_t Capacity() const noexcept { return mCapacity; }
92 [[nodiscard]] size_t LaneCount() const noexcept { return mLanes.size(); }
93 [[nodiscard]] RHIDeviceSemaphore* CompletionTimeline() const { return mCompletionTimeline.Get(); }
94
95 UploadBatch BeginBatch();
96 [[nodiscard]] bool TryBeginBatch(UploadBatch& out);
97 [[nodiscard]] bool WaitTimeline(size_t value, size_t timeout) const;
98 void WaitIdle();
99
100 private:
102 {
105 char* begin{};
106 char* end{};
107 size_t signalValue{};
108 bool recording{};
109
110 UploadLane(RHIDevice* device, size_t capacity, RHIDeviceQueueType type);
111 };
112
114 size_t mCapacity{};
115 size_t mNextLane{};
120
121 [[nodiscard]] bool IsLaneReusable(size_t lane, size_t timeout);
122 void WaitLaneReusable(size_t lane);
123 [[nodiscard]] bool TryAcquireLane(size_t lane, UploadBatch& out);
124 UploadBatch AcquireLane(size_t lane);
125 void ReleaseRecording(size_t lane) noexcept;
126 };
127
132 {
135
136 char *begin, *ptr, *end;
137 ImmediateReadback(RHIDevice* device, size_t capacity, RHIDeviceQueueType type = RHIDeviceQueueType::Graphics) :
138 ctx(type, device),
139 staging(device->CreateBuffer({.resource =
140 {
141 .heap = RHIDeviceHeapType::Readback,
142 .hostAccess = RHIResourceHostAccess::ReadWrite,
143 .shared = false, /* Transfer only */
144 .coherent = true, /* No invalidate required */
145 .staging = false,
146 },
147 .usage = RHIBufferUsageBits::TransferDestination,
148 .size = capacity}))
149 {
150 begin = ptr = staging->Map<char>();
151 end = ptr + capacity;
152 }
153
158 void Begin();
159
166 char* Readback(RHIBuffer* src, size_t dataSize, size_t srcOffset = 0);
173 char* Readback(RHITexture* src, size_t dataSize,
174 RHITextureSubresourceLayer srcLayer = {.aspect = RHITextureAspectFlagBits::Color},
175 RHIOffset2D srcOffset = {},
176 RHIExtent2D srcExtent = {});
177 char* Readback(RHITexture* src, size_t dataSize, RHITextureSubresourceLayer srcLayer, RHIOffset3D srcOffset,
178 RHIExtent3D srcExtent);
179
180 bool Align(uint32_t alignment);
185 void End(RHIDeviceFence* completionFence = nullptr);
186 void End(ImmediateSubmitDesc const& desc);
187
188 void WaitIdle();
189 };
190
195 RHIDeviceScopedHandle<RHIBuffer> ImmediateCreateBuffer(RHIDevice* device, RHIBufferDesc const& desc,
196 void const* data, size_t bytes);
197
204 RHIDeviceScopedHandle<RHITexture> ImmediateCreateTexture(RHIDevice* device, RHITextureDesc const& desc,
205 void const* data, size_t bytes,
206 RHITextureLayout finalLayout = RHITextureLayout::TransferDst);
207
208} // namespace Foundation::RenderCore
Definition Resource.hpp:57
Definition Command.hpp:42
Definition Device.hpp:67
Definition Device.hpp:17
Definition Device.hpp:56
Definition Device.hpp:246
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:85
Definition Resource.hpp:216
Single persistent command list for immediate submissions.
Definition ImmediateContext.hpp:25
RHICommandList * operator->()
Definition ImmediateContext.hpp:36
RHIDeviceQueue * mQueue
Definition ImmediateContext.hpp:27
void WaitIdle()
Definition ImmediateContext.cpp:76
ImmediateContext(RHIDevice *device)
Definition ImmediateContext.hpp:33
RHIDeviceScopedHandle< RHICommandPool > mCommandPool
Definition ImmediateContext.hpp:29
RHICommandPoolScopedHandle< RHICommandList > mCommandList
Definition ImmediateContext.hpp:30
void Submit(RHIDeviceFence *completionFence=nullptr)
Definition ImmediateContext.cpp:63
RHICommandList * Get() const
Definition ImmediateContext.hpp:35
RHIDevice *const mDevice
Definition ImmediateContext.hpp:26
char * begin
Definition ImmediateContext.hpp:62
char * end
Definition ImmediateContext.hpp:62
void End(RHIDeviceFence *completionFence=nullptr)
Definition ImmediateContext.cpp:297
size_t mCompletionValue
Definition ImmediateContext.hpp:57
RHIDeviceSemaphore * CompletionTimeline() const
Definition ImmediateContext.cpp:232
RHICommandList * Get() const
Definition ImmediateContext.cpp:226
char * ptr
Definition ImmediateContext.hpp:62
ImmediateUpload * mOwner
Definition ImmediateContext.hpp:55
bool IsValid() const noexcept
Definition ImmediateContext.hpp:71
UploadBatch & operator=(UploadBatch const &)=delete
size_t CompletionValue() const noexcept
Definition ImmediateContext.hpp:73
bool Align(uint32_t alignment)
Definition ImmediateContext.cpp:287
size_t mLane
Definition ImmediateContext.hpp:56
void Abort()
Definition ImmediateContext.cpp:322
~UploadBatch() noexcept
Definition ImmediateContext.cpp:221
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::span< T > Span
Alias for std::span
Definition Container.hpp:62
glm::vec< 2, int32_t > RHIOffset2D
Definition Common.hpp:13
glm::vec< 3, int32_t > RHIOffset3D
Definition Common.hpp:14
RHITextureLayout
Definition Common.hpp:218
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIDeviceQueueType
Definition Common.hpp:179
Graphics
Definition Common.hpp:195
glm::vec< 2, uint32_t > RHIExtent2D
Definition Common.hpp:10
Core functionalities for rendering, including the Frame Graph implementation.
Definition Bindless.cpp:2
RHIDeviceScopedHandle< RHIBuffer > ImmediateCreateBuffer(RHIDevice *device, RHIBufferDesc const &desc, void const *data, size_t bytes)
Creates a buffer and uploads data into it in a single shot.
Definition ImmediateContext.cpp:5
RHIDeviceScopedHandle< RHITexture > ImmediateCreateTexture(RHIDevice *device, RHITextureDesc const &desc, void const *data, size_t bytes, RHITextureLayout finalLayout)
Creates a texture and uploads data (base mip) into it in a single shot.
Definition ImmediateContext.cpp:18
RHITextureAspectFlag aspect
Definition Resource.hpp:161
Single persistent staging buffer + immediate context for quick, batchable readbacks.
Definition ImmediateContext.hpp:132
RHIDeviceScopedHandle< RHIBuffer > staging
Definition ImmediateContext.hpp:134
char * ptr
Definition ImmediateContext.hpp:136
char * end
Definition ImmediateContext.hpp:136
ImmediateContext ctx
Definition ImmediateContext.hpp:133
void End(RHIDeviceFence *completionFence=nullptr)
Definition ImmediateContext.cpp:384
ImmediateReadback(RHIDevice *device, size_t capacity, RHIDeviceQueueType type=RHIDeviceQueueType::Graphics)
Definition ImmediateContext.hpp:137
void Begin()
Definition ImmediateContext.cpp:333
char * begin
Definition ImmediateContext.hpp:136
void WaitIdle()
Definition ImmediateContext.cpp:393
bool Align(uint32_t alignment)
Definition ImmediateContext.cpp:376
Definition ImmediateContext.hpp:11
Span< const RHIDeviceQueue::TimelinePair > timelineSignals
Definition ImmediateContext.hpp:13
Span< const RHIDeviceQueue::TimelinePair > timelineWaits
Definition ImmediateContext.hpp:12
Span< const RHIPipelineStage > waitStages
Definition ImmediateContext.hpp:14
RHIDeviceFence * completionFence
Definition ImmediateContext.hpp:15
Definition ImmediateContext.hpp:102
bool recording
Definition ImmediateContext.hpp:108
char * begin
Definition ImmediateContext.hpp:105
size_t signalValue
Definition ImmediateContext.hpp:107
RHIDeviceScopedHandle< RHIBuffer > staging
Definition ImmediateContext.hpp:104
ImmediateContext ctx
Definition ImmediateContext.hpp:103
char * end
Definition ImmediateContext.hpp:106
Persistent staging lanes + immediate contexts for batchable uploads.
Definition ImmediateContext.hpp:51
Core::Vector< RHIDeviceQueue::TimelinePair > mSubmitSignals
Definition ImmediateContext.hpp:119
bool TryBeginBatch(UploadBatch &out)
Definition ImmediateContext.cpp:160
ImmediateUpload(RHIDevice *device, size_t capacity, RHIDeviceQueueType type=RHIDeviceQueueType::Graphics, size_t buffers=1)
Definition ImmediateContext.cpp:94
UploadBatch BeginBatch()
Definition ImmediateContext.cpp:153
Core::Vector< Core::UniquePtr< UploadLane > > mLanes
Definition ImmediateContext.hpp:118
size_t mNextSignalValue
Definition ImmediateContext.hpp:116
bool TryAcquireLane(size_t lane, UploadBatch &out)
Definition ImmediateContext.cpp:141
size_t mNextLane
Definition ImmediateContext.hpp:115
void WaitLaneReusable(size_t lane)
Definition ImmediateContext.cpp:126
UploadBatch AcquireLane(size_t lane)
Definition ImmediateContext.cpp:131
bool WaitTimeline(size_t value, size_t timeout) const
Definition ImmediateContext.cpp:105
size_t LaneCount() const noexcept
Definition ImmediateContext.hpp:92
size_t Capacity() const noexcept
Definition ImmediateContext.hpp:91
RHIDeviceScopedHandle< RHIDeviceSemaphore > mCompletionTimeline
Definition ImmediateContext.hpp:117
size_t mCapacity
Definition ImmediateContext.hpp:114
RHIDeviceSemaphore * CompletionTimeline() const
Definition ImmediateContext.hpp:93
bool IsLaneReusable(size_t lane, size_t timeout)
Definition ImmediateContext.cpp:113
void ReleaseRecording(size_t lane) noexcept
Definition ImmediateContext.cpp:174
RHIDevice * mDevice
Definition ImmediateContext.hpp:113
void WaitIdle()
Definition ImmediateContext.cpp:180