2026-04-15 01:57:14 +08:00
|
|
|
#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h"
|
|
|
|
|
|
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
namespace XCEngine {
|
|
|
|
|
namespace Rendering {
|
|
|
|
|
namespace Pipelines {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
ManagedRenderPipelineAssetDescriptor& GetManagedRenderPipelineAssetDescriptorStorage() {
|
|
|
|
|
static ManagedRenderPipelineAssetDescriptor s_descriptor = {};
|
|
|
|
|
return s_descriptor;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 20:07:52 +08:00
|
|
|
std::shared_ptr<const ManagedRenderPipelineBridge>& GetManagedRenderPipelineBridgeStorage() {
|
|
|
|
|
static std::shared_ptr<const ManagedRenderPipelineBridge> s_bridge = nullptr;
|
|
|
|
|
return s_bridge;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-18 01:01:30 +08:00
|
|
|
size_t& GetManagedRenderPipelineBridgeGenerationStorage() {
|
|
|
|
|
static size_t s_generation = 1u;
|
|
|
|
|
return s_generation;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-18 01:10:45 +08:00
|
|
|
size_t& GetManagedRenderPipelineEnvironmentGenerationStorage() {
|
|
|
|
|
static size_t s_generation = 1u;
|
|
|
|
|
return s_generation;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 01:57:14 +08:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
ManagedScriptableRenderPipelineAsset::ManagedScriptableRenderPipelineAsset(
|
|
|
|
|
ManagedRenderPipelineAssetDescriptor descriptor)
|
|
|
|
|
: m_descriptor(std::move(descriptor)) {
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-17 23:54:04 +08:00
|
|
|
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
|
|
|
|
|
ManagedScriptableRenderPipelineAsset::ResolveManagedAssetRuntime() const {
|
2026-04-18 01:01:30 +08:00
|
|
|
const size_t bridgeGeneration =
|
|
|
|
|
GetManagedRenderPipelineBridgeGenerationStorage();
|
|
|
|
|
if (m_managedAssetRuntime != nullptr &&
|
|
|
|
|
m_managedAssetRuntimeBridgeGeneration == bridgeGeneration) {
|
2026-04-17 23:54:04 +08:00
|
|
|
return m_managedAssetRuntime;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-18 01:01:30 +08:00
|
|
|
m_managedAssetRuntime.reset();
|
|
|
|
|
m_managedAssetRuntimeBridgeGeneration = bridgeGeneration;
|
|
|
|
|
|
2026-04-17 23:54:04 +08:00
|
|
|
const std::shared_ptr<const ManagedRenderPipelineBridge> bridge =
|
|
|
|
|
GetManagedRenderPipelineBridgeStorage();
|
|
|
|
|
if (bridge == nullptr) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_managedAssetRuntime = bridge->CreateAssetRuntime(m_descriptor);
|
|
|
|
|
return m_managedAssetRuntime;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 01:57:14 +08:00
|
|
|
std::unique_ptr<RenderPipeline> ManagedScriptableRenderPipelineAsset::CreatePipeline() const {
|
2026-04-15 20:07:52 +08:00
|
|
|
std::unique_ptr<RenderPipeline> pipeline = m_fallbackAsset.CreatePipeline();
|
|
|
|
|
auto* host = dynamic_cast<ScriptableRenderPipelineHost*>(pipeline.get());
|
|
|
|
|
if (host == nullptr) {
|
|
|
|
|
return pipeline;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-17 23:54:04 +08:00
|
|
|
if (const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
|
|
|
|
|
ResolveManagedAssetRuntime();
|
|
|
|
|
runtime != nullptr) {
|
|
|
|
|
host->SetStageRecorder(runtime->CreateStageRecorder());
|
2026-04-15 20:07:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return pipeline;
|
2026-04-15 01:57:14 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-18 00:07:13 +08:00
|
|
|
void ManagedScriptableRenderPipelineAsset::ConfigureCameraRenderRequest(
|
|
|
|
|
CameraRenderRequest& request,
|
|
|
|
|
size_t renderedBaseCameraCount,
|
|
|
|
|
size_t renderedRequestCount,
|
|
|
|
|
const DirectionalShadowPlanningSettings& directionalShadowSettings) const {
|
|
|
|
|
RenderPipelineAsset::ConfigureCameraRenderRequest(
|
|
|
|
|
request,
|
|
|
|
|
renderedBaseCameraCount,
|
|
|
|
|
renderedRequestCount,
|
|
|
|
|
directionalShadowSettings);
|
|
|
|
|
|
|
|
|
|
if (const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
|
|
|
|
|
ResolveManagedAssetRuntime();
|
|
|
|
|
runtime != nullptr) {
|
|
|
|
|
runtime->ConfigureCameraRenderRequest(
|
|
|
|
|
request,
|
|
|
|
|
renderedBaseCameraCount,
|
|
|
|
|
renderedRequestCount,
|
|
|
|
|
directionalShadowSettings);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 01:57:14 +08:00
|
|
|
FinalColorSettings ManagedScriptableRenderPipelineAsset::GetDefaultFinalColorSettings() const {
|
2026-04-18 16:19:54 +08:00
|
|
|
if (const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
|
|
|
|
|
ResolveManagedAssetRuntime();
|
|
|
|
|
runtime != nullptr) {
|
|
|
|
|
FinalColorSettings settings = {};
|
|
|
|
|
if (runtime->TryGetDefaultFinalColorSettings(settings)) {
|
|
|
|
|
return settings;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 01:57:14 +08:00
|
|
|
return m_fallbackAsset.GetDefaultFinalColorSettings();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-17 23:39:08 +08:00
|
|
|
void ManagedScriptableRenderPipelineAsset::ConfigureCameraFramePlan(
|
|
|
|
|
CameraFramePlan& plan) const {
|
|
|
|
|
RenderPipelineAsset::ConfigureCameraFramePlan(plan);
|
|
|
|
|
|
2026-04-17 23:54:04 +08:00
|
|
|
if (const std::shared_ptr<const ManagedRenderPipelineAssetRuntime> runtime =
|
|
|
|
|
ResolveManagedAssetRuntime();
|
|
|
|
|
runtime != nullptr) {
|
|
|
|
|
runtime->ConfigureCameraFramePlan(plan);
|
2026-04-17 23:39:08 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 20:07:52 +08:00
|
|
|
void SetManagedRenderPipelineBridge(
|
|
|
|
|
std::shared_ptr<const ManagedRenderPipelineBridge> bridge) {
|
|
|
|
|
GetManagedRenderPipelineBridgeStorage() = std::move(bridge);
|
2026-04-18 01:01:30 +08:00
|
|
|
++GetManagedRenderPipelineBridgeGenerationStorage();
|
2026-04-18 01:10:45 +08:00
|
|
|
++GetManagedRenderPipelineEnvironmentGenerationStorage();
|
2026-04-15 20:07:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClearManagedRenderPipelineBridge() {
|
|
|
|
|
GetManagedRenderPipelineBridgeStorage().reset();
|
2026-04-18 01:01:30 +08:00
|
|
|
++GetManagedRenderPipelineBridgeGenerationStorage();
|
2026-04-18 01:10:45 +08:00
|
|
|
++GetManagedRenderPipelineEnvironmentGenerationStorage();
|
2026-04-15 20:07:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<const ManagedRenderPipelineBridge>
|
|
|
|
|
GetManagedRenderPipelineBridge() {
|
|
|
|
|
return GetManagedRenderPipelineBridgeStorage();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-18 01:10:45 +08:00
|
|
|
size_t GetManagedRenderPipelineEnvironmentGeneration() {
|
|
|
|
|
return GetManagedRenderPipelineEnvironmentGenerationStorage();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-15 01:57:14 +08:00
|
|
|
void SetManagedRenderPipelineAssetDescriptor(
|
|
|
|
|
const ManagedRenderPipelineAssetDescriptor& descriptor) {
|
|
|
|
|
GetManagedRenderPipelineAssetDescriptorStorage() = descriptor;
|
2026-04-18 01:10:45 +08:00
|
|
|
++GetManagedRenderPipelineEnvironmentGenerationStorage();
|
2026-04-15 01:57:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ClearManagedRenderPipelineAssetDescriptor() {
|
|
|
|
|
GetManagedRenderPipelineAssetDescriptorStorage() = {};
|
2026-04-18 01:10:45 +08:00
|
|
|
++GetManagedRenderPipelineEnvironmentGenerationStorage();
|
2026-04-15 01:57:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ManagedRenderPipelineAssetDescriptor GetManagedRenderPipelineAssetDescriptor() {
|
|
|
|
|
return GetManagedRenderPipelineAssetDescriptorStorage();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<const RenderPipelineAsset>
|
|
|
|
|
CreateManagedOrDefaultScriptableRenderPipelineAsset() {
|
|
|
|
|
const ManagedRenderPipelineAssetDescriptor descriptor =
|
|
|
|
|
GetManagedRenderPipelineAssetDescriptor();
|
|
|
|
|
if (descriptor.IsValid()) {
|
|
|
|
|
return std::make_shared<ManagedScriptableRenderPipelineAsset>(descriptor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return std::make_shared<ScriptableRenderPipelineHostAsset>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Pipelines
|
|
|
|
|
} // namespace Rendering
|
|
|
|
|
} // namespace XCEngine
|