refactor(srp): move urp final color execution into managed feature

This commit is contained in:
2026-04-21 12:59:52 +08:00
parent 0063acadc9
commit 5bec70dcc5
12 changed files with 385 additions and 13 deletions

View File

@@ -17,6 +17,7 @@
#include "Rendering/Graph/RenderGraphRecordingContext.h"
#include "Rendering/GraphicsSettingsState.h"
#include "Rendering/Internal/RenderPipelineFactory.h"
#include "Rendering/Passes/BuiltinFinalColorPass.h"
#include "Rendering/Passes/BuiltinVectorFullscreenPass.h"
#include "Rendering/Planning/FullscreenPassDesc.h"
#include "Rendering/Planning/SceneRenderRequestPlanner.h"
@@ -1238,6 +1239,25 @@ bool TryUnboxManagedFinalColorSettings(
return true;
}
Rendering::FinalColorSettings BuildManagedFinalColorSettings(
const ManagedFinalColorSettingsData& managedSettings) {
Rendering::FinalColorSettings settings = {};
settings.exposureValue = 1.0f;
settings.finalColorScale = XCEngine::Math::Vector4::One();
settings.outputTransferMode =
ResolveManagedFinalColorOutputTransferMode(
managedSettings.outputTransferMode);
settings.exposureMode =
ResolveManagedFinalColorExposureMode(
managedSettings.exposureMode);
settings.exposureValue = managedSettings.exposureValue;
settings.toneMappingMode =
ResolveManagedFinalColorToneMappingMode(
managedSettings.toneMappingMode);
settings.finalColorScale = managedSettings.finalColorScale;
return settings;
}
bool SupportsManagedRenderPipelineStageGraphRecording(
Rendering::CameraFrameStage stage) {
return Rendering::SupportsCameraFramePipelineGraphRecording(stage) ||
@@ -1253,19 +1273,19 @@ Rendering::RenderPass* ConfigureManagedFullscreenPass(
}
std::unique_ptr<Rendering::RenderPass>& passSlot = passPool[passIndex];
Rendering::Passes::BuiltinVectorFullscreenPass* fullscreenPass =
dynamic_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
if (fullscreenPass == nullptr) {
passSlot =
std::make_unique<Rendering::Passes::BuiltinVectorFullscreenPass>();
fullscreenPass =
static_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
}
switch (passDesc.type) {
case Rendering::FullscreenPassType::ColorScale: {
Rendering::Passes::BuiltinVectorFullscreenPass* fullscreenPass =
dynamic_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
if (fullscreenPass == nullptr) {
passSlot =
std::make_unique<Rendering::Passes::BuiltinVectorFullscreenPass>();
fullscreenPass =
static_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
}
fullscreenPass->SetShaderPath(
Resources::GetBuiltinColorScalePostProcessShaderPath());
fullscreenPass->SetPreferredPassName("ColorScale");
@@ -1273,11 +1293,38 @@ Rendering::RenderPass* ConfigureManagedFullscreenPass(
return fullscreenPass;
}
case Rendering::FullscreenPassType::ShaderVector: {
Rendering::Passes::BuiltinVectorFullscreenPass* fullscreenPass =
dynamic_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
if (fullscreenPass == nullptr) {
passSlot =
std::make_unique<Rendering::Passes::BuiltinVectorFullscreenPass>();
fullscreenPass =
static_cast<Rendering::Passes::BuiltinVectorFullscreenPass*>(
passSlot.get());
}
fullscreenPass->SetShaderPath(passDesc.shaderVector.shaderPath);
fullscreenPass->SetPreferredPassName(passDesc.shaderVector.passName);
fullscreenPass->SetVectorPayload(passDesc.shaderVector.vectorPayload);
return fullscreenPass;
}
case Rendering::FullscreenPassType::FinalColor: {
Rendering::Passes::BuiltinFinalColorPass* finalColorPass =
dynamic_cast<Rendering::Passes::BuiltinFinalColorPass*>(
passSlot.get());
if (finalColorPass == nullptr) {
passSlot =
std::make_unique<Rendering::Passes::BuiltinFinalColorPass>();
finalColorPass =
static_cast<Rendering::Passes::BuiltinFinalColorPass*>(
passSlot.get());
}
finalColorPass->SetShaderPath(
Resources::GetBuiltinFinalColorShaderPath());
finalColorPass->SetSettings(passDesc.finalColor.settings);
return finalColorPass;
}
default:
return nullptr;
}
@@ -4909,6 +4956,32 @@ InternalCall_Rendering_ScriptableRenderContext_SetRasterPassShaderVectorFullscre
: 0;
}
mono_bool
InternalCall_Rendering_ScriptableRenderContext_SetRasterPassFinalColorFullscreenExecution(
uint64_t nativeHandle,
uint64_t rasterPassHandle,
ManagedFinalColorSettingsData* settingsData) {
ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
ManagedScriptableRenderContextState::RasterPassRecordRequest*
const request =
FindPendingManagedRasterPassRecordRequest(
state,
rasterPassHandle);
if (request == nullptr ||
settingsData == nullptr) {
return 0;
}
request->passDesc =
Rendering::FullscreenPassDesc::MakeFinalColor(
BuildManagedFinalColorSettings(
*settingsData));
return request->passDesc.IsValid()
? 1
: 0;
}
mono_bool InternalCall_Rendering_ScriptableRenderContext_CommitRasterPass(
uint64_t nativeHandle,
uint64_t rasterPassHandle) {
@@ -5805,6 +5878,18 @@ void InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscr
state->plan->ClearFullscreenStage(resolvedStage, true);
}
mono_bool
InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetHasFinalColorProcessing(
uint64_t nativeHandle) {
const ManagedScriptableRenderPipelinePlanningContextState* const state =
FindManagedScriptableRenderPipelinePlanningContextState(nativeHandle);
return state != nullptr &&
state->plan != nullptr &&
state->plan->finalColorPolicy.RequiresProcessing()
? 1
: 0;
}
void RegisterInternalCalls() {
if (GetInternalCallRegistrationState()) {
return;
@@ -5947,6 +6032,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_SetRasterPassColorAttachment", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_SetRasterPassColorAttachment));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_SetRasterPassColorScaleFullscreenExecution", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_SetRasterPassColorScaleFullscreenExecution));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_SetRasterPassShaderVectorFullscreenExecution", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_SetRasterPassShaderVectorFullscreenExecution));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_SetRasterPassFinalColorFullscreenExecution", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_SetRasterPassFinalColorFullscreenExecution));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_CommitRasterPass", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_CommitRasterPass));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetStageColorSource", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetStageColorSource));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetStageUsesGraphManagedOutputColor", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetStageUsesGraphManagedOutputColor));
@@ -6008,6 +6094,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_RequestFullscreenStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_RequestFullscreenStage));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetHasFinalColorProcessing", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetHasFinalColorProcessing));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetRenderedRequestCount", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetRenderedRequestCount));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID", reinterpret_cast<const void*>(&InternalCall_Rendering_CameraRenderRequestContext_GetCameraGameObjectUUID));