RenderManager.ixx File
Draft render manager that batches render commands per scene and target. More...
Included Headers
#include <vector>
#include <format>
#include "helios-engine-config.h"
#include <optional>
#include <helios.engine.rendering.shader.types>
#include <helios.engine.rendering.material.types>
#include <helios.engine.rendering.mesh.types>
#include <helios.math>
#include <helios.engine.runtime.world.tags.ManagerRole>
#include <helios.engine.runtime.world.UpdateContext>
#include <helios.engine.rendering.renderTarget.types.RenderTargetHandle>
#include <helios.engine.scene.components>
#include <helios.engine.util.log>
#include <helios.engine.rendering.viewport.types.ViewportHandle>
#include <helios.engine.scene.types.SceneHandle>
#include <helios.engine.core.container.HandleMultiMap>
#include <helios.engine.rendering.common.types.RenderPassContext>
#include <helios.engine.scene.types>
#include <helios.engine.runtime.messaging.command.CommandHandlerRegistry>
#include <helios.ecs.types>
#include <helios.engine.rendering.common.commands>
#include <helios.engine.rendering.common.concepts.IsRenderBackendLike>
Namespaces Index
| namespace | helios |
| namespace | engine |
| namespace | rendering |
Classes Index
| class | RenderManager<TRenderBackend, TMemberHandle> |
|
Collects render commands into hierarchical batches and forwards them to the backend. More... | |
| struct | MeshBatch<TDrawMemberHandle> |
|
Lowest-level batch collecting draw contexts for one mesh. More... | |
| struct | MaterialBatch<TDrawMemberHandle> |
|
Groups mesh batches for one material. More... | |
| struct | ShaderBatch<TDrawMemberHandle> |
|
Groups material batches for one shader. More... | |
| struct | ViewportBatch<TDrawMemberHandle> |
|
Groups shader batches for one viewport. More... | |
| struct | RenderTargetBatch<TDrawMemberHandle> |
|
Top-level batch grouping viewport batches per render target. More... | |
Macro Definitions Index
| #define | HELIOS_LOG_SCOPE "helios::engine::rendering::RenderManager" |
Description
Draft render manager that batches render commands per scene and target.
Macro Definitions
HELIOS_LOG_SCOPE
|
Definition at line 62 of file RenderManager.ixx.
62#define HELIOS_LOG_SCOPE "helios::engine::rendering::RenderManager"
File Listing
The file content with the documentation metadata removed is:
9#include "helios-engine-config.h"
42using namespace helios::engine::scene::components;
43using namespace helios::engine::core::container;
44using namespace helios::engine::runtime::world;
45using namespace helios::engine::runtime::world::tags;
46using namespace helios::engine::runtime::messaging::command;
47using namespace helios::engine::rendering::common::commands;
48using namespace helios::engine::rendering::common::types;
49using namespace helios::engine::rendering::mesh::types;
50using namespace helios::engine::rendering::material::types;
51using namespace helios::engine::rendering::shader::types;
52using namespace helios::engine::rendering::viewport::types;
54using namespace helios::engine::rendering::renderTarget::types;
55using namespace helios::engine::rendering::viewport::types;
56using namespace helios::engine::scene::types;
58using namespace helios::engine::scene::types;
59using namespace helios::engine::util::log;
62#define HELIOS_LOG_SCOPE "helios::engine::rendering::RenderManager"
63export namespace helios::engine::rendering {
77 class RenderManager {
89 static void clearActive(TBatch* batch, std::vector<EntityId>& activeIndices, std::vector<TChildHandle>& batches) {
90 batch->isActive = false;
91 for (auto idx: activeIndices) {
92 batches[idx].clear();
108 static TChildBatch& addToBatch(const THandle handle, std::vector<TChildBatch>& batches, std::vector<EntityId>& activeIndices) {
112 auto& batch = batches[handle.entityId];
115 batch.handle = handle;
120 return batch;
131 MeshHandle handle;
133 MeshBatch(){drawContexts.reserve(DEFAULT_GAMEOBJECT_CAPACITY);}
148 MaterialHandle handle;
151 MaterialBatch(){batches.reserve(DEFAULT_MESH_POOL_CAPACITY);}
152 [[nodiscard]] MeshBatch<TDrawMemberHandle>& getOrAdd(MeshHandle handle) {
168 ShaderHandle handle;
171 ShaderBatch(){batches.reserve(DEFAULT_MATERIAL_POOL_CAPACITY);}
172 [[nodiscard]] MaterialBatch<TDrawMemberHandle>& getOrAdd(MaterialHandle handle) {
188 ViewportHandle handle;
191 [[nodiscard]] ShaderBatch<TDrawMemberHandle>& getOrAdd(ShaderHandle handle) {
194 ViewportBatch(){batches.reserve(DEFAULT_SHADER_POOL_CAPACITY);}
208 RenderTargetHandle handle;
211 [[nodiscard]] ViewportBatch<TDrawMemberHandle>& getOrAdd(ViewportHandle handle) {
214 RenderTargetBatch(){batches.reserve(DEFAULT_VIEWPORT_POOL_CAPACITY);}
221 inline static auto& logger_ = LogManager::loggerForScope(HELIOS_LOG_SCOPE);
227 TRenderBackend& renderBackend_;
237 [[nodiscard]] ViewportBatch<TMemberHandle>& ensureViewportBatch(
238 RenderTargetHandle renderTargetHandle, ViewportHandle viewportHandle) {
240 auto renderTargetId = renderTargetHandle.entityId;
243 renderTargetBatches_.resize(renderTargetId + 1);
246 auto& renderTargetBatch = renderTargetBatches_[renderTargetId];
248 if (!renderTargetBatch.isActive) {
249 renderTargetBatch.isActive = true;
250 renderTargetBatch.handle = renderTargetHandle;
251 activeRenderTargetIndices_.push_back(renderTargetId);
254 return renderTargetBatch.getOrAdd(viewportHandle);
262 using EngineRoleTag = ManagerRole;
269 explicit RenderManager(TRenderBackend& renderBackend) : renderBackend_(renderBackend) {
271 renderTargetBatches_.reserve(DEFAULT_FRAMEBUFFER_POOL_CAPACITY);
285 void flush(UpdateContext& updateContext) {
287 for (auto renderTargetIdx : activeRenderTargetIndices_) {
288 auto& renderTargetBatch = renderTargetBatches_[renderTargetIdx];
290 renderBackend_.beginRenderTargetBatch(renderTargetBatch.handle);
292 for (auto viewportIdx : renderTargetBatch.activeIndices) {
293 auto& viewportBatch = renderTargetBatch.batches[viewportIdx];
295 renderBackend_.beginViewportBatch(viewportBatch.handle);
297 for (auto shaderIdx : viewportBatch.activeIndices ) {
298 auto& shaderBatch = viewportBatch.batches[shaderIdx];
300 renderBackend_.beginShaderBatch(shaderBatch.handle);
302 for (auto materialIdx : shaderBatch.activeIndices) {
303 auto& materialBatch = shaderBatch.batches[materialIdx];
305 renderBackend_.beginMaterialBatch(materialBatch.handle);
307 for (auto meshIdx : materialBatch.activeIndices) {
308 auto& meshBatch = materialBatch.batches[meshIdx];
310 renderBackend_.beginMeshBatch(meshBatch.handle);
312 renderBackend_.template renderBatch<TMemberHandle>(meshBatch.drawContexts);
314 renderBackend_.endMeshBatch(meshBatch.handle);
317 renderBackend_.endMaterialBatch(materialBatch.handle);
320 renderBackend_.endShaderBatch(shaderBatch.handle);
323 renderBackend_.endViewportBatch(viewportBatch.handle);
326 renderBackend_.endRenderTargetBatch(renderTargetBatch.handle);
329 for (auto idx : activeRenderTargetIndices_ ) {
330 renderTargetBatches_[idx].clear();
349 bool submit(RenderSceneCommand<TMemberHandle> renderSceneCommand) noexcept {
352 renderSceneCommand.sceneRenderContext.renderTargetHandle,
353 renderSceneCommand.sceneRenderContext.viewportHandle
369 bool submit(RenderSceneMemberCommand<TMemberHandle> renderCommand) noexcept {
371 auto& sceneMemberRenderContext = std::move(renderCommand.sceneMemberRenderContext);
379 auto& viewportBatch = ensureViewportBatch(renderTargetHandle, viewportHandle);
380 auto& shaderBatch = viewportBatch.getOrAdd(shaderHandle);
381 auto& materialBatch = shaderBatch.getOrAdd(materialHandle);
382 auto& meshBatch = materialBatch.getOrAdd(meshHandle);
384 meshBatch.drawContexts.push_back(std::move(sceneMemberRenderContext));
395 void init(CommandHandlerRegistry& commandHandlerRegistry) noexcept {
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.