2026-04-15 21:55:35 +08:00
|
|
|
#include "Rendering/Internal/RenderPipelineFactory.h"
|
|
|
|
|
|
2026-04-21 03:01:56 +08:00
|
|
|
#include <XCEngine/Rendering/RenderPipelineAsset.h>
|
2026-04-21 03:09:08 +08:00
|
|
|
#include <XCEngine/Rendering/RenderPipeline.h>
|
2026-04-21 03:01:56 +08:00
|
|
|
|
2026-04-21 02:49:15 +08:00
|
|
|
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
|
2026-04-18 01:24:21 +08:00
|
|
|
#include "Rendering/Pipelines/BuiltinForwardPipeline.h"
|
2026-04-21 23:06:17 +08:00
|
|
|
#include "Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h"
|
2026-04-15 21:55:35 +08:00
|
|
|
#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h"
|
|
|
|
|
#include "Rendering/Pipelines/ScriptableRenderPipelineHost.h"
|
|
|
|
|
|
|
|
|
|
namespace XCEngine {
|
|
|
|
|
namespace Rendering {
|
|
|
|
|
namespace Internal {
|
|
|
|
|
|
2026-04-19 23:09:34 +08:00
|
|
|
namespace {
|
|
|
|
|
|
2026-04-26 01:59:21 +08:00
|
|
|
class DefaultNativePipelineBackendAsset final : public RenderPipelineAsset {
|
|
|
|
|
public:
|
|
|
|
|
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
|
|
|
|
|
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FinalColorSettings GetDefaultFinalColorSettings() const override {
|
|
|
|
|
return {};
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2026-04-20 12:47:25 +08:00
|
|
|
std::shared_ptr<const RenderPipelineAsset>
|
2026-04-26 01:59:21 +08:00
|
|
|
CreateDefaultNativePipelineBackendAsset() {
|
2026-04-20 12:47:25 +08:00
|
|
|
static const std::shared_ptr<const RenderPipelineAsset>
|
2026-04-26 01:59:21 +08:00
|
|
|
s_defaultNativePipelineBackendAsset =
|
|
|
|
|
std::make_shared<DefaultNativePipelineBackendAsset>();
|
|
|
|
|
return s_defaultNativePipelineBackendAsset;
|
2026-04-20 12:47:25 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-26 01:59:21 +08:00
|
|
|
std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
|
2026-04-19 23:09:34 +08:00
|
|
|
const std::shared_ptr<const RenderPipelineAsset>& asset) {
|
|
|
|
|
if (asset == nullptr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-26 01:59:21 +08:00
|
|
|
return asset->CreatePipeline();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
|
|
|
|
|
const std::shared_ptr<const RenderPipelineAsset>& asset) {
|
|
|
|
|
std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
|
|
|
|
TryCreatePipelineBackendFromAsset(asset);
|
|
|
|
|
if (pipelineBackend == nullptr) {
|
2026-04-19 23:09:34 +08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-21 19:06:38 +08:00
|
|
|
SceneDrawBackend* const sceneDrawBackend =
|
2026-04-26 01:59:21 +08:00
|
|
|
dynamic_cast<SceneDrawBackend*>(pipelineBackend.get());
|
2026-04-21 19:06:38 +08:00
|
|
|
if (sceneDrawBackend == nullptr) {
|
2026-04-19 23:09:34 +08:00
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-26 01:59:21 +08:00
|
|
|
(void)pipelineBackend.release();
|
2026-04-21 19:06:38 +08:00
|
|
|
return std::unique_ptr<SceneDrawBackend>(sceneDrawBackend);
|
2026-04-19 23:09:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
2026-04-19 04:31:48 +08:00
|
|
|
std::shared_ptr<const RenderPipelineAsset> CreateConfiguredRenderPipelineAsset() {
|
|
|
|
|
return Pipelines::CreateConfiguredManagedRenderPipelineAsset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
|
|
|
|
|
return std::make_shared<Pipelines::ScriptableRenderPipelineHostAsset>();
|
2026-04-15 21:55:35 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-21 19:19:27 +08:00
|
|
|
std::shared_ptr<const RenderPipelineAsset> CreateDefaultPipelineBackendAsset() {
|
2026-04-21 18:46:43 +08:00
|
|
|
static const std::shared_ptr<const RenderPipelineAsset> s_defaultAsset =
|
2026-04-26 01:59:21 +08:00
|
|
|
CreateDefaultNativePipelineBackendAsset();
|
2026-04-21 18:46:43 +08:00
|
|
|
return s_defaultAsset;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 21:55:35 +08:00
|
|
|
std::shared_ptr<const RenderPipelineAsset> ResolveRenderPipelineAssetOrDefault(
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset> preferredAsset) {
|
2026-04-19 04:31:48 +08:00
|
|
|
if (preferredAsset != nullptr) {
|
|
|
|
|
return std::move(preferredAsset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (std::shared_ptr<const RenderPipelineAsset> configuredAsset =
|
|
|
|
|
CreateConfiguredRenderPipelineAsset();
|
|
|
|
|
configuredAsset != nullptr) {
|
|
|
|
|
return configuredAsset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CreateFallbackRenderPipelineAsset();
|
2026-04-15 21:55:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
|
|
|
|
|
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
|
|
|
|
|
const std::shared_ptr<const RenderPipelineAsset> resolvedAsset =
|
|
|
|
|
ResolveRenderPipelineAssetOrDefault(preferredAsset);
|
|
|
|
|
if (resolvedAsset != nullptr) {
|
|
|
|
|
if (std::unique_ptr<RenderPipeline> pipeline =
|
|
|
|
|
resolvedAsset->CreatePipeline()) {
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset = resolvedAsset;
|
|
|
|
|
}
|
|
|
|
|
return pipeline;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 04:31:48 +08:00
|
|
|
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
|
|
|
|
|
ResolveRenderPipelineAssetOrDefault(nullptr);
|
|
|
|
|
if (defaultAsset != nullptr &&
|
|
|
|
|
defaultAsset != resolvedAsset) {
|
|
|
|
|
if (std::unique_ptr<RenderPipeline> pipeline =
|
|
|
|
|
defaultAsset->CreatePipeline()) {
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset = defaultAsset;
|
|
|
|
|
}
|
|
|
|
|
return pipeline;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 21:55:35 +08:00
|
|
|
const std::shared_ptr<const RenderPipelineAsset> fallbackAsset =
|
2026-04-19 04:31:48 +08:00
|
|
|
CreateFallbackRenderPipelineAsset();
|
2026-04-15 21:55:35 +08:00
|
|
|
if (fallbackAsset != nullptr &&
|
2026-04-19 04:31:48 +08:00
|
|
|
fallbackAsset != resolvedAsset &&
|
|
|
|
|
fallbackAsset != defaultAsset) {
|
2026-04-15 21:55:35 +08:00
|
|
|
if (std::unique_ptr<RenderPipeline> pipeline =
|
|
|
|
|
fallbackAsset->CreatePipeline()) {
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset = fallbackAsset;
|
|
|
|
|
}
|
|
|
|
|
return pipeline;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset =
|
|
|
|
|
fallbackAsset != nullptr
|
|
|
|
|
? fallbackAsset
|
2026-04-19 04:31:48 +08:00
|
|
|
: (defaultAsset != nullptr
|
|
|
|
|
? defaultAsset
|
|
|
|
|
: resolvedAsset);
|
2026-04-15 21:55:35 +08:00
|
|
|
}
|
|
|
|
|
return std::make_unique<Pipelines::ScriptableRenderPipelineHost>();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-26 01:59:21 +08:00
|
|
|
std::unique_ptr<RenderPipelineBackend> CreatePipelineBackendFromAsset(
|
|
|
|
|
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
|
|
|
|
|
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
|
|
|
|
TryCreatePipelineBackendFromAsset(preferredAsset)) {
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset = preferredAsset;
|
|
|
|
|
}
|
|
|
|
|
return pipelineBackend;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
|
|
|
|
|
CreateDefaultPipelineBackendAsset();
|
|
|
|
|
if (defaultAsset != nullptr &&
|
|
|
|
|
defaultAsset != preferredAsset) {
|
|
|
|
|
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
|
|
|
|
TryCreatePipelineBackendFromAsset(defaultAsset)) {
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset = defaultAsset;
|
|
|
|
|
}
|
|
|
|
|
return pipelineBackend;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
*outResolvedAsset =
|
|
|
|
|
defaultAsset != nullptr
|
|
|
|
|
? defaultAsset
|
|
|
|
|
: preferredAsset;
|
|
|
|
|
}
|
|
|
|
|
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-21 19:06:38 +08:00
|
|
|
std::unique_ptr<SceneDrawBackend> CreateSceneDrawBackendFromAsset(
|
2026-04-19 23:09:34 +08:00
|
|
|
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
|
2026-04-21 19:06:38 +08:00
|
|
|
if (std::unique_ptr<SceneDrawBackend> sceneDrawBackend =
|
|
|
|
|
TryCreateSceneDrawBackendFromAsset(preferredAsset)) {
|
2026-04-19 23:09:34 +08:00
|
|
|
if (outResolvedAsset != nullptr) {
|
2026-04-19 23:32:41 +08:00
|
|
|
*outResolvedAsset = preferredAsset;
|
2026-04-19 23:09:34 +08:00
|
|
|
}
|
2026-04-21 19:06:38 +08:00
|
|
|
return sceneDrawBackend;
|
2026-04-19 23:09:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (outResolvedAsset != nullptr) {
|
|
|
|
|
outResolvedAsset->reset();
|
|
|
|
|
}
|
2026-04-21 19:06:38 +08:00
|
|
|
return CreateDefaultSceneDrawBackend();
|
2026-04-19 23:09:34 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-21 19:06:38 +08:00
|
|
|
std::unique_ptr<SceneDrawBackend> CreateDefaultSceneDrawBackend() {
|
2026-04-26 01:59:21 +08:00
|
|
|
return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend();
|
2026-04-18 01:24:21 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-15 21:55:35 +08:00
|
|
|
} // namespace Internal
|
|
|
|
|
} // namespace Rendering
|
|
|
|
|
} // namespace XCEngine
|