diff --git a/Source/Editor/Utilities/ViewportIconsRenderer.cpp b/Source/Editor/Utilities/ViewportIconsRenderer.cpp
index 7687a635a..3be828001 100644
--- a/Source/Editor/Utilities/ViewportIconsRenderer.cpp
+++ b/Source/Editor/Utilities/ViewportIconsRenderer.cpp
@@ -20,6 +20,7 @@
#include "Engine/Audio/AudioListener.h"
#include "Engine/Audio/AudioSource.h"
#include "Engine/Particles/ParticleEffect.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Models/ModelInstanceEntry.h"
#include "Engine/Animations/SceneAnimations/SceneAnimationPlayer.h"
#include "Engine/Engine/EngineService.h"
diff --git a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp
index 18234c7ef..94e823bbe 100644
--- a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp
+++ b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp
@@ -10,7 +10,7 @@
#include "Engine/Serialization/MemoryReadStream.h"
#include "Engine/Audio/AudioClip.h"
#include "Engine/Audio/AudioSource.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Profiler/ProfilerMemory.h"
#include "Engine/Scripting/Scripting.h"
diff --git a/Source/Engine/Content/Assets/Model.cpp b/Source/Engine/Content/Assets/Model.cpp
index 340726644..88322f08b 100644
--- a/Source/Engine/Content/Assets/Model.cpp
+++ b/Source/Engine/Content/Assets/Model.cpp
@@ -8,7 +8,7 @@
#include "Engine/Content/Upgraders/ModelAssetUpgrader.h"
#include "Engine/Content/Factories/BinaryAssetFactory.h"
#include "Engine/Graphics/RenderTools.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Models/ModelInstanceEntry.h"
#include "Engine/Streaming/StreamingGroup.h"
#include "Engine/Debug/Exceptions/ArgumentOutOfRangeException.h"
diff --git a/Source/Engine/Content/Assets/SkinnedModel.cpp b/Source/Engine/Content/Assets/SkinnedModel.cpp
index 7640650bc..f6168ea56 100644
--- a/Source/Engine/Content/Assets/SkinnedModel.cpp
+++ b/Source/Engine/Content/Assets/SkinnedModel.cpp
@@ -8,7 +8,7 @@
#include "Engine/Streaming/StreamingGroup.h"
#include "Engine/Threading/Threading.h"
#include "Engine/Graphics/RenderTools.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Models/Config.h"
#include "Engine/Graphics/Models/MeshDeformation.h"
#include "Engine/Graphics/Models/ModelInstanceEntry.h"
diff --git a/Source/Engine/Debug/DebugDraw.cpp b/Source/Engine/Debug/DebugDraw.cpp
index f496df881..a0c19a28e 100644
--- a/Source/Engine/Debug/DebugDraw.cpp
+++ b/Source/Engine/Debug/DebugDraw.cpp
@@ -15,6 +15,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUPipelineState.h"
#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/DynamicBuffer.h"
diff --git a/Source/Engine/Foliage/Foliage.cpp b/Source/Engine/Foliage/Foliage.cpp
index 98e7126dd..bf9b94b50 100644
--- a/Source/Engine/Foliage/Foliage.cpp
+++ b/Source/Engine/Foliage/Foliage.cpp
@@ -9,7 +9,6 @@
#include "Engine/Core/Collections/BitArray.h"
#include "Engine/Engine/Engine.h"
#include "Engine/Graphics/Graphics.h"
-#include "Engine/Graphics/RenderTask.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Content/Deprecated.h"
@@ -20,6 +19,7 @@
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Profiler/ProfilerMemory.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/GlobalSignDistanceFieldPass.h"
#include "Engine/Renderer/GI/GlobalSurfaceAtlasPass.h"
#include "Engine/Serialization/Serialization.h"
diff --git a/Source/Engine/Graphics/DynamicBuffer.cpp b/Source/Engine/Graphics/DynamicBuffer.cpp
index 1fce4c28e..68f751a97 100644
--- a/Source/Engine/Graphics/DynamicBuffer.cpp
+++ b/Source/Engine/Graphics/DynamicBuffer.cpp
@@ -4,7 +4,7 @@
#include "GPUContext.h"
#include "PixelFormatExtensions.h"
#include "GPUDevice.h"
-#include "RenderTask.h"
+#include "RenderContext.h"
#include "Engine/Core/Log.h"
#include "Engine/Core/Utilities.h"
#include "Engine/Core/Math/Math.h"
diff --git a/Source/Engine/Graphics/GPUBuffer.cpp b/Source/Engine/Graphics/GPUBuffer.cpp
index aafed3961..d3be5587e 100644
--- a/Source/Engine/Graphics/GPUBuffer.cpp
+++ b/Source/Engine/Graphics/GPUBuffer.cpp
@@ -5,7 +5,7 @@
#include "GPUResourceProperty.h"
#include "GPUBufferDescription.h"
#include "PixelFormatExtensions.h"
-#include "RenderTask.h"
+#include "RenderContext.h"
#include "Shaders/GPUVertexLayout.h"
#include "Async/Tasks/GPUCopyResourceTask.h"
#include "Engine/Core/Utilities.h"
diff --git a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
index 7cf9c96d1..727b11888 100644
--- a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
@@ -8,7 +8,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/RenderBuffers.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderView.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Renderer/DrawCall.h"
diff --git a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp
index e7ac1fbdb..819870cdc 100644
--- a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp
@@ -4,15 +4,15 @@
#include "MaterialShaderFeatures.h"
#include "MaterialParams.h"
#include "Engine/Graphics/RenderBuffers.h"
-#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/GPUContext.h"
-#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
-#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/Shaders/GPUShader.h"
-#include "Engine/Graphics/GPULimits.h"
-#include "Engine/Graphics/RenderTask.h"
-#include "Engine/Renderer/DrawCall.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderView.h"
+#include "Engine/Graphics/RenderContext.h"
+#include "Engine/Graphics/GPUContext.h"
+#include "Engine/Graphics/GPUDevice.h"
+#include "Engine/Graphics/GPULimits.h"
+#include "Engine/Graphics/Shaders/GPUShader.h"
+#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
+#include "Engine/Renderer/DrawCall.h"
#if USE_EDITOR
#include "Engine/Renderer/Lightmaps.h"
#endif
diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
index e99964f0c..5a2323aac 100644
--- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
@@ -7,12 +7,12 @@
#include "Engine/Graphics/RenderView.h"
#include "Engine/Renderer/DrawCall.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/GPUContext.h"
-#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/GPULimits.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/Shaders/GPUShader.h"
+#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
PACK_STRUCT(struct DeformableMaterialShaderData {
Matrix WorldMatrix;
diff --git a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp
index 4e3102d9f..eb0f63f1a 100644
--- a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp
@@ -7,7 +7,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPULimits.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Renderer/DrawCall.h"
diff --git a/Source/Engine/Graphics/Materials/MaterialShader.cpp b/Source/Engine/Graphics/Materials/MaterialShader.cpp
index 9391ec8b3..51c6d49fd 100644
--- a/Source/Engine/Graphics/Materials/MaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/MaterialShader.cpp
@@ -2,11 +2,10 @@
#include "MaterialShader.h"
#include "Engine/Core/Log.h"
-#include "Engine/Serialization/MemoryReadStream.h"
#include "Engine/Level/LargeWorlds.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Graphics/Graphics.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
index 2e3ca90b4..8dfb014b3 100644
--- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
+++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
@@ -1,7 +1,7 @@
// Copyright (c) Wojciech Figat. All rights reserved.
#include "MaterialShaderFeatures.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Renderer/RenderList.h"
diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
index e8d187ae1..0c2b1861d 100644
--- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPULimits.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h"
diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
index ee7a41853..6899bad02 100644
--- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
@@ -5,7 +5,7 @@
#include "Engine/Core/Log.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/RenderView.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
index 12a960c9c..25590d9ca 100644
--- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
@@ -9,8 +9,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/RenderBuffers.h"
-#include "Engine/Graphics/RenderTask.h"
-#include "Engine/Graphics/RenderView.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Level/Scene/Lightmap.h"
#include "Engine/Renderer/DrawCall.h"
diff --git a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
index 7caf456fb..3509b5767 100644
--- a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/RenderView.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.h"
diff --git a/Source/Engine/Graphics/Models/Mesh.cpp b/Source/Engine/Graphics/Models/Mesh.cpp
index 28b73a28f..423c7f118 100644
--- a/Source/Engine/Graphics/Models/Mesh.cpp
+++ b/Source/Engine/Graphics/Models/Mesh.cpp
@@ -8,7 +8,7 @@
#include "Engine/Content/Assets/Model.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/Shaders/GPUVertexLayout.h"
#include "Engine/Renderer/RenderList.h"
diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.cpp b/Source/Engine/Graphics/Models/SkinnedMesh.cpp
index 312a74f41..58ab94abd 100644
--- a/Source/Engine/Graphics/Models/SkinnedMesh.cpp
+++ b/Source/Engine/Graphics/Models/SkinnedMesh.cpp
@@ -9,7 +9,7 @@
#include "Engine/Core/Log.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/Shaders/GPUVertexLayout.h"
#include "Engine/Level/Scene/Scene.h"
diff --git a/Source/Engine/Graphics/RenderContext.h b/Source/Engine/Graphics/RenderContext.h
new file mode 100644
index 000000000..2a76d521f
--- /dev/null
+++ b/Source/Engine/Graphics/RenderContext.h
@@ -0,0 +1,106 @@
+// Copyright (c) Wojciech Figat. All rights reserved.
+
+#pragma once
+
+#include "Engine/Core/Collections/Array.h"
+#include "Engine/Platform/CriticalSection.h"
+#include "Engine/Scripting/ScriptingType.h"
+#include "Engine/Renderer/RendererAllocation.h"
+#include "RenderView.h"
+
+class RenderBuffers;
+class RenderList;
+class SceneRenderTask;
+
+///
+/// The high-level renderer context. Used to collect the draw calls for the scene rendering. Can be used to perform a custom rendering.
+///
+API_STRUCT(NoDefault) struct FLAXENGINE_API RenderContext
+{
+ DECLARE_SCRIPTING_TYPE_MINIMAL(RenderContext);
+
+ ///
+ /// The render buffers that contain drawing state (eg. LOD transitions) and scene buffers (eg. GBuffer, DDGI, Shadow Maps).
+ ///
+ API_FIELD() RenderBuffers* Buffers = nullptr;
+
+ ///
+ /// The render list that collects draw calls.
+ ///
+ API_FIELD() RenderList* List = nullptr;
+
+ ///
+ /// The scene rendering task that is a source of renderable objects (optional).
+ ///
+ API_FIELD() SceneRenderTask* Task = nullptr;
+
+ ///
+ /// The proxy render view used to synchronize objects level of detail during rendering (eg. during shadow maps rendering passes). It's optional.
+ ///
+ API_FIELD() RenderView* LodProxyView = nullptr;
+
+ ///
+ /// The render view.
+ ///
+ API_FIELD() RenderView View;
+
+ ///
+ /// The GPU access locking critical section to protect data access when performing multi-threaded rendering.
+ ///
+ static CriticalSection GPULocker;
+
+ RenderContext() = default;
+ RenderContext(SceneRenderTask* task) noexcept;
+};
+
+///
+/// The high-level renderer context batch that encapsulates multiple rendering requests within a single task (eg. optimize main view scene rendering and shadow projections at once).
+///
+API_STRUCT(NoDefault) struct FLAXENGINE_API RenderContextBatch
+{
+ DECLARE_SCRIPTING_TYPE_MINIMAL(RenderContextBatch);
+
+ ///
+ /// The render buffers.
+ ///
+ API_FIELD() RenderBuffers* Buffers = nullptr;
+
+ ///
+ /// The scene rendering task that is a source of renderable objects (optional).
+ ///
+ API_FIELD() SceneRenderTask* Task = nullptr;
+
+ ///
+ /// The all render views collection for the current rendering (main view, shadow projections, etc.).
+ ///
+ API_FIELD() Array Contexts;
+
+ ///
+ /// The Job System labels to wait on, after draw calls collecting.
+ ///
+ API_FIELD() Array> WaitLabels;
+
+ ///
+ /// Enables using async tasks via Job System when performing drawing.
+ ///
+ API_FIELD() bool EnableAsync = true;
+
+ RenderContextBatch() = default;
+ RenderContextBatch(SceneRenderTask* task);
+ RenderContextBatch(const RenderContext& context);
+
+ FORCE_INLINE RenderContext& GetMainContext()
+ {
+ return Contexts.Get()[0];
+ }
+
+ FORCE_INLINE const RenderContext& GetMainContext() const
+ {
+ return Contexts.Get()[0];
+ }
+
+ ///
+ /// Waits for all scheduled async jobs to complete and clears WaitLabels.
+ ///
+ void FlushWaitLabels();
+};
diff --git a/Source/Engine/Graphics/RenderTask.cpp b/Source/Engine/Graphics/RenderTask.cpp
index ee7672b5b..0f6c23a30 100644
--- a/Source/Engine/Graphics/RenderTask.cpp
+++ b/Source/Engine/Graphics/RenderTask.cpp
@@ -2,6 +2,7 @@
#include "RenderTask.h"
#include "RenderBuffers.h"
+#include "RenderContext.h"
#include "GPUDevice.h"
#include "GPUSwapChain.h"
#include "PostProcessEffect.h"
diff --git a/Source/Engine/Graphics/RenderTask.h b/Source/Engine/Graphics/RenderTask.h
index bf912f7c8..73daf937e 100644
--- a/Source/Engine/Graphics/RenderTask.h
+++ b/Source/Engine/Graphics/RenderTask.h
@@ -8,7 +8,6 @@
#include "Engine/Platform/CriticalSection.h"
#include "Engine/Scripting/ScriptingObjectReference.h"
#include "Engine/Scripting/ScriptingType.h"
-#include "Engine/Renderer/RendererAllocation.h"
#include "RenderView.h"
class GPUDevice;
@@ -464,96 +463,3 @@ public:
// [SceneRenderTask]
void OnBegin(GPUContext* context) override;
};
-
-///
-/// The high-level renderer context. Used to collect the draw calls for the scene rendering. Can be used to perform a custom rendering.
-///
-API_STRUCT(NoDefault) struct FLAXENGINE_API RenderContext
-{
- DECLARE_SCRIPTING_TYPE_MINIMAL(RenderContext);
-
- ///
- /// The render buffers that contain drawing state (eg. LOD transitions) and scene buffers (eg. GBuffer, DDGI, Shadow Maps).
- ///
- API_FIELD() RenderBuffers* Buffers = nullptr;
-
- ///
- /// The render list that collects draw calls.
- ///
- API_FIELD() RenderList* List = nullptr;
-
- ///
- /// The scene rendering task that is a source of renderable objects (optional).
- ///
- API_FIELD() SceneRenderTask* Task = nullptr;
-
- ///
- /// The proxy render view used to synchronize objects level of detail during rendering (eg. during shadow maps rendering passes). It's optional.
- ///
- API_FIELD() RenderView* LodProxyView = nullptr;
-
- ///
- /// The render view.
- ///
- API_FIELD() RenderView View;
-
- ///
- /// The GPU access locking critical section to protect data access when performing multi-threaded rendering.
- ///
- static CriticalSection GPULocker;
-
- RenderContext() = default;
- RenderContext(SceneRenderTask* task) noexcept;
-};
-
-///
-/// The high-level renderer context batch that encapsulates multiple rendering requests within a single task (eg. optimize main view scene rendering and shadow projections at once).
-///
-API_STRUCT(NoDefault) struct FLAXENGINE_API RenderContextBatch
-{
- DECLARE_SCRIPTING_TYPE_MINIMAL(RenderContextBatch);
-
- ///
- /// The render buffers.
- ///
- API_FIELD() RenderBuffers* Buffers = nullptr;
-
- ///
- /// The scene rendering task that is a source of renderable objects (optional).
- ///
- API_FIELD() SceneRenderTask* Task = nullptr;
-
- ///
- /// The all render views collection for the current rendering (main view, shadow projections, etc.).
- ///
- API_FIELD() Array Contexts;
-
- ///
- /// The Job System labels to wait on, after draw calls collecting.
- ///
- API_FIELD() Array> WaitLabels;
-
- ///
- /// Enables using async tasks via Job System when performing drawing.
- ///
- API_FIELD() bool EnableAsync = true;
-
- RenderContextBatch() = default;
- RenderContextBatch(SceneRenderTask* task);
- RenderContextBatch(const RenderContext& context);
-
- FORCE_INLINE RenderContext& GetMainContext()
- {
- return Contexts.Get()[0];
- }
-
- FORCE_INLINE const RenderContext& GetMainContext() const
- {
- return Contexts.Get()[0];
- }
-
- ///
- /// Waits for all scheduled async jobs to complete and clears WaitLabels.
- ///
- void FlushWaitLabels();
-};
diff --git a/Source/Engine/Graphics/RenderTools.cpp b/Source/Engine/Graphics/RenderTools.cpp
index e68fb05e4..a1dd8e35f 100644
--- a/Source/Engine/Graphics/RenderTools.cpp
+++ b/Source/Engine/Graphics/RenderTools.cpp
@@ -6,7 +6,7 @@
#include "PixelFormat.h"
#include "RenderView.h"
#include "GPUDevice.h"
-#include "RenderTask.h"
+#include "RenderContext.h"
#include "Engine/Content/Assets/Model.h"
#include "Engine/Content/Assets/SkinnedModel.h"
#include "Engine/Core/Math/Packed.h"
diff --git a/Source/Engine/Graphics/RenderView.cpp b/Source/Engine/Graphics/RenderView.cpp
index 3f0db28b5..7bf939064 100644
--- a/Source/Engine/Graphics/RenderView.cpp
+++ b/Source/Engine/Graphics/RenderView.cpp
@@ -6,8 +6,8 @@
#include "Engine/Core/Math/Double4x4.h"
#include "Engine/Renderer/RenderList.h"
#include "RenderBuffers.h"
-#include "RenderTask.h"
#include "RenderTools.h"
+#include "RenderContext.h"
void RenderView::Prepare(RenderContext& renderContext)
{
diff --git a/Source/Engine/Level/Actor.cpp b/Source/Engine/Level/Actor.cpp
index 8ce79fea4..d22a10f99 100644
--- a/Source/Engine/Level/Actor.cpp
+++ b/Source/Engine/Level/Actor.cpp
@@ -19,7 +19,7 @@
#include "Engine/Core/Collections/CollectionPoolCache.h"
#include "Engine/Core/Math/Double4x4.h"
#include "Engine/Debug/Exceptions/JsonParseException.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Physics/Physics.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Profiler/ProfilerMemory.h"
diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp
index c17d883af..b07ed19e2 100644
--- a/Source/Engine/Level/Actors/AnimatedModel.cpp
+++ b/Source/Engine/Level/Actors/AnimatedModel.cpp
@@ -15,7 +15,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUPass.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/Models/MeshAccessor.h"
#include "Engine/Graphics/Models/MeshDeformation.h"
diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp
index 6e3c939fe..e6a08cba7 100644
--- a/Source/Engine/Level/Actors/Camera.cpp
+++ b/Source/Engine/Level/Actors/Camera.cpp
@@ -12,7 +12,7 @@
#include "Editor/Editor.h"
#include "Editor/Managed/ManagedEditor.h"
#include "Engine/Renderer/DrawCall.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Level/Scene/SceneRendering.h"
#else
#include "Engine/Engine/Engine.h"
diff --git a/Source/Engine/Level/Actors/Decal.cpp b/Source/Engine/Level/Actors/Decal.cpp
index 78066133c..1a9e94fb6 100644
--- a/Source/Engine/Level/Actors/Decal.cpp
+++ b/Source/Engine/Level/Actors/Decal.cpp
@@ -6,7 +6,7 @@
#include "Engine/Renderer/RenderList.h"
#include "Engine/Level/Scene/SceneRendering.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
Decal::Decal(const SpawnParams& params)
diff --git a/Source/Engine/Level/Actors/DirectionalLight.cpp b/Source/Engine/Level/Actors/DirectionalLight.cpp
index e8e895950..e80182d5d 100644
--- a/Source/Engine/Level/Actors/DirectionalLight.cpp
+++ b/Source/Engine/Level/Actors/DirectionalLight.cpp
@@ -2,7 +2,7 @@
#include "DirectionalLight.h"
#include "Engine/Graphics/RenderTask.h"
-#include "Engine/Graphics/RenderView.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Serialization/Serialization.h"
#include "Engine/Level/Scene/SceneRendering.h"
diff --git a/Source/Engine/Level/Actors/EnvironmentProbe.cpp b/Source/Engine/Level/Actors/EnvironmentProbe.cpp
index ee4242811..53a16caeb 100644
--- a/Source/Engine/Level/Actors/EnvironmentProbe.cpp
+++ b/Source/Engine/Level/Actors/EnvironmentProbe.cpp
@@ -8,6 +8,7 @@
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Graphics/Textures/TextureData.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/ProbesRenderer.h"
#include "Engine/Renderer/ReflectionsPass.h"
#include "Engine/Content/Content.h"
diff --git a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp
index a8d99a2f1..b8dff5f67 100644
--- a/Source/Engine/Level/Actors/ExponentialHeightFog.cpp
+++ b/Source/Engine/Level/Actors/ExponentialHeightFog.cpp
@@ -8,7 +8,7 @@
#include "Engine/Renderer/RenderList.h"
#include "Engine/Serialization/Serialization.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Renderer/GBufferPass.h"
diff --git a/Source/Engine/Level/Actors/PointLight.cpp b/Source/Engine/Level/Actors/PointLight.cpp
index c30d47c08..fd18ed700 100644
--- a/Source/Engine/Level/Actors/PointLight.cpp
+++ b/Source/Engine/Level/Actors/PointLight.cpp
@@ -4,6 +4,7 @@
#include "Engine/Content/Deprecated.h"
#include "Engine/Graphics/RenderTask.h"
#include "Engine/Graphics/RenderTools.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderView.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Serialization/Serialization.h"
diff --git a/Source/Engine/Level/Actors/PostFxVolume.cpp b/Source/Engine/Level/Actors/PostFxVolume.cpp
index fb1c236c8..dd7a982c4 100644
--- a/Source/Engine/Level/Actors/PostFxVolume.cpp
+++ b/Source/Engine/Level/Actors/PostFxVolume.cpp
@@ -4,6 +4,7 @@
#include "Engine/Graphics/RenderTask.h"
#include "Engine/Serialization/Serialization.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Level/Scene/SceneRendering.h"
PostFxVolume::PostFxVolume(const SpawnParams& params)
diff --git a/Source/Engine/Level/Actors/Sky.cpp b/Source/Engine/Level/Actors/Sky.cpp
index e4cc0ab18..7b7e1f57b 100644
--- a/Source/Engine/Level/Actors/Sky.cpp
+++ b/Source/Engine/Level/Actors/Sky.cpp
@@ -9,7 +9,7 @@
#include "Engine/Renderer/GBufferPass.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
diff --git a/Source/Engine/Level/Actors/SkyLight.cpp b/Source/Engine/Level/Actors/SkyLight.cpp
index 7b363a675..697a58cfa 100644
--- a/Source/Engine/Level/Actors/SkyLight.cpp
+++ b/Source/Engine/Level/Actors/SkyLight.cpp
@@ -11,6 +11,7 @@
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Graphics/Textures/TextureData.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/ProbesRenderer.h"
#include "Engine/Renderer/GBufferPass.h"
#include "Engine/Content/Content.h"
diff --git a/Source/Engine/Level/Actors/Skybox.cpp b/Source/Engine/Level/Actors/Skybox.cpp
index dbda65d3f..24e3fd2f6 100644
--- a/Source/Engine/Level/Actors/Skybox.cpp
+++ b/Source/Engine/Level/Actors/Skybox.cpp
@@ -6,7 +6,7 @@
#include "Engine/Renderer/RenderList.h"
#include "Engine/Serialization/Serialization.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Level/Scene/SceneRendering.h"
#include "Engine/Content/Assets/Material.h"
diff --git a/Source/Engine/Level/Actors/SplineModel.cpp b/Source/Engine/Level/Actors/SplineModel.cpp
index 5352bf56d..2e7e8d4fa 100644
--- a/Source/Engine/Level/Actors/SplineModel.cpp
+++ b/Source/Engine/Level/Actors/SplineModel.cpp
@@ -11,7 +11,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUBuffer.h"
#include "Engine/Graphics/GPUContext.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Level/Scene/SceneRendering.h"
#include "Engine/Profiler/ProfilerCPU.h"
diff --git a/Source/Engine/Level/Actors/SpotLight.cpp b/Source/Engine/Level/Actors/SpotLight.cpp
index 0809b0b7b..4617c5a76 100644
--- a/Source/Engine/Level/Actors/SpotLight.cpp
+++ b/Source/Engine/Level/Actors/SpotLight.cpp
@@ -6,7 +6,7 @@
#include "Engine/Graphics/RenderView.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Content/Assets/IESProfile.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Serialization/Serialization.h"
#include "Engine/Level/Scene/SceneRendering.h"
diff --git a/Source/Engine/Level/Actors/StaticModel.cpp b/Source/Engine/Level/Actors/StaticModel.cpp
index a75d7b916..48f08544c 100644
--- a/Source/Engine/Level/Actors/StaticModel.cpp
+++ b/Source/Engine/Level/Actors/StaticModel.cpp
@@ -9,7 +9,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/RenderBuffers.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Models/MeshDeformation.h"
#include "Engine/Graphics/Shaders/GPUVertexLayout.h"
#include "Engine/Serialization/Serialization.h"
diff --git a/Source/Engine/Level/Scene/SceneRendering.cpp b/Source/Engine/Level/Scene/SceneRendering.cpp
index caf987bbb..2a58155ba 100644
--- a/Source/Engine/Level/Scene/SceneRendering.cpp
+++ b/Source/Engine/Level/Scene/SceneRendering.cpp
@@ -4,7 +4,7 @@
#define SCENE_RENDERING_USE_PROFILER_PER_ACTOR 0
#include "SceneRendering.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderView.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Graphics/RenderBuffers.h"
diff --git a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp
index 739a8ef8d..7eea5f5a0 100644
--- a/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp
+++ b/Source/Engine/Particles/Graph/CPU/ParticleEmitterGraph.CPU.cpp
@@ -4,6 +4,7 @@
#include "Engine/Core/Collections/Sorting.h"
#include "Engine/Content/Assets/Model.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Particles/ParticleEffect.h"
#include "Engine/Engine/Time.h"
#include "Engine/Profiler/ProfilerCPU.h"
diff --git a/Source/Engine/Particles/ParticleEffect.cpp b/Source/Engine/Particles/ParticleEffect.cpp
index e0fc7ceb9..af1cf8098 100644
--- a/Source/Engine/Particles/ParticleEffect.cpp
+++ b/Source/Engine/Particles/ParticleEffect.cpp
@@ -10,6 +10,7 @@
#include "Engine/Level/Scene/Scene.h"
#include "Engine/Engine/Time.h"
#include "Engine/Engine/Engine.h"
+#include "Engine/Graphics/RenderContext.h"
#if USE_EDITOR
#include "Editor/Editor.h"
#include "Editor/Managed/ManagedEditor.h"
diff --git a/Source/Engine/Particles/Particles.cpp b/Source/Engine/Particles/Particles.cpp
index e9558ec4e..d70d1a570 100644
--- a/Source/Engine/Particles/Particles.cpp
+++ b/Source/Engine/Particles/Particles.cpp
@@ -14,6 +14,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/RenderTools.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUVertexLayout.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Profiler/ProfilerMemory.h"
diff --git a/Source/Engine/Physics/Actors/Cloth.cpp b/Source/Engine/Physics/Actors/Cloth.cpp
index 3e0eb42d4..b60fe38f7 100644
--- a/Source/Engine/Physics/Actors/Cloth.cpp
+++ b/Source/Engine/Physics/Actors/Cloth.cpp
@@ -3,7 +3,7 @@
#include "Cloth.h"
#include "Engine/Core/Log.h"
#include "Engine/Core/Math/Ray.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/Models/MeshAccessor.h"
#include "Engine/Graphics/Models/MeshBase.h"
diff --git a/Source/Engine/Renderer/AmbientOcclusionPass.cpp b/Source/Engine/Renderer/AmbientOcclusionPass.cpp
index 9622b7f81..7816e6baf 100644
--- a/Source/Engine/Renderer/AmbientOcclusionPass.cpp
+++ b/Source/Engine/Renderer/AmbientOcclusionPass.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
diff --git a/Source/Engine/Renderer/AntiAliasing/FXAA.cpp b/Source/Engine/Renderer/AntiAliasing/FXAA.cpp
index 8023c51b2..a6ad556d9 100644
--- a/Source/Engine/Renderer/AntiAliasing/FXAA.cpp
+++ b/Source/Engine/Renderer/AntiAliasing/FXAA.cpp
@@ -6,7 +6,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Graphics.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
GPU_CB_STRUCT(Data {
Float4 ScreenSize;
diff --git a/Source/Engine/Renderer/AntiAliasing/SMAA.cpp b/Source/Engine/Renderer/AntiAliasing/SMAA.cpp
index 4185cfab1..f53b2d943 100644
--- a/Source/Engine/Renderer/AntiAliasing/SMAA.cpp
+++ b/Source/Engine/Renderer/AntiAliasing/SMAA.cpp
@@ -6,7 +6,7 @@
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
bool SMAA::setupResources()
{
diff --git a/Source/Engine/Renderer/AntiAliasing/TAA.cpp b/Source/Engine/Renderer/AntiAliasing/TAA.cpp
index d404a6ea0..cda294886 100644
--- a/Source/Engine/Renderer/AntiAliasing/TAA.cpp
+++ b/Source/Engine/Renderer/AntiAliasing/TAA.cpp
@@ -7,6 +7,7 @@
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Renderer/RenderList.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/GBufferPass.h"
#include "Engine/Engine/Engine.h"
#include "Engine/Graphics/Graphics.h"
diff --git a/Source/Engine/Renderer/ColorGradingPass.cpp b/Source/Engine/Renderer/ColorGradingPass.cpp
index 684fcf805..83cc73e58 100644
--- a/Source/Engine/Renderer/ColorGradingPass.cpp
+++ b/Source/Engine/Renderer/ColorGradingPass.cpp
@@ -9,7 +9,7 @@
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/RenderTargetPool.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
GPU_CB_STRUCT(Data {
diff --git a/Source/Engine/Renderer/ContrastAdaptiveSharpeningPass.cpp b/Source/Engine/Renderer/ContrastAdaptiveSharpeningPass.cpp
index 958a55725..ab157f13f 100644
--- a/Source/Engine/Renderer/ContrastAdaptiveSharpeningPass.cpp
+++ b/Source/Engine/Renderer/ContrastAdaptiveSharpeningPass.cpp
@@ -7,7 +7,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/RenderTargetPool.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
GPU_CB_STRUCT(Data {
diff --git a/Source/Engine/Renderer/DepthOfFieldPass.cpp b/Source/Engine/Renderer/DepthOfFieldPass.cpp
index 25bd37539..6dc7c9cc2 100644
--- a/Source/Engine/Renderer/DepthOfFieldPass.cpp
+++ b/Source/Engine/Renderer/DepthOfFieldPass.cpp
@@ -11,7 +11,7 @@
#include "Engine/Graphics/GPULimits.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
// This must match hlsl defines
diff --git a/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp b/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp
index 51833287e..9c80f0a21 100644
--- a/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp
+++ b/Source/Engine/Renderer/Editor/LightmapUVsDensity.cpp
@@ -12,7 +12,7 @@
#include "Engine/Graphics/GPUPipelineState.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/DrawCall.h"
#include "Engine/Foliage/Foliage.h"
#include "Engine/ShadowsOfMordor/Builder.Config.h"
diff --git a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp
index c6834caa7..d9844718b 100644
--- a/Source/Engine/Renderer/Editor/MaterialComplexity.cpp
+++ b/Source/Engine/Renderer/Editor/MaterialComplexity.cpp
@@ -14,8 +14,8 @@
#include "Engine/Graphics/GPUPipelineState.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Textures/GPUTexture.h"
-#include "Engine/Graphics/RenderTask.h"
#include "Engine/Graphics/RenderBuffers.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/DrawCall.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Renderer/Lightmaps.h"
diff --git a/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp b/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp
index 61bc0e9f3..c08fc6d0e 100644
--- a/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp
+++ b/Source/Engine/Renderer/Editor/QuadOverdrawPass.cpp
@@ -11,7 +11,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Renderer/RenderList.h"
diff --git a/Source/Engine/Renderer/Editor/VertexColors.cpp b/Source/Engine/Renderer/Editor/VertexColors.cpp
index 2b4203a6f..fb870b386 100644
--- a/Source/Engine/Renderer/Editor/VertexColors.cpp
+++ b/Source/Engine/Renderer/Editor/VertexColors.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/GPUPipelineState.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Renderer/DrawCall.h"
#include "Engine/Renderer/RendererPass.h"
diff --git a/Source/Engine/Renderer/EyeAdaptationPass.cpp b/Source/Engine/Renderer/EyeAdaptationPass.cpp
index 43e757e2b..6a9abecd7 100644
--- a/Source/Engine/Renderer/EyeAdaptationPass.cpp
+++ b/Source/Engine/Renderer/EyeAdaptationPass.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPULimits.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Engine/Engine.h"
diff --git a/Source/Engine/Renderer/ForwardPass.cpp b/Source/Engine/Renderer/ForwardPass.cpp
index 275bb5c73..e82822fc6 100644
--- a/Source/Engine/Renderer/ForwardPass.cpp
+++ b/Source/Engine/Renderer/ForwardPass.cpp
@@ -10,7 +10,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
ForwardPass::ForwardPass()
diff --git a/Source/Engine/Renderer/GBufferPass.cpp b/Source/Engine/Renderer/GBufferPass.cpp
index 8bba190d3..fc2726eab 100644
--- a/Source/Engine/Renderer/GBufferPass.cpp
+++ b/Source/Engine/Renderer/GBufferPass.cpp
@@ -14,6 +14,7 @@
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/Graphics.h"
diff --git a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp
index 9dfa1bb0a..58ddd4f20 100644
--- a/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp
+++ b/Source/Engine/Renderer/GI/DynamicDiffuseGlobalIllumination.cpp
@@ -23,6 +23,7 @@
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderTools.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Level/Actors/BrushMode.h"
#include "Engine/Renderer/GBufferPass.h"
diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp
index 48bb9959c..9b44b9cc7 100644
--- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp
+++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp
@@ -18,6 +18,7 @@
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/Async/GPUSyncPoint.h"
diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp
index 686cd732a..52bde969b 100644
--- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp
+++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp
@@ -14,7 +14,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPUPass.h"
#include "Engine/Graphics/Graphics.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderTools.h"
diff --git a/Source/Engine/Renderer/LightPass.cpp b/Source/Engine/Renderer/LightPass.cpp
index 01094e5fa..9829adfd9 100644
--- a/Source/Engine/Renderer/LightPass.cpp
+++ b/Source/Engine/Renderer/LightPass.cpp
@@ -6,7 +6,7 @@
#include "Engine/Core/Collections/Sorting.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTools.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/GPULimits.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
diff --git a/Source/Engine/Renderer/MotionBlurPass.cpp b/Source/Engine/Renderer/MotionBlurPass.cpp
index 51cc36c8f..4542cbcbb 100644
--- a/Source/Engine/Renderer/MotionBlurPass.cpp
+++ b/Source/Engine/Renderer/MotionBlurPass.cpp
@@ -13,7 +13,7 @@
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/PostProcessSettings.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Engine/Time.h"
diff --git a/Source/Engine/Renderer/PostProcessingPass.cpp b/Source/Engine/Renderer/PostProcessingPass.cpp
index e77556849..9c505ea42 100644
--- a/Source/Engine/Renderer/PostProcessingPass.cpp
+++ b/Source/Engine/Renderer/PostProcessingPass.cpp
@@ -7,6 +7,7 @@
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/RenderTools.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Engine/Time.h"
#include "Engine/Graphics/GPUPass.h"
diff --git a/Source/Engine/Renderer/ProbesRenderer.cpp b/Source/Engine/Renderer/ProbesRenderer.cpp
index 8318ddfe5..38c4f598b 100644
--- a/Source/Engine/Renderer/ProbesRenderer.cpp
+++ b/Source/Engine/Renderer/ProbesRenderer.cpp
@@ -23,7 +23,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Graphics/Textures/TextureData.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Scripting/ScriptingObjectReference.h"
#include "Engine/Tools/TextureTool/TextureTool.h"
#include "Engine/Threading/ThreadPoolTask.h"
diff --git a/Source/Engine/Renderer/ReflectionsPass.cpp b/Source/Engine/Renderer/ReflectionsPass.cpp
index f2a2892d6..3be23544c 100644
--- a/Source/Engine/Renderer/ReflectionsPass.cpp
+++ b/Source/Engine/Renderer/ReflectionsPass.cpp
@@ -11,7 +11,7 @@
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTools.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Level/Actors/EnvironmentProbe.h"
diff --git a/Source/Engine/Renderer/RenderList.cpp b/Source/Engine/Renderer/RenderList.cpp
index 3d753cb25..4b68a8662 100644
--- a/Source/Engine/Renderer/RenderList.cpp
+++ b/Source/Engine/Renderer/RenderList.cpp
@@ -6,7 +6,7 @@
#include "Engine/Core/Collections/Sorting.h"
#include "Engine/Graphics/Materials/IMaterial.h"
#include "Engine/Graphics/Materials/MaterialShader.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/GPULimits.h"
diff --git a/Source/Engine/Renderer/RenderSetup.h b/Source/Engine/Renderer/RenderSetup.h
index 1838f5bbd..bba7738b5 100644
--- a/Source/Engine/Renderer/RenderSetup.h
+++ b/Source/Engine/Renderer/RenderSetup.h
@@ -10,6 +10,7 @@
struct FLAXENGINE_API RenderSetup
{
RenderingUpscaleLocation UpscaleLocation = RenderingUpscaleLocation::DuringAntiAliasing;
+ float RenderScale = 1.0f;
bool UseShadows = false;
bool UseMotionVectors = false;
bool UseTemporalAAJitter = false;
diff --git a/Source/Engine/Renderer/Renderer.cpp b/Source/Engine/Renderer/Renderer.cpp
index 983a07fd8..7b3f64727 100644
--- a/Source/Engine/Renderer/Renderer.cpp
+++ b/Source/Engine/Renderer/Renderer.cpp
@@ -6,6 +6,7 @@
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/PostProcessEffect.h"
#include "Engine/Engine/EngineService.h"
#include "GBufferPass.h"
@@ -71,7 +72,7 @@ public:
RendererService RendererServiceInstance;
-void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderContextBatch& renderContextBatch);
+void RenderInner(RenderContext& renderContext, RenderContextBatch& renderContextBatch);
bool RendererService::Init()
{
@@ -181,7 +182,7 @@ void RenderAntiAliasingPass(RenderContext& renderContext, GPUTexture* input, GPU
}
}
-void RenderLightBuffer(const SceneRenderTask* task, GPUContext* context, RenderContext& renderContext, GPUTexture* lightBuffer, const GPUTextureDescription& tempDesc)
+void RenderLightBuffer(GPUContext* context, RenderContext& renderContext, GPUTexture* lightBuffer, const GPUTextureDescription& tempDesc)
{
context->ResetRenderTarget();
auto colorGradingLUT = ColorGradingPass::Instance()->RenderLUT(renderContext);
@@ -196,8 +197,8 @@ void RenderLightBuffer(const SceneRenderTask* task, GPUContext* context, RenderC
Swap(lightBuffer, tempBuffer);
}
RenderTargetPool::Release(lightBuffer);
- context->SetRenderTarget(task->GetOutputView());
- context->SetViewportAndScissors(task->GetOutputViewport());
+ context->SetRenderTarget(renderContext.Task->GetOutputView());
+ context->SetViewportAndScissors(renderContext.Task->GetOutputViewport());
context->Draw(tempBuffer);
RenderTargetPool::Release(tempBuffer);
}
@@ -278,7 +279,7 @@ void Renderer::Render(SceneRenderTask* task)
// Perform the actual rendering
task->OnPreRender(context, renderContext);
- RenderInner(task, renderContext, renderContextBatch);
+ RenderInner(renderContext, renderContextBatch);
task->OnPostRender(context, renderContext);
#if USE_EDITOR
@@ -362,216 +363,233 @@ void Renderer::DrawActors(RenderContext& renderContext, const Array& cus
}
}
-void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderContextBatch& renderContextBatch)
+static void Setup(GPUContext* context, RenderContext& renderContext)
{
- auto context = GPUDevice::Instance->GetMainContext();
+ PROFILE_CPU_NAMED("Setup");
auto* graphicsSettings = GraphicsSettings::Get();
- auto& view = renderContext.View;
- ASSERT(renderContext.Buffers && renderContext.Buffers->GetWidth() > 0);
+ const bool isGBufferDebug = GBufferPass::IsDebugView(renderContext.View.Mode);
+ const int32 screenWidth = renderContext.Buffers->GetWidth();
+ const int32 screenHeight = renderContext.Buffers->GetHeight();
// Perform postFx volumes blending and query before rendering
- task->CollectPostFxVolumes(renderContext);
+ renderContext.Task->CollectPostFxVolumes(renderContext);
renderContext.List->BlendSettings();
{
auto aaMode = EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::AntiAliasing) ? renderContext.List->Settings.AntiAliasing.Mode : AntialiasingMode::None;
- if (aaMode == AntialiasingMode::TemporalAntialiasing && view.IsOrthographicProjection())
+ if (aaMode == AntialiasingMode::TemporalAntialiasing && renderContext.View.IsOrthographicProjection())
aaMode = AntialiasingMode::None; // TODO: support TAA in ortho projection (see RenderView::Prepare to jitter projection matrix better)
renderContext.List->Settings.AntiAliasing.Mode = aaMode;
}
- // Initialize setup
+ // Initialize render setup
RenderSetup& setup = renderContext.List->Setup;
- const bool isGBufferDebug = GBufferPass::IsDebugView(renderContext.View.Mode);
+ setup.UpscaleLocation = renderContext.Task->UpscaleLocation;
+ if (setup.UpscaleLocation == RenderingUpscaleLocation::DuringAntiAliasing && renderContext.List->Settings.AntiAliasing.Mode != AntialiasingMode::TemporalAntialiasing)
+ setup.UpscaleLocation = RenderingUpscaleLocation::AfterAntiAliasing; // Fall-back when AA doesn't support uplscaling
+PRAGMA_DISABLE_DEPRECATION_WARNINGS
+ setup.RenderScale = renderContext.Task->RenderingPercentage * renderContext.Task->RenderScale;
+PRAGMA_ENABLE_DEPRECATION_WARNINGS
+ setup.UseShadows = !isGBufferDebug && EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::Shadows) && ShadowsPass::Instance()->IsReady();
+ switch (renderContext.View.Mode)
{
- PROFILE_CPU_NAMED("Setup");
- const int32 screenWidth = renderContext.Buffers->GetWidth();
- const int32 screenHeight = renderContext.Buffers->GetHeight();
- setup.UpscaleLocation = renderContext.Task->UpscaleLocation;
- if (setup.UpscaleLocation == RenderingUpscaleLocation::DuringAntiAliasing && renderContext.List->Settings.AntiAliasing.Mode != AntialiasingMode::TemporalAntialiasing)
- setup.UpscaleLocation = RenderingUpscaleLocation::AfterAntiAliasing; // Fall-back when AA doesn't support uplscaling
- setup.UseShadows = !isGBufferDebug && EnumHasAnyFlags(view.Flags, ViewFlags::Shadows) && ShadowsPass::Instance()->IsReady();
- switch (renderContext.View.Mode)
- {
- case ViewMode::QuadOverdraw:
- case ViewMode::Emissive:
- case ViewMode::LightmapUVsDensity:
- case ViewMode::GlobalSurfaceAtlas:
- case ViewMode::GlobalSDF:
- case ViewMode::GlobalSDFOverdraw:
- case ViewMode::MaterialComplexity:
- case ViewMode::VertexColors:
- case ViewMode::LightOverlap:
- setup.UseShadows = false;
- break;
- }
- if (screenWidth < 16 || screenHeight < 16 || renderContext.Task->IsCameraCut || isGBufferDebug || renderContext.View.Mode == ViewMode::NoPostFx)
- setup.UseMotionVectors = false;
- else
- {
- const MotionBlurSettings& motionBlurSettings = renderContext.List->Settings.MotionBlur;
- const ScreenSpaceReflectionsSettings ssrSettings = renderContext.List->Settings.ScreenSpaceReflections;
- setup.UseMotionVectors =
- (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::MotionBlur) && motionBlurSettings.Enabled && motionBlurSettings.Scale > ZeroTolerance) ||
- renderContext.View.Mode == ViewMode::MotionVectors ||
- (ssrSettings.Intensity > ZeroTolerance && ssrSettings.TemporalEffect && EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::SSR)) ||
- renderContext.List->Settings.AntiAliasing.Mode == AntialiasingMode::TemporalAntialiasing;
- }
- setup.UseTemporalAAJitter = renderContext.List->Settings.AntiAliasing.Mode == AntialiasingMode::TemporalAntialiasing;
- setup.UseGlobalSurfaceAtlas = renderContext.View.Mode == ViewMode::GlobalSurfaceAtlas ||
- (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::Reflections) && renderContext.List->Settings.GlobalIllumination.Reflections == ReflectionsMode::DDGI) ||
- (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::GI) && renderContext.List->Settings.GlobalIllumination.Mode == GlobalIlluminationMode::DDGI);
- setup.UseGlobalSDF = (graphicsSettings->EnableGlobalSDF && EnumHasAnyFlags(view.Flags, ViewFlags::GlobalSDF)) ||
- renderContext.View.Mode == ViewMode::GlobalSDF ||
- renderContext.View.Mode == ViewMode::GlobalSDFOverdraw ||
- setup.UseGlobalSurfaceAtlas;
- setup.UseVolumetricFog = (view.Flags & ViewFlags::Fog) != ViewFlags::None;
-
- // Disable TAA jitter in debug modes
- switch (renderContext.View.Mode)
- {
- case ViewMode::Unlit:
- case ViewMode::Diffuse:
- case ViewMode::Normals:
- case ViewMode::Depth:
- case ViewMode::Emissive:
- case ViewMode::AmbientOcclusion:
- case ViewMode::Metalness:
- case ViewMode::Roughness:
- case ViewMode::Specular:
- case ViewMode::SpecularColor:
- case ViewMode::SubsurfaceColor:
- case ViewMode::ShadingModel:
- case ViewMode::GlobalSDF:
- case ViewMode::GlobalSDFOverdraw:
- case ViewMode::GlobalSurfaceAtlas:
- case ViewMode::LightmapUVsDensity:
- case ViewMode::MaterialComplexity:
- case ViewMode::Wireframe:
- case ViewMode::NoPostFx:
- case ViewMode::VertexColors:
- case ViewMode::QuadOverdraw:
- case ViewMode::LightOverlap:
- setup.UseTemporalAAJitter = false;
- break;
- }
-
- // Customize setup (by postfx or custom gameplay effects)
- renderContext.Task->SetupRender(renderContext);
- for (PostProcessEffect* e : renderContext.List->PostFx)
- e->PreRender(context, renderContext);
+ case ViewMode::QuadOverdraw:
+ case ViewMode::Emissive:
+ case ViewMode::LightmapUVsDensity:
+ case ViewMode::GlobalSurfaceAtlas:
+ case ViewMode::GlobalSDF:
+ case ViewMode::GlobalSDFOverdraw:
+ case ViewMode::MaterialComplexity:
+ case ViewMode::VertexColors:
+ case ViewMode::LightOverlap:
+ setup.UseShadows = false;
+ break;
}
+ if (screenWidth < 16 || screenHeight < 16 || renderContext.Task->IsCameraCut || isGBufferDebug || renderContext.View.Mode == ViewMode::NoPostFx)
+ setup.UseMotionVectors = false;
+ else
+ {
+ const MotionBlurSettings& motionBlurSettings = renderContext.List->Settings.MotionBlur;
+ const ScreenSpaceReflectionsSettings ssrSettings = renderContext.List->Settings.ScreenSpaceReflections;
+ setup.UseMotionVectors =
+ (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::MotionBlur) && motionBlurSettings.Enabled && motionBlurSettings.Scale > ZeroTolerance) ||
+ renderContext.View.Mode == ViewMode::MotionVectors ||
+ (ssrSettings.Intensity > ZeroTolerance && ssrSettings.TemporalEffect && EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::SSR)) ||
+ renderContext.List->Settings.AntiAliasing.Mode == AntialiasingMode::TemporalAntialiasing;
+ }
+ setup.UseTemporalAAJitter = renderContext.List->Settings.AntiAliasing.Mode == AntialiasingMode::TemporalAntialiasing;
+ setup.UseGlobalSurfaceAtlas = renderContext.View.Mode == ViewMode::GlobalSurfaceAtlas ||
+ (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::Reflections) && renderContext.List->Settings.GlobalIllumination.Reflections == ReflectionsMode::DDGI) ||
+ (EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::GI) && renderContext.List->Settings.GlobalIllumination.Mode == GlobalIlluminationMode::DDGI);
+ setup.UseGlobalSDF = (graphicsSettings->EnableGlobalSDF && EnumHasAnyFlags(renderContext.View.Flags, ViewFlags::GlobalSDF)) ||
+ renderContext.View.Mode == ViewMode::GlobalSDF ||
+ renderContext.View.Mode == ViewMode::GlobalSDFOverdraw ||
+ setup.UseGlobalSurfaceAtlas;
+ setup.UseVolumetricFog = (renderContext.View.Flags & ViewFlags::Fog) != ViewFlags::None;
+
+ // Disable TAA jitter in debug modes
+ switch (renderContext.View.Mode)
+ {
+ case ViewMode::Unlit:
+ case ViewMode::Diffuse:
+ case ViewMode::Normals:
+ case ViewMode::Depth:
+ case ViewMode::Emissive:
+ case ViewMode::AmbientOcclusion:
+ case ViewMode::Metalness:
+ case ViewMode::Roughness:
+ case ViewMode::Specular:
+ case ViewMode::SpecularColor:
+ case ViewMode::SubsurfaceColor:
+ case ViewMode::ShadingModel:
+ case ViewMode::GlobalSDF:
+ case ViewMode::GlobalSDFOverdraw:
+ case ViewMode::GlobalSurfaceAtlas:
+ case ViewMode::LightmapUVsDensity:
+ case ViewMode::MaterialComplexity:
+ case ViewMode::Wireframe:
+ case ViewMode::NoPostFx:
+ case ViewMode::VertexColors:
+ case ViewMode::QuadOverdraw:
+ case ViewMode::LightOverlap:
+ setup.UseTemporalAAJitter = false;
+ break;
+ }
+
+ // Customize setup (by postfx or custom gameplay effects)
+ renderContext.Task->SetupRender(renderContext);
+ for (PostProcessEffect* e : renderContext.List->PostFx)
+ e->PreRender(context, renderContext);
+
+ // Final render view preparations
renderContext.View.Prepare(renderContext);
+}
+
+static void CollectDrawCalls(GPUContext* context, RenderContext& renderContext, RenderContextBatch& renderContextBatch)
+{
+ PROFILE_CPU_NAMED("Collect Draw Calls");
+ RenderSetup& setup = renderContext.List->Setup;
+
+ renderContext.View.Pass = DrawPass::GBuffer | DrawPass::Forward | DrawPass::Distortion;
+ if (setup.UseMotionVectors)
+ renderContext.View.Pass |= DrawPass::MotionVectors;
+ renderContextBatch.GetMainContext() = renderContext; // Sync render context in batch with the current value
+ renderContext.List->PreDraw(context, renderContextBatch);
+
+ LightPass::Instance()->SetupLights(renderContext, renderContextBatch);
+ if (setup.UseShadows)
+ ShadowsPass::Instance()->SetupShadows(renderContext, renderContextBatch);
+#if GPU_ENABLE_DEVELOPMENT
+ GBufferPass::Instance()->PreOverrideDrawCalls(renderContext);
+#endif
+
+ // Dispatch drawing (via JobSystem - multiple job batches for every scene)
+ JobSystem::SetJobStartingOnDispatch(false);
+ renderContext.Task->OnCollectDrawCalls(renderContextBatch, SceneRendering::DrawCategory::SceneDraw);
+ renderContext.Task->OnCollectDrawCalls(renderContextBatch, SceneRendering::DrawCategory::SceneDrawAsync);
+ if (setup.UseGlobalSDF)
+ GlobalSignDistanceFieldPass::Instance()->OnCollectDrawCalls(renderContextBatch);
+ if (setup.UseGlobalSurfaceAtlas)
+ GlobalSurfaceAtlasPass::Instance()->OnCollectDrawCalls(renderContextBatch);
+ if (EnumHasAllFlags(renderContext.View.Flags, ViewFlags::CustomPostProcess))
+ {
+ for (PostProcessEffect* fx : renderContext.List->PostFx)
+ fx->CollectDrawCalls(renderContextBatch);
+ }
+
+ // Wait for async jobs to finish
+ JobSystem::SetJobStartingOnDispatch(true);
+ renderContextBatch.FlushWaitLabels();
+
+ // Perform custom post-scene drawing (eg. GPU dispatches used by VFX)
+ for (int32 i = 0; i < renderContextBatch.Contexts.Count(); i++)
+ renderContextBatch.Contexts[i].List->DrainDelayedDraws(context, renderContextBatch, i);
+ renderContext.List->PostDraw(context, renderContextBatch);
+
+#if GPU_ENABLE_DEVELOPMENT
+ GBufferPass::Instance()->OverrideDrawCalls(renderContext);
+#endif
+}
+
+static void ProcessDrawCalls(GPUContext* context, RenderContext& renderContext, RenderContextBatch& renderContextBatch)
+{
+ PROFILE_CPU_NAMED("Process Draw Calls");
+
+ // Utility that handles async jobs for a specific rendering routines in async
+ struct DrawCallsProcessor
+ {
+ RenderContextBatch& RenderContextBatch;
+ Pair MainContextSorting[5] =
+ {
+ // Draw List + Reverse Distance sorting
+ ToPair(DrawCallsListType::GBuffer, false),
+ ToPair(DrawCallsListType::GBufferNoDecals, false),
+ ToPair(DrawCallsListType::Forward, true),
+ ToPair(DrawCallsListType::Distortion, false),
+ ToPair(DrawCallsListType::MotionVectors, false),
+ };
+
+ void BuildObjectsBufferJob(int32 index)
+ {
+ RenderContextBatch.Contexts[index].List->BuildObjectsBuffer();
+ }
+
+ void SortDrawCallsJob(int32 index)
+ {
+ RenderContext& renderContext = RenderContextBatch.GetMainContext();
+ if (index < ARRAY_COUNT(MainContextSorting))
+ {
+ // Main context sorting
+ RenderSetup& setup = renderContext.List->Setup;
+ auto sorting = MainContextSorting[index];
+ if (sorting.First == DrawCallsListType::MotionVectors && !setup.UseMotionVectors)
+ return;
+ renderContext.List->SortDrawCalls(renderContext, sorting.Second, sorting.First);
+ }
+ else
+ {
+ // Shadow context sorting
+ auto& shadowContext = RenderContextBatch.Contexts[index - ARRAY_COUNT(MainContextSorting)];
+ shadowContext.List->SortDrawCalls(shadowContext, false, DrawCallsListType::Depth, DrawPass::Depth);
+ shadowContext.List->SortDrawCalls(shadowContext, false, shadowContext.List->ShadowDepthDrawCallsList, renderContext.List->DrawCalls, DrawCallsListType::Depth, DrawPass::Depth);
+ }
+ }
+ } processor = { renderContextBatch };
+
+ // Dispatch async jobs
+ Function func;
+ func.Bind(&processor);
+ const int64 buildObjectsBufferJob = JobSystem::Dispatch(func, renderContextBatch.Contexts.Count());
+ func.Bind(&processor);
+ const int64 sortDrawCallsJob = JobSystem::Dispatch(func, ARRAY_COUNT(DrawCallsProcessor::MainContextSorting) + renderContextBatch.Contexts.Count());
+
+ // Upload objects buffers to the GPU
+ JobSystem::Wait(buildObjectsBufferJob);
+ {
+ PROFILE_CPU_NAMED("FlushObjectsBuffer");
+ GPUMemoryPass pass(context);
+ for (auto& e : renderContextBatch.Contexts)
+ e.List->ObjectBuffer.Flush(context);
+ }
+
+ // Wait for async jobs to finish
+ // TODO: use per-pass wait labels (eg. don't wait for shadow pass draws sorting until ShadowPass needs it)
+ JobSystem::Wait(sortDrawCallsJob);
+}
+
+void RenderInner(RenderContext& renderContext, RenderContextBatch& renderContextBatch)
+{
+ auto context = GPUDevice::Instance->GetMainContext();
+ ASSERT(renderContext.Buffers && renderContext.Buffers->GetWidth() > 0);
+
+ // Setup rendering
+ RenderSetup& setup = renderContext.List->Setup;
+ Setup(context, renderContext);
// Build batch of render contexts (main view and shadow projections)
- {
- PROFILE_CPU_NAMED("Collect Draw Calls");
-
- view.Pass = DrawPass::GBuffer | DrawPass::Forward | DrawPass::Distortion;
- if (setup.UseMotionVectors)
- view.Pass |= DrawPass::MotionVectors;
- renderContextBatch.GetMainContext() = renderContext; // Sync render context in batch with the current value
- renderContext.List->PreDraw(context, renderContextBatch);
-
- LightPass::Instance()->SetupLights(renderContext, renderContextBatch);
- if (setup.UseShadows)
- ShadowsPass::Instance()->SetupShadows(renderContext, renderContextBatch);
-#if GPU_ENABLE_DEVELOPMENT
- GBufferPass::Instance()->PreOverrideDrawCalls(renderContext);
-#endif
-
- // Dispatch drawing (via JobSystem - multiple job batches for every scene)
- JobSystem::SetJobStartingOnDispatch(false);
- task->OnCollectDrawCalls(renderContextBatch, SceneRendering::DrawCategory::SceneDraw);
- task->OnCollectDrawCalls(renderContextBatch, SceneRendering::DrawCategory::SceneDrawAsync);
- if (setup.UseGlobalSDF)
- GlobalSignDistanceFieldPass::Instance()->OnCollectDrawCalls(renderContextBatch);
- if (setup.UseGlobalSurfaceAtlas)
- GlobalSurfaceAtlasPass::Instance()->OnCollectDrawCalls(renderContextBatch);
- if (EnumHasAllFlags(renderContext.View.Flags, ViewFlags::CustomPostProcess))
- {
- for (PostProcessEffect* fx : renderContext.List->PostFx)
- fx->CollectDrawCalls(renderContextBatch);
- }
-
- // Wait for async jobs to finish
- JobSystem::SetJobStartingOnDispatch(true);
- renderContextBatch.FlushWaitLabels();
-
- // Perform custom post-scene drawing (eg. GPU dispatches used by VFX)
- for (int32 i = 0; i < renderContextBatch.Contexts.Count(); i++)
- renderContextBatch.Contexts[i].List->DrainDelayedDraws(context, renderContextBatch, i);
- renderContext.List->PostDraw(context, renderContextBatch);
-
-#if GPU_ENABLE_DEVELOPMENT
- GBufferPass::Instance()->OverrideDrawCalls(renderContext);
-#endif
- }
+ CollectDrawCalls(context, renderContext, renderContextBatch);
// Process draw calls (sorting, objects buffer building)
- {
- PROFILE_CPU_NAMED("Process Draw Calls");
-
- // Utility that handles async jobs for a specific rendering routines in async
- struct DrawCallsProcessor
- {
- RenderContextBatch& RenderContextBatch;
- Pair MainContextSorting[5] =
- {
- // Draw List + Reverse Distance sorting
- ToPair(DrawCallsListType::GBuffer, false),
- ToPair(DrawCallsListType::GBufferNoDecals, false),
- ToPair(DrawCallsListType::Forward, true),
- ToPair(DrawCallsListType::Distortion, false),
- ToPair(DrawCallsListType::MotionVectors, false),
- };
-
- void BuildObjectsBufferJob(int32 index)
- {
- RenderContextBatch.Contexts[index].List->BuildObjectsBuffer();
- }
-
- void SortDrawCallsJob(int32 index)
- {
- RenderContext& renderContext = RenderContextBatch.GetMainContext();
- if (index < ARRAY_COUNT(MainContextSorting))
- {
- // Main context sorting
- RenderSetup& setup = renderContext.List->Setup;
- auto sorting = MainContextSorting[index];
- if (sorting.First == DrawCallsListType::MotionVectors && !setup.UseMotionVectors)
- return;
- renderContext.List->SortDrawCalls(renderContext, sorting.Second, sorting.First);
- }
- else
- {
- // Shadow context sorting
- auto& shadowContext = RenderContextBatch.Contexts[index - ARRAY_COUNT(MainContextSorting)];
- shadowContext.List->SortDrawCalls(shadowContext, false, DrawCallsListType::Depth, DrawPass::Depth);
- shadowContext.List->SortDrawCalls(shadowContext, false, shadowContext.List->ShadowDepthDrawCallsList, renderContext.List->DrawCalls, DrawCallsListType::Depth, DrawPass::Depth);
- }
- }
- } processor = { renderContextBatch };
-
- // Dispatch async jobs
- Function func;
- func.Bind(&processor);
- const int64 buildObjectsBufferJob = JobSystem::Dispatch(func, renderContextBatch.Contexts.Count());
- func.Bind(&processor);
- const int64 sortDrawCallsJob = JobSystem::Dispatch(func, ARRAY_COUNT(DrawCallsProcessor::MainContextSorting) + renderContextBatch.Contexts.Count());
-
- // Upload objects buffers to the GPU
- JobSystem::Wait(buildObjectsBufferJob);
- {
- PROFILE_CPU_NAMED("FlushObjectsBuffer");
- GPUMemoryPass pass(context);
- for (auto& e : renderContextBatch.Contexts)
- e.List->ObjectBuffer.Flush(context);
- }
-
- // Wait for async jobs to finish
- // TODO: use per-pass wait labels (eg. don't wait for shadow pass draws sorting until ShadowPass needs it)
- JobSystem::Wait(sortDrawCallsJob);
- }
+ ProcessDrawCalls(context, renderContext, renderContextBatch);
// Get the light accumulation buffer
auto outputFormat = renderContext.Buffers->GetOutputFormat();
@@ -587,8 +605,8 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
{
QuadOverdrawPass::Instance()->Render(renderContext, context, lightBuffer->View());
context->ResetRenderTarget();
- context->SetRenderTarget(task->GetOutputView());
- context->SetViewportAndScissors(task->GetOutputViewport());
+ context->SetRenderTarget(renderContext.Task->GetOutputView());
+ context->SetViewportAndScissors(renderContext.Task->GetOutputViewport());
context->Draw(lightBuffer);
RenderTargetPool::Release(lightBuffer);
return;
@@ -636,8 +654,8 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
#endif
{
context->ResetRenderTarget();
- context->SetRenderTarget(task->GetOutputView());
- context->SetViewportAndScissors(task->GetOutputViewport());
+ context->SetRenderTarget(renderContext.Task->GetOutputView());
+ context->SetViewportAndScissors(renderContext.Task->GetOutputViewport());
context->Draw(lightBuffer->View());
RenderTargetPool::Release(lightBuffer);
return;
@@ -650,11 +668,11 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
AmbientOcclusionPass::Instance()->Render(renderContext);
// Check if use custom view mode
- if (isGBufferDebug)
+ if (GBufferPass::IsDebugView(renderContext.View.Mode))
{
context->ResetRenderTarget();
- context->SetRenderTarget(task->GetOutputView());
- context->SetViewportAndScissors(task->GetOutputViewport());
+ context->SetRenderTarget(renderContext.Task->GetOutputView());
+ context->SetViewportAndScissors(renderContext.Task->GetOutputViewport());
GBufferPass::Instance()->RenderDebug(renderContext);
RenderTargetPool::Release(lightBuffer);
return;
@@ -676,7 +694,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
}
if (renderContext.View.Mode == ViewMode::LightBuffer)
{
- RenderLightBuffer(task, context, renderContext, lightBuffer, tempDesc);
+ RenderLightBuffer(context, renderContext, lightBuffer, tempDesc);
return;
}
@@ -693,7 +711,7 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
renderContext.List->Settings.CameraArtifacts.GrainAmount = 0.0f;
renderContext.List->Settings.CameraArtifacts.ChromaticDistortion = 0.0f;
renderContext.List->Settings.CameraArtifacts.VignetteIntensity = 0.0f;
- RenderLightBuffer(task, context, renderContext, lightBuffer, tempDesc);
+ RenderLightBuffer(context, renderContext, lightBuffer, tempDesc);
return;
}
@@ -735,8 +753,8 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
// Check if skip post-processing
if (renderContext.View.Mode == ViewMode::NoPostFx || renderContext.View.Mode == ViewMode::Wireframe)
{
- context->SetRenderTarget(task->GetOutputView());
- context->SetViewportAndScissors(task->GetOutputViewport());
+ context->SetRenderTarget(renderContext.Task->GetOutputView());
+ context->SetViewportAndScissors(renderContext.Task->GetOutputViewport());
if (!Graphics::GammaColorSpace)
GBufferPass::Instance()->DrawLinearToSrgb(renderContext, frameBuffer);
else
@@ -752,10 +770,8 @@ void RenderInner(SceneRenderTask* task, RenderContext& renderContext, RenderCont
renderContext.List->RunCustomPostFxPass(context, renderContext, PostProcessEffectLocation::BeforePostProcessingPass, frameBuffer, tempBuffer);
// Temporal Anti-Aliasing (goes before post processing)
-PRAGMA_DISABLE_DEPRECATION_WARNINGS
- bool useUpscaling = task->RenderingPercentage * task->RenderScale < 1.0f;
-PRAGMA_ENABLE_DEPRECATION_WARNINGS
- const Viewport outputViewport = task->GetOutputViewport();
+ bool useUpscaling = setup.RenderScale < 1.0f;
+ const Viewport outputViewport = renderContext.Task->GetOutputViewport();
if (renderContext.List->Settings.AntiAliasing.Mode == AntialiasingMode::TemporalAntialiasing)
{
if (useUpscaling && setup.UpscaleLocation == RenderingUpscaleLocation::DuringAntiAliasing)
@@ -817,7 +833,7 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS
)
{
// PostFx -> Back Buffer
- GPUTextureView* outputView = task->GetOutputView();
+ GPUTextureView* outputView = renderContext.Task->GetOutputView();
PostProcessingPass::Instance()->Render(renderContext, frameBuffer, outputView, outputViewport, colorGradingLUT);
RenderTargetPool::Release(tempBuffer);
RenderTargetPool::Release(frameBuffer);
@@ -853,7 +869,7 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS
#endif
// Anti Aliasing
- GPUTextureView* outputView = task->GetOutputView();
+ GPUTextureView* outputView = renderContext.Task->GetOutputView();
if (!renderContext.List->HasAnyPostFx(renderContext, PostProcessEffectLocation::AfterAntiAliasingPass, MaterialPostFxLocation::AfterAntiAliasingPass) && !useUpscaling)
{
// AA -> Back Buffer
diff --git a/Source/Engine/Renderer/ScreenSpaceReflectionsPass.cpp b/Source/Engine/Renderer/ScreenSpaceReflectionsPass.cpp
index 9477c81a8..7d95d75a3 100644
--- a/Source/Engine/Renderer/ScreenSpaceReflectionsPass.cpp
+++ b/Source/Engine/Renderer/ScreenSpaceReflectionsPass.cpp
@@ -12,7 +12,7 @@
#include "Engine/Content/Content.h"
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/RenderTools.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTargetPool.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/GPUContext.h"
diff --git a/Source/Engine/Renderer/ShadowsPass.cpp b/Source/Engine/Renderer/ShadowsPass.cpp
index 4a260380a..7a2e7810d 100644
--- a/Source/Engine/Renderer/ShadowsPass.cpp
+++ b/Source/Engine/Renderer/ShadowsPass.cpp
@@ -5,7 +5,7 @@
#include "VolumetricFogPass.h"
#include "Engine/Graphics/Graphics.h"
#include "Engine/Graphics/GPUContext.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/PixelFormatExtensions.h"
#include "Engine/Content/Content.h"
diff --git a/Source/Engine/Renderer/VolumetricFogPass.cpp b/Source/Engine/Renderer/VolumetricFogPass.cpp
index 81acd36e0..b030b2e52 100644
--- a/Source/Engine/Renderer/VolumetricFogPass.cpp
+++ b/Source/Engine/Renderer/VolumetricFogPass.cpp
@@ -6,7 +6,7 @@
#include "DrawCall.h"
#include "GI/DynamicDiffuseGlobalIllumination.h"
#include "Engine/Graphics/Graphics.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTargetPool.h"
diff --git a/Source/Engine/Terrain/Terrain.cpp b/Source/Engine/Terrain/Terrain.cpp
index 9185f71a9..911037e33 100644
--- a/Source/Engine/Terrain/Terrain.cpp
+++ b/Source/Engine/Terrain/Terrain.cpp
@@ -13,7 +13,7 @@
#include "Engine/Physics/PhysicsBackend.h"
#include "Engine/Content/Deprecated.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Level/Scene/Scene.h"
#include "Engine/Profiler/ProfilerCPU.h"
diff --git a/Source/Engine/Terrain/TerrainChunk.cpp b/Source/Engine/Terrain/TerrainChunk.cpp
index b873173d6..f3b24ebc3 100644
--- a/Source/Engine/Terrain/TerrainChunk.cpp
+++ b/Source/Engine/Terrain/TerrainChunk.cpp
@@ -10,6 +10,7 @@
#include "Engine/Graphics/Textures/GPUTexture.h"
#include "Engine/Renderer/RenderList.h"
#include "Engine/Graphics/RenderTools.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Core/Math/OrientedBoundingBox.h"
#include "Engine/Level/Scene/Scene.h"
#if USE_EDITOR
diff --git a/Source/Engine/UI/SpriteRender.cpp b/Source/Engine/UI/SpriteRender.cpp
index d1e66ff1c..398337d80 100644
--- a/Source/Engine/UI/SpriteRender.cpp
+++ b/Source/Engine/UI/SpriteRender.cpp
@@ -7,7 +7,7 @@
#include "Engine/Content/Content.h"
#include "Engine/Content/Assets/Model.h"
#include "Engine/Content/Assets/MaterialInstance.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Level/Actors/Camera.h"
#include "Engine/Serialization/Serialization.h"
diff --git a/Source/Engine/UI/TextRender.cpp b/Source/Engine/UI/TextRender.cpp
index 2a933f59d..fb4b3c814 100644
--- a/Source/Engine/UI/TextRender.cpp
+++ b/Source/Engine/UI/TextRender.cpp
@@ -6,7 +6,7 @@
#include "Engine/Graphics/GPUDevice.h"
#include "Engine/Graphics/Models/Types.h"
#include "Engine/Graphics/RenderView.h"
-#include "Engine/Graphics/RenderTask.h"
+#include "Engine/Graphics/RenderContext.h"
#include "Engine/Graphics/RenderBuffers.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Graphics/Shaders/GPUVertexLayout.h"
diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs
index a7791067c..5f8e47706 100644
--- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs
+++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs
@@ -3093,6 +3093,7 @@ namespace Flax.Build.Bindings
else
throw new Exception("Not supported Non-POD type " + apiType);
CppIncludeFiles.Add("Engine/Scripting/ManagedCLR/MClass.h");
+ CppIncludeFiles.Add(apiType.File.Name);
// Get the full typename with nested parent prefix
var fullName = apiType.FullNameNative;