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
50 {
52 {
55 char* begin;
56 char* end;
57 size_t signalValue{0};
58
59 UploadLane(RHIDevice* device, size_t capacity, RHIDeviceQueueType type);
60 };
61
64
65 char *begin, *ptr, *end;
66 ImmediateUpload(RHIDevice* device, size_t capacity,
67 RHIDeviceQueueType type = RHIDeviceQueueType::Graphics,
68 size_t buffers = 1);
69
73 [[nodiscard]] RHICommandList* Get() const;
74
79 void Begin();
80
87 char* Upload(RHIBuffer* dst, size_t dataSize, size_t dstOffset);
94 char* Upload(RHITexture* dst, size_t dataSize,
95 RHITextureSubresourceLayer dstLayer = {.aspect = RHITextureAspectFlagBits::Color},
96 RHIOffset2D dstOffset = {},
98 char* Upload(RHITexture* dst, size_t dataSize, RHITextureSubresourceLayer dstLayer, RHIOffset3D dstOffset,
100
101 bool Align(uint32_t alignment);
106 void End(RHIDeviceFence* completionFence = nullptr);
107 void End(ImmediateSubmitDesc const& desc);
108
109 void WaitIdle();
110
111 private:
113 size_t mLaneCount{1};
114 size_t mCurrentLane{0};
117 char* mLane0Begin{nullptr};
118 char* mLane0End{nullptr};
122
124 [[nodiscard]] ImmediateContext const& CurrentContext() const;
126 [[nodiscard]] char* CurrentBegin() const;
127 [[nodiscard]] char* CurrentEnd() const;
128 [[nodiscard]] size_t& CurrentSignalValue();
130 void SelectCurrentLane();
131 };
132
137 {
140
141 char *begin, *ptr, *end;
142 ImmediateReadback(RHIDevice* device, size_t capacity, RHIDeviceQueueType type = RHIDeviceQueueType::Graphics) :
143 ctx(type, device),
144 staging(device->CreateBuffer({.resource =
145 {
146 .heap = RHIDeviceHeapType::Readback,
147 .hostAccess = RHIResourceHostAccess::ReadWrite,
148 .shared = false, /* Transfer only */
149 .coherent = true, /* No invalidate required */
150 .staging = false,
151 },
152 .usage = RHIBufferUsageBits::TransferDestination,
153 .size = capacity}))
154 {
155 begin = ptr = staging->Map<char>();
156 end = ptr + capacity;
157 }
158
163 void Begin();
164
171 char* Readback(RHIBuffer* src, size_t dataSize, size_t srcOffset = 0);
178 char* Readback(RHITexture* src, size_t dataSize,
179 RHITextureSubresourceLayer srcLayer = {.aspect = RHITextureAspectFlagBits::Color},
180 RHIOffset2D srcOffset = {},
182 char* Readback(RHITexture* src, size_t dataSize, RHITextureSubresourceLayer srcLayer, RHIOffset3D srcOffset,
184
185 bool Align(uint32_t alignment);
190 void End(RHIDeviceFence* completionFence = nullptr);
191 void End(ImmediateSubmitDesc const& desc);
192
193 void WaitIdle();
194 };
195
196} // namespace Foundation::RenderCore
Definition Resource.hpp:57
Definition Command.hpp:42
Definition Device.hpp:66
Definition Device.hpp:16
Definition Device.hpp:245
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
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:22
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:9
RHICommandList * Get() const
Definition ImmediateContext.hpp:35
RHIDevice *const mDevice
Definition ImmediateContext.hpp:26
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
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
glm::vec< 2, int32_t > RHIOffset2D
Definition Common.hpp:13
glm::vec< 3, int32_t > RHIOffset3D
Definition Common.hpp:14
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIDeviceQueueType
Definition Common.hpp:164
Graphics
Definition Common.hpp:180
glm::vec< 2, uint32_t > RHIExtent2D
Definition Common.hpp:10
Core functionalities for rendering, including the Frame Graph implementation.
Definition Bindless.cpp:2
RHITextureAspectFlag aspect
Definition Resource.hpp:161
Single persistent staging buffer + immediate context for quick, batchable readbacks.
Definition ImmediateContext.hpp:137
RHIDeviceScopedHandle< RHIBuffer > staging
Definition ImmediateContext.hpp:139
char * ptr
Definition ImmediateContext.hpp:141
char * end
Definition ImmediateContext.hpp:141
ImmediateContext ctx
Definition ImmediateContext.hpp:138
void End(RHIDeviceFence *completionFence=nullptr)
Definition ImmediateContext.cpp:268
ImmediateReadback(RHIDevice *device, size_t capacity, RHIDeviceQueueType type=RHIDeviceQueueType::Graphics)
Definition ImmediateContext.hpp:142
void Begin()
Definition ImmediateContext.cpp:217
char * begin
Definition ImmediateContext.hpp:141
void WaitIdle()
Definition ImmediateContext.cpp:277
bool Align(uint32_t alignment)
Definition ImmediateContext.cpp:260
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:52
char * begin
Definition ImmediateContext.hpp:55
size_t signalValue
Definition ImmediateContext.hpp:57
RHIDeviceScopedHandle< RHIBuffer > staging
Definition ImmediateContext.hpp:54
ImmediateContext ctx
Definition ImmediateContext.hpp:53
char * end
Definition ImmediateContext.hpp:56
Persistent staging buffer(s) + immediate context(s) for quick, batchable uploads.
Definition ImmediateContext.hpp:50
Core::Vector< RHIDeviceQueue::TimelinePair > mSubmitSignals
Definition ImmediateContext.hpp:121
char * CurrentEnd() const
Definition ImmediateContext.cpp:90
char * mLane0Begin
Definition ImmediateContext.hpp:117
Core::Vector< Core::UniquePtr< UploadLane > > mLanes
Definition ImmediateContext.hpp:120
size_t mNextSignalValue
Definition ImmediateContext.hpp:115
char * CurrentBegin() const
Definition ImmediateContext.cpp:85
ImmediateContext & CurrentContext()
Definition ImmediateContext.cpp:70
void Begin()
Definition ImmediateContext.cpp:124
RHICommandList * Get() const
Definition ImmediateContext.cpp:100
void End(RHIDeviceFence *completionFence=nullptr)
Definition ImmediateContext.cpp:176
void SelectCurrentLane()
Definition ImmediateContext.cpp:117
size_t mLaneCount
Definition ImmediateContext.hpp:113
bool Align(uint32_t alignment)
Definition ImmediateContext.cpp:168
ImmediateContext ctx
Definition ImmediateContext.hpp:62
RHIDeviceScopedHandle< RHIBuffer > staging
Definition ImmediateContext.hpp:63
RHIDeviceScopedHandle< RHIDeviceSemaphore > mCompletionTimeline
Definition ImmediateContext.hpp:119
char * end
Definition ImmediateContext.hpp:65
size_t mLane0SignalValue
Definition ImmediateContext.hpp:116
char * mLane0End
Definition ImmediateContext.hpp:118
RHIBuffer * CurrentStaging() const
Definition ImmediateContext.cpp:80
RHIDevice * mDevice
Definition ImmediateContext.hpp:112
char * ptr
Definition ImmediateContext.hpp:65
char * begin
Definition ImmediateContext.hpp:65
size_t mCurrentLane
Definition ImmediateContext.hpp:114
void WaitCurrentLaneReusable()
Definition ImmediateContext.cpp:105
void WaitIdle()
Definition ImmediateContext.cpp:201
size_t & CurrentSignalValue()
Definition ImmediateContext.cpp:95