Foundation
Loading...
Searching...
No Matches
Renderer.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/ThreadPool.hpp>
4#include "RenderPass.hpp"
5#include "RenderResource.hpp"
6#include "Shader.hpp"
11{
16 {
31 bool asyncCompute{true};
38 bool present{true};
43 uint32_t threadCount{std::max(1u, std::thread::hardware_concurrency() - 1)};
49 };
50 /* -- Constants -- */
51 // Maximum number of render passes per frame
52 // NOTE: The limit here is mostly arbitrary - and is only used
53 // for the default priority heuristic when determining pass order.
54 constexpr size_t kMaxRenderPasses = 1024;
55 // Maximum number of command lists per frame
57 // Maximum size of the per-frame transient arena (16MB)
58 constexpr size_t kExecuteArenaSize = 16 * (1 << 20);
59 const RHIPipelineStage kComputeStagesMask = RHIPipelineStageBits::FragmentShader |
60 RHIPipelineStageBits::VertexShader | RHIPipelineStageBits::MeshShader | RHIPipelineStageBits::RayTracingShader |
61 RHIPipelineStageBits::AllGraphics;
62 const RHIResourceAccessBits kAllShaderWrites = RHIResourceAccessBits::ShaderWrite |
63 RHIResourceAccessBits::RenderTargetWrite | RHIResourceAccessBits::DepthStencilWrite |
64 RHIResourceAccessBits::TransferWrite | RHIResourceAccessBits::HostWrite;
65 const RHIResourceAccessBits kAllShaderReads = RHIResourceAccessBits::ShaderRead |
66 RHIResourceAccessBits::RenderTargetRead | RHIResourceAccessBits::UniformRead |
67 RHIResourceAccessBits::TransferRead | RHIResourceAccessBits::HostRead;
78 {
83 {
88 // Backbuffer specializations
90 // [resource, view desc]
93 // [resource, ord range]
95 // Passes ordered by pass.ord
99 // Execution grouped by queue type
101 {
102 const int groupIndex{}; // Index in executionGroups
103 int graphicsGroupIndex{-1}; // Index of all unique graphics groups before this one
104 int computeGroupIndex{-1}; // Index of all unique compute groups before this one
107 // Resources used in this group
109 bool isLastGraphics = false;
110 bool isLastCompute = false;
111
116 };
121 {
122 while (u >= graph.size())
123 graph.emplace_back(graph.get_allocator());
124 graph[u].emplace_back(v, hdl);
125 while (v >= in.size())
126 in.push_back(0);
127 in[v]++;
128 }
135 };
136 public:
137 enum class State
138 {
139 Undefined, // Initialized
140 Setup, // During BeginSetup(), EndSetup(). No work on the GPU yet.
141 PostSetup, // Safe state (with a device wait), after EndSetup(), EndExecute()
142 Execute // During BeginExecute(), EndExecute()
143 };
144
145 private:
148
150
151 uint64_t mFrameSwapped{0}; // Frame rendered in the current Swapchain
152
153 uint32_t mFrameSwaps{1}; // Max frames in flight
156
160 // Per swap primitives
182
184 // Semaphore for async compute
189
191 // Setup
193 RHITextureViewDesc const& desc) const;
194 // PostSetup
195 void CullPasses(PassHandle epilogue) const;
198 void FinalizeResources();
199 void FinalizePasses();
200 // Temporary memory arena for execution
202 // Temporary allocator for execution
203 // This is reset every frame, and only guaranteed to be valid during Execute state.
205 // Temporary storage for submits calls
206 // This is reset every frame, and only guaranteed to be valid during Execute state.
208 // Thread pool for concurrent command list recording
221 // [current sync][thread id]
234 {
235 switch (queue)
236 {
237 case RHIDeviceQueueType::Undefined:
239 case RHIDeviceQueueType::Graphics:
241 case RHIDeviceQueueType::Compute:
243 default:
244 throw std::runtime_error("Unhandled queue type");
245 }
246 }
270 void SetFrameSyncObjects();
280 RHIResourceAccess access = RHIResourceAccessBits::ShaderRead) const;
290 RHIResourceAccess access = RHIResourceAccessBits::ShaderRead,
291 RHITextureLayout layout = RHITextureLayout::ShaderReadOnly) const;
292 RHIDeviceIdleGuard mWaitIdle; // Ensure device is idle on destruction
293 public:
294 Renderer() = delete;
297
298#pragma region Render Graph Setup
304 void BeginSetup();
315 template <typename T, typename... Args>
316 requires std::is_base_of_v<RenderPass, T>
318 {
320 CHECK_MSG(queue == RHIDeviceQueueType::Graphics || queue == RHIDeviceQueueType::Compute,
321 "Invalid queue type. Only Graphics and Compute queues are supported.");
322 PassHandle handle = mSetup->trackedPasses.size();
323 CHECK_MSG(handle < kMaxRenderPasses, "Exceeded maximum number of render passes ({})", kMaxRenderPasses);
324 if (!mDesc.asyncCompute)
325 queue = RHIDeviceQueueType::Graphics; // Force graphics queue if async compute is disabled
326 mSetup->trackedPasses.emplace_back(
327 mAllocator, handle, name, queue,
328 ConstructUniqueBase<RenderPass, T>(mAllocator, std::forward<Args>(args)...), priority);
329 mSetup->epilogue = handle;
330 return handle;
331 }
347 template <typename FSetup, typename FRecord>
350 {
352 name, queue, priority, std::forward<FSetup>(setup), std::forward<FRecord>(record));
353 }
372 template <typename T>
374 {
376 ResourceHandle index = mSetup->trackedResources.size();
377 mSetup->trackedResources.emplace_back(index, name, desc, mAllocator);
378 return mSetup->trackedResources.size() - 1;
379 }
389#pragma region Resource Binding
396 void BindPass(PassHandle pass, PassHandle other);
409 const char* shader_path, Span<const char> specializationData = {}) const;
418 void BindPushConstant(PassHandle pass, RHIShaderStage stage, size_t offset, size_t size) const;
432 void BindVertexInput(PassHandle pass, RHIPipelineState::PipelineStateDesc::VertexInput const& info) const;
443 StringView bind_point) const;
454 StringView bind_point) const;
465 StringView bind_point) const;
474 void BindBufferShaderRead(PassHandle pass, ResourceHandle buffer, RHIPipelineStage stage) const;
480 void BindBufferCopyDst(PassHandle pass, ResourceHandle buffer) const;
486 void BindBufferCopySrc(PassHandle pass, ResourceHandle buffer) const;
498 void BindDescriptorSet(PassHandle pass, StringView bind_point, RHIDeviceDescriptorSetLayout* layout);
507 RHIPipelineStage stage, RHITextureViewDesc const& desc) const;
519 RHIPipelineStage stage, RHITextureViewDesc const& desc) const;
530 ResourceHandle BindTextureRTV(PassHandle pass, ResourceHandle texture, RHITextureViewDesc const& desc, RHIPipelineState::PipelineStateDesc::Attachment::Blending const& blending = {}) const;
539 ResourceHandle BindTextureDSV(PassHandle pass, ResourceHandle texture, RHITextureViewDesc const& desc) const;
546 void BindBackbufferRTV(PassHandle pass, RHIPipelineState::PipelineStateDesc::Attachment::Blending const& blending = {}) const;
550 void BindBackbufferUAV(PassHandle pass, int set_index) const;
558 RHITextureSubresourceRange const& range = {}) const;
566 RHITextureSubresourceRange const& range = {}) const;
567 /* TODO: Push Constants */
568#pragma endregion
569#pragma region PSO Flags
577 PassHandle pass,
578 RHIPipelineState::PipelineStateDesc::Rasterizer const& rasterizer = {},
579 RHIPipelineState::PipelineStateDesc::DepthStencil const& depth_stencil = {}
580 ) const;
581#pragma endregion
590 void EndSetup();
591#pragma endregion
592#pragma region Swapchain
597 {
598 CHECK(mSwapchain && "Swapchain not initialized");
599 return mSwapchain->mDesc.extents;
600 }
605 {
606 CHECK(mSwapchain && "Swapchain not initialized");
607 auto xy = mSwapchain->mDesc.extents;
608 return {xy.x, xy.y, 1};
609 }
610#pragma endregion
611#pragma region Render Graph Runtime
624 {
625 CHECK(mResources && handle < mResources->resources.size());
627 auto& res = mResources->resources[handle];
628 CHECK_MSG(!res.valueless_by_exception(), "Resource handle {} is valueless", handle);
629 return res.Visit([](auto* ptr) -> Tv { return ptr; },
630 [](auto& hdl) -> Tv { return hdl.Get(); });
631 }
638 {
639 CHECK(mResources && handle < mResources->views.size());
640 using Tv = RHITextureView*;
641 auto& view = mResources->views[handle];
642 CHECK_MSG(!view.valueless_by_exception(), "Texture view handle {} is valueless", handle);
643 return view.Visit([](auto& hdl) -> Tv { return hdl.Get(); });
644 }
651 {
652 CHECK(mSetup && handle < mSetup->trackedSamplers.size());
653 return mResources->samplers[handle].Get();
654 }
659 {
660 CHECK(mSetup && pass < mSetup->trackedPasses.size());
661 auto& tpass = mSetup->trackedPasses[pass];
662 return tpass.pso.Get();
663 }
668 {
669 CHECK(mSetup && pass < mSetup->trackedPasses.size());
670 auto& tpass = mSetup->trackedPasses[pass];
671 return tpass.pDescriptorSets;
672 }
677#pragma endregion
678#pragma region Command Recording Helpers
705 void CmdSetPipeline(PassHandle pass, RHICommandList* cmd) const;
728 void CmdBeginGraphics(PassHandle pass, RHICommandList* cmd, RHIExtent2D const& extent,
737 template <typename T>
739 T const& data)
740 {
742 auto& tpass = mSetup->trackedPasses[pass];
743 cmd->PushConstant(tpass.pso.Get(), stage, static_cast<uint32_t>(offset),
744 {reinterpret_cast<const char*>(&data), sizeof(T)});
745 }
746#pragma endregion
747#pragma region Frame Execution
751 [[nodiscard]] State GetState() const { return mState; }
762 [[nodiscard]] uint64_t GetFrame() const { return mFrameSwapped; }
773 [[nodiscard]] uint32_t GetSwap() const { return mCurrentSwap; }
787 [[nodiscard]] uint64_t GetSync() const { return mCurrentSync; }
792 {
793 CHECK_MSG(mSetup && pass < mSetup->trackedPasses.size(), "No passes available or out of bounds");
794 return mSetup->trackedPasses[pass];
795 }
809 [[nodiscard]] bool IsPresentEnabled() const { return mDesc.present; }
828 void BeginExecute();
851 void ExecuteFrame();
858 void EndExecute();
859#pragma endregion
860#pragma region Debugging
861 [[nodiscard]] String DbgDumpGraphviz() const;
879#pragma endregion
880 };
883 ENUM_NAME(Setup);
884 ENUM_NAME(PostSetup);
885 ENUM_NAME(Execute);
887} // namespace Foundation::RenderCore
#define ENUM_NAME_CONV_BEGIN(T)
Defines convince to_string() method and format_as() [fmt] for the respective enum class Example usage...
Definition Enums.hpp:82
#define ENUM_NAME(E)
Definition Enums.hpp:93
#define CHECK(expr)
Definition Logging.hpp:45
#define CHECK_MSG(expr, format_str,...)
Definition Logging.hpp:50
Implements a lock-free stack-based bump allocator.
Definition AllocatorStack.hpp:12
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Atomic, lock-free Thread Pool implementation with fixed bounds.
Definition ThreadPool.hpp:58
Definition Command.hpp:35
Definition Descriptor.hpp:11
Definition Device.hpp:16
virtual uint32_t GetVkQueueFamily() const =0
Definition Device.hpp:104
Definition Device.hpp:188
Handle type for RHI Objects.
Definition Details.hpp:42
Definition PipelineState.hpp:8
Definition PipelineState.hpp:22
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
Definition Resource.hpp:188
Definition Resource.hpp:169
Renderer implementing a Frame Graph system with automatic resource tracking and synchronization.
Definition Renderer.hpp:78
PassHandle CreatePass(StringView name, RHIDeviceQueueType queue, size_t priority, FSetup &&setup, FRecord &&record)
Create a render pass from a Setup(Renderer*, PassHandle) and Record(Renderer*, PassHandle,...
Definition Renderer.hpp:348
void PassSetRasterizerFlags(PassHandle pass, RHIPipelineState::PipelineStateDesc::Rasterizer const &rasterizer={}, RHIPipelineState::PipelineStateDesc::DepthStencil const &depth_stencil={}) const
Sets the rasterizer and depth-stencil state for a graphics pass.
Definition Renderer.cpp:282
UniquePtr< ExecuteResources > mResources
Definition Renderer.hpp:157
void BeginSetup()
Begins the setup phase of the render graph.
Definition Renderer.cpp:27
const RendererDesc mDesc
Definition Renderer.hpp:149
RHICommandList * ExecuteAllocateCommandList(RHIDeviceQueueType queue, int thread_id=-1)
Definition Renderer.cpp:1266
RHIDeviceHandle< RHISwapchain > mSwapchain
Definition Renderer.hpp:187
void DeclareBufferAccess(PassHandle pass, ResourceHandle handle, RHIPipelineStage stage, RHIResourceAccess access=RHIResourceAccessBits::ShaderRead) const
Explicitly declares that this pass will access the buffer in the specified stage with the specified a...
Definition Renderer.cpp:57
void BindBufferShaderRead(PassHandle pass, ResourceHandle buffer, RHIPipelineStage stage) const
Declares this pass has shaders that will read from this buffer. e.g. Vertex, Index.
Definition Renderer.cpp:154
Vector< Pair< RHIDeviceQueueType, RHIDeviceQueue::SubmitDesc > > * mExecuteSubmits
Definition Renderer.hpp:207
State mState
Definition Renderer.hpp:146
void CmdBindDescriptorSet(PassHandle pass, RHICommandList *cmd, uint32_t set_index, RHIDeviceDescriptorSet *descriptor_set) const
Helper that binds a single descriptor set to the current command list.
Definition Renderer.cpp:1629
Vector< Vector< UniquePtr< ExecutePerThreadCommandLists > > > mExecutePerSwapCmds
Definition Renderer.hpp:222
RHIDeviceScopedHandle< RHIDeviceDescriptorSetLayout > mSwapDescriptorSetLayout
Definition Renderer.hpp:181
void BindDescriptorSet(PassHandle pass, StringView bind_point, RHIDeviceDescriptorSetLayout *layout)
Manually bind an existing descriptor set (layout) to the pipeline.
Definition Renderer.cpp:175
RHIDeviceSampler * DerefSampler(const ResourceHandle handle) const
Dereference a sampler handle to its underlying RHI sampler.
Definition Renderer.hpp:650
void ExecuteFrame()
Executes all passes in the render graph for one frame.
Definition Renderer.cpp:1281
void ExecuteBarrierSubresourceState(PassHandle pass, RHITexture *res, TrackedResource::SubresourceState &sta, RHIResourceAccess access, RHIPipelineStage stage, RHITextureLayout layout, ExecuteBarrierPCmdOrPBarrierList cmd) const
Definition Renderer.cpp:1112
RHIDeviceQueue * mGraphicsQueue
Definition Renderer.hpp:188
Vector< RHIDeviceDescriptorSet * > const & DerefDescriptorSets(const PassHandle pass) const
Dereference the built descriptor sets associated with a given pass.
Definition Renderer.hpp:667
uint32_t ExecuteGetQueueFamily(RHIDeviceQueueType queue) const
Helper to get the queue index of a queue type.
Definition Renderer.hpp:233
ResourceHandle BindTextureUAV(PassHandle pass, ResourceHandle texture, StringView bind_point, RHIPipelineStage stage, RHITextureViewDesc const &desc) const
Binds a texture for unordered (UAV) read-write access in shaders.
Definition Renderer.cpp:193
ResourceHandle CreateTextureView(PassHandle pass, ResourceHandle handle, RHITextureViewDesc const &desc) const
Definition Renderer.cpp:37
void BindTextureSampler(PassHandle pass, ResourceHandle sampler, StringView bind_point) const
Binds a sampler to the shader.
Definition Renderer.cpp:169
void ExecuteBarrierSubresource(PassHandle pass, TrackedResource &res, RHITextureSubresourceRange const &range, RHIResourceAccess access, RHIPipelineStage stage, RHITextureLayout layout, ExecuteBarrierPCmdOrPBarrierList cmd)
Executes barriers for a subresource range of a texture.
Definition Renderer.cpp:1145
ScopedArena mExecuteArena
Definition Renderer.hpp:201
void CmdBeginGraphics(PassHandle pass, RHICommandList *cmd, RHIExtent2D const &extent, Span< const Optional< RHIClearColor > > clear_rtv={}, Optional< RHIClearDepthStencil > const &clear_dsv=RHIClearDepthStencil{0.0f, 0u})
Helper that pushes correct descriptor sets and PSO to the current command list, and pushes correct Be...
Definition Renderer.cpp:1651
void CmdDispatch(PassHandle pass, RHICommandList *cmd, RHIExtent3D thread_size) const
Helper that dispatches a compute shader with the specified THREAD count.
Definition Renderer.cpp:1704
Mutex mDescPoolMutex
Definition Renderer.hpp:159
void BindBackbufferRTV(PassHandle pass, RHIPipelineState::PipelineStateDesc::Attachment::Blending const &blending={}) const
Definition Renderer.cpp:244
void BindVertexInput(PassHandle pass, RHIPipelineState::PipelineStateDesc::VertexInput const &info) const
Associates Vertex Input description with this pass.
Definition Renderer.cpp:112
void CmdSetPipeline(PassHandle pass, RHICommandList *cmd) const
Helper that sets the current pass's PSO and descriptor sets to the current command list.
Definition Renderer.cpp:1616
uint32_t mFrameSwaps
Definition Renderer.hpp:153
void FinalizePasses()
Definition Renderer.cpp:869
void BuildPipelineState(PassHandle pass)
Definition Renderer.cpp:465
void BindPass(PassHandle pass, PassHandle other)
Declares an inter-pass dependency, where the other pass should execute-before the current pass.
Definition Renderer.cpp:51
void BindBufferStorageRead(PassHandle pass, ResourceHandle buffer, RHIPipelineStage stage, StringView bind_point) const
Binds a read-only storage buffer to a specified binding point.
Definition Renderer.cpp:138
RHIDeviceScopedHandle< RHIDeviceSemaphore > mGraphicsTimeline
Definition Renderer.hpp:185
void SetSwapchain(RHIDeviceHandle< RHISwapchain > swapchain)
Update the swapchain to a new one. You must call this when the window is resized or the swapchain is ...
Definition Renderer.cpp:1008
String DbgDumpActivePasses() const
Definition Renderer.cpp:1760
RHIPipelineState * DerefPipelineState(const PassHandle pass) const
Dereference the automatically built pipeline state object handle associated with a given pass.
Definition Renderer.hpp:658
PassHandle CreatePassImpl(StringView name, RHIDeviceQueueType queue, size_t priority, Args &&... args)
Create a render pass from a RenderPass* implementation and add it to the render graph.
Definition Renderer.hpp:317
uint32_t GetFrameSwaps() const
Get the number of frames that can be simultaneously in-flight.
Definition Renderer.hpp:755
AllocatorStack mExecuteAlloc
Definition Renderer.hpp:204
Vector< FrameSyncObjects > mSwaps
Definition Renderer.hpp:183
ResourceHandle BindTextureRTV(PassHandle pass, ResourceHandle texture, RHITextureViewDesc const &desc, RHIPipelineState::PipelineStateDesc::Attachment::Blending const &blending={}) const
Binds a texture as a Render Target View (color attachment) for a graphics pass.
Definition Renderer.cpp:207
String DbgDumpExecutionGroups() const
Definition Renderer.cpp:1773
uint64_t mFrameSwapped
Definition Renderer.hpp:151
ResourceHandle BindTextureDSV(PassHandle pass, ResourceHandle texture, RHITextureViewDesc const &desc) const
Binds a texture as a Depth-Stencil View for a graphics pass.
Definition Renderer.cpp:225
RHIDeviceScopedHandle< RHIDeviceDescriptorPool > mDescPool
Definition Renderer.hpp:158
ThreadPool mExecuteThreadPool
Definition Renderer.hpp:209
void SetFrameSyncObjects()
Sets backbuffer views and sync primitives.
Definition Renderer.cpp:981
void BindBufferCopySrc(PassHandle pass, ResourceHandle buffer) const
Declares that this pass will read from the buffer via copy.
Definition Renderer.cpp:164
uint32_t mCurrentSwap
Definition Renderer.hpp:155
void DeclareTextureAccess(PassHandle pass, ResourceHandle handle, RHIPipelineStage stage, RHITextureSubresourceRange range={}, RHIResourceAccess access=RHIResourceAccessBits::ShaderRead, RHITextureLayout layout=RHITextureLayout::ShaderReadOnly) const
Declares that this pass will access the texture in the specified stage with the specified access.
Definition Renderer.cpp:76
RHIExtent3D GetSwapchainExtent3D() const
Get the current swapchain extents as a 3D extent with depth 1.
Definition Renderer.hpp:604
UniquePtr< RendererSetup > mSetup
Definition Renderer.hpp:190
void CullPasses(PassHandle epilogue) const
Definition Renderer.cpp:312
Allocator * GetAllocator() const
Definition Renderer.hpp:676
void BindTextureCopyDst(PassHandle pass, ResourceHandle texture, RHITextureSubresourceRange const &range={}) const
Declares that this pass will write to the texture via copy / blit (transfer destination).
Definition Renderer.cpp:264
RHIExtent2D GetSwapchainExtent() const
Get the current swapchain extents.
Definition Renderer.hpp:596
RHIApplicationHandle< RHIDevice > mDevice
Definition Renderer.hpp:186
Allocator * mAllocator
Definition Renderer.hpp:147
void ExecuteBarriers(TrackedPass &pass, ExecuteBarrierPCmdOrPBarrierList cmd)
Executes all barriers for a pass.
Definition Renderer.cpp:1188
void BindBufferCopyDst(PassHandle pass, ResourceHandle buffer) const
Declares that this pass will write to the buffer via copy.
Definition Renderer.cpp:159
void BeginExecute()
Resets the temporary execution allocator , and waits for the possibly multi-buffered next frame to fi...
Definition Renderer.cpp:1059
TrackedPass const & GetTrackedPass(PassHandle pass)
Retrieves an internal tracked pass associated with the given handle, read-only.
Definition Renderer.hpp:791
void EndExecute()
Ends the execution phase and performs GPU submission, possibly with a RHIDeviceQueue::Present.
Definition Renderer.cpp:1565
Variant< RHIBuffer *, RHITexture * > DerefResource(const ResourceHandle handle) const
Dereference a resource handle to its underlying RHI resource.
Definition Renderer.hpp:623
void FinalizeResources()
Definition Renderer.cpp:889
uint32_t mCurrentSync
Definition Renderer.hpp:154
void BindPushConstant(PassHandle pass, RHIShaderStage stage, size_t offset, size_t size) const
Declares a range of Push Constant used in a stage.
Definition Renderer.cpp:120
void ExecuteBarrierBuffer(PassHandle pass, TrackedResource &res, RHIResourceAccess access, RHIPipelineStage stage, ExecuteBarrierPCmdOrPBarrierList cmd)
Executes barriers for a whole buffer.
Definition Renderer.cpp:1160
Span< const uint64_t > DbgProfilePassTiming(uint64_t sync, float &resolutionNS) const
Retrieves timings for all passes executed in the last frame associated with the specified sync index....
Definition Renderer.cpp:1788
String DbgDumpGraphviz() const
Definition Renderer.cpp:1712
void BindTextureCopySrc(PassHandle pass, ResourceHandle texture, RHITextureSubresourceRange const &range={}) const
Declares that this pass will read from the texture via copy / blit (transfer source).
Definition Renderer.cpp:273
void BindBufferUnordered(PassHandle pass, ResourceHandle buffer, RHIPipelineStage stage, StringView bind_point) const
Binds a buffer for unordered (UAV) access from shaders (read and/or write in any order).
Definition Renderer.cpp:146
RHIDeviceQueue * mComputeQueue
Definition Renderer.hpp:188
Vector< Pair< Variant< RHIBuffer *, RHITexture * >, RHICommandList::TransitionDesc > > ExecuteBarrierList
Definition Renderer.hpp:247
RHIDeviceScopedHandle< RHIDeviceSemaphore > mComputeTimeline
Definition Renderer.hpp:185
void CmdSetPushConstant(PassHandle pass, RHICommandList *cmd, RHIShaderStage stage, size_t offset, T const &data)
Helper that sets a Push Constant range data with a single l-value.
Definition Renderer.hpp:738
void BindShader(PassHandle pass, RHIShaderStage stage, StringView entry_point, const char *shader_path, Span< const char > specializationData={}) const
Binds shader file path to a certain pass at a certain stage.
Definition Renderer.cpp:98
ResourceHandle BindTextureSRV(PassHandle pass, ResourceHandle texture, StringView bind_point, RHIPipelineStage stage, RHITextureViewDesc const &desc) const
Binds a texture as a Shader Resource View (read-only sampling / fetch).
Definition Renderer.cpp:180
bool IsAsyncComputeEnabled() const
Returns whether async compute is enabled.
Definition Renderer.hpp:802
RHIDeviceIdleGuard mWaitIdle
Definition Renderer.hpp:292
uint64_t DbgProfilePresentTiming(uint64_t sync, float &resolutionNS) const
Retrieves the total ticks between two subsequent swapchain presents by EndExecute,...
Definition Renderer.cpp:1794
uint64_t GetSync() const
Retrieves the current synchronization index.
Definition Renderer.hpp:787
State
Definition Renderer.hpp:138
bool IsPresentEnabled() const
Returns whether the swapchain is enabled.
Definition Renderer.hpp:809
void BuildPipelineStateAll()
Definition Renderer.cpp:841
RHIExtent3D CmdGetComputeLocalSize(PassHandle pass) const
Helper that retrieves the local size declared by a compute pass.
Definition Renderer.cpp:1696
uint32_t GetSwap() const
Retrieves the current swap index at the time of ExecuteFrame().
Definition Renderer.hpp:773
uint64_t GetFrame() const
Retrieves the current frame number.
Definition Renderer.hpp:762
State GetState() const
Retrieves the current state of the renderer.
Definition Renderer.hpp:751
RHITextureView * DerefTextureView(const ResourceHandle handle) const
Dereference a texture view handle to its underlying RHI texture view.
Definition Renderer.hpp:637
void EndSetup()
Finish setting up the render graph.
Definition Renderer.cpp:292
void BindBufferUniform(PassHandle pass, ResourceHandle buffer, RHIPipelineStage stage, StringView bind_point) const
Binds a uniform buffer to a specified binding point in a rendering pass.
Definition Renderer.cpp:130
ResourceHandle CreateSampler(RHIDeviceSampler::SamplerDesc const &desc) const
Creates a sampler with the specified name and descriptor.
Definition Renderer.cpp:45
ResourceHandle CreateResource(StringView name, T const &desc)
Create a new resource to be used in the render graph.
Definition Renderer.hpp:373
void BindBackbufferUAV(PassHandle pass, int set_index) const
Binds the backbuffer as RW access at binding 0 of set index.
Definition Renderer.cpp:254
RHIDeviceScopedHandle< RHIDeviceDescriptorPool > mSwapDescriptorPool
Definition Renderer.hpp:180
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
std::basic_string< char > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:112
std::mutex Mutex
Definition Thread.hpp:10
std::map< K, V, Predicate, StlAllocator< Pair< const K, V > > > Map
std::map with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:160
std::basic_string_view< char > StringView
Alias for std::basic_string_view<char>
Definition Container.hpp:55
std::unique_ptr< T, Deleter > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:166
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
std::optional< T > Optional
Alias for std::optional
Definition Container.hpp:26
const uint32_t kCommandQueueTransferIgnored
Definition Command.hpp:34
RHITextureLayout
Definition Common.hpp:144
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHIDeviceQueueType
Definition Common.hpp:107
Pair< float, uint32_t > RHIClearDepthStencil
Definition Common.hpp:18
static constexpr Handle kInvalidHandle
Definition Details.hpp:9
glm::vec< 2, uint32_t > RHIExtent2D
Definition Common.hpp:10
Core functionalities for rendering, including the Frame Graph implementation.
Definition Bindless.cpp:2
size_t ResourceHandle
Definition RenderPass.hpp:11
size_t PassHandle
Definition RenderPass.hpp:10
const RHIResourceAccessBits kAllShaderWrites
Definition Renderer.hpp:62
constexpr size_t kMaxRenderPasses
Definition Renderer.hpp:54
const RHIResourceAccessBits kAllShaderReads
Definition Renderer.hpp:65
const RHIPipelineStage kComputeStagesMask
Definition Renderer.hpp:59
constexpr size_t kExecuteArenaSize
Definition Renderer.hpp:58
constexpr size_t kMaxCommandListsPerThread
Definition Renderer.hpp:56
RAII wrapper for an arena allocated from an Allocator.
Definition Allocator.hpp:44
Extended std::variant with C++23 visit() behavior and convenience Get()/GetIf() methods.
Definition Variant.hpp:17
RAII guard to wait for device idle on destruction.
Definition Device.hpp:299
Definition Resource.hpp:164
Parameters for Renderer creation.
Definition Renderer.hpp:16
uint32_t threadCount
Number of worker threads to use for recording command lists.
Definition Renderer.hpp:43
bool asyncCompute
Enable Async Compute support.
Definition Renderer.hpp:31
bool present
Enable presentation support.
Definition Renderer.hpp:38
RHIPipelineStateCache * pipelineCache
Optional PSO cache to potentially speed up pipeline state recompilation in Setup time.
Definition Renderer.hpp:48
Vector< RHICommandPoolScopedHandle< RHICommandList > > computeCmds
Definition Renderer.hpp:213
RHICommandList * AllocateCompute()
Definition Renderer.cpp:1256
RHIDeviceScopedHandle< RHICommandPool > computePool
Definition Renderer.hpp:212
RHICommandList * AllocateGraphics()
Definition Renderer.cpp:1246
RHIDeviceScopedHandle< RHICommandPool > graphicsPool
Definition Renderer.hpp:212
Vector< RHICommandPoolScopedHandle< RHICommandList > > graphicsCmds
Definition Renderer.hpp:213
ResourceHandle backbuffer
Definition Renderer.hpp:171
RHIDeviceScopedHandle< RHIDeviceQueryPool > dbgQueryPool
Definition Renderer.hpp:173
RHIDeviceScopedHandle< RHIDeviceFence > computeFence
Definition Renderer.hpp:166
RHIDeviceScopedHandle< RHIDeviceFence > graphicsFence
Definition Renderer.hpp:166
uint64_t dbgSwapLastPresentToPresentTicks
Definition Renderer.hpp:177
FrameSyncObjects(size_t swapIndex, Allocator *alloc)
Definition Renderer.hpp:178
const size_t swapIndex
Definition Renderer.hpp:164
Vector< uint64_t > dbgQueryPassTimestampsResults
Definition Renderer.hpp:174
RHITextureScopedHandle< RHITextureView > view
Definition Renderer.hpp:168
RHIDeviceScopedHandle< RHIDeviceSemaphore > render
Definition Renderer.hpp:165
RHIDeviceScopedHandle< RHIDeviceSemaphore > present
Definition Renderer.hpp:165
RHIDeviceDescriptorPoolScopedHandle< RHIDeviceDescriptorSet > viewSet
Definition Renderer.hpp:169
std::chrono::steady_clock::time_point dbgSwapLastPresentTick
Definition Renderer.hpp:176
Vector< PassHandle > passes
Definition Renderer.hpp:106
Vector< ResourceHandle > resources
Definition Renderer.hpp:108
ExecutionGroups(int groupIndex, RHIDeviceQueueType queue, Allocator *allocator)
Definition Renderer.hpp:112
const RHIDeviceQueueType queue
Definition Renderer.hpp:105
Helper class containing all states pertaining to Renderer's Setup phase.
Definition Renderer.hpp:83
Vector< ExecutionGroups > executionGroups
Definition Renderer.hpp:117
PassHandle lastBackbufferProducer
Definition Renderer.hpp:89
bool executionAnyCompute
Definition Renderer.hpp:118
int executionNumGraphicsGroups
Definition Renderer.hpp:119
Vector< PassHandle > execution
Definition Renderer.hpp:96
Vector< Vector< Pair< PassHandle, ResourceHandle > > > graph
Definition Renderer.hpp:84
Vector< TrackedPass > trackedPasses
Definition Renderer.hpp:86
Map< ResourceHandle, Pair< PassHandle, PassHandle > > activeResources
Definition Renderer.hpp:94
int executionNumComputeGroups
Definition Renderer.hpp:119
Vector< PassHandle > in
Definition Renderer.hpp:85
void add_edge(const PassHandle u, const PassHandle v, const ResourceHandle hdl)
Definition Renderer.hpp:120
PassHandle epilogue
Definition Renderer.hpp:98
Vector< RHIDeviceSampler::SamplerDesc > trackedSamplers
Definition Renderer.hpp:92
Map< RHIDescriptorType, uint32_t > bindingCounts
Definition Renderer.hpp:97
Vector< TrackedResource > trackedResources
Definition Renderer.hpp:87
Vector< Pair< ResourceHandle, RHITextureViewDesc > > trackedViews
Definition Renderer.hpp:91
bool executionAnyGraphics
Definition Renderer.hpp:118
RendererSetup(Allocator *allocator)
Definition Renderer.hpp:129
Internal tracking information for a render pass in the frame graph.
Definition RenderPass.hpp:77
Internal tracking information for a resource in the frame graph.
Definition RenderResource.hpp:16