feat(srp): formalize scene recording and draw entrypoints

This commit is contained in:
2026-04-20 18:54:04 +08:00
parent b521616e27
commit 3df87e941c
20 changed files with 1054 additions and 181 deletions

View File

@@ -68,6 +68,31 @@ bool BuiltinForwardPipeline::ExecuteScenePhase(
scenePhase));
}
bool BuiltinForwardPipeline::ExecuteSceneDrawSettings(
const RenderPassContext& context,
const DrawSettings& drawSettings) {
const FrameExecutionContext executionContext(
context.renderContext,
context.surface,
context.sceneData,
context.sourceSurface,
context.sourceColorView,
context.sourceColorState);
switch (drawSettings.scenePhase) {
case ScenePhase::Opaque:
case ScenePhase::Transparent:
return DrawVisibleItems(
executionContext,
drawSettings);
default:
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
(Containers::String("BuiltinForwardPipeline::ExecuteSceneDrawSettings does not support scene phase: ") +
ToString(drawSettings.scenePhase)).CStr());
return false;
}
}
bool BuiltinForwardPipeline::ExecuteForwardScene(
const FrameExecutionContext& executionContext) {
return ExecuteForwardSceneSteps(

View File

@@ -26,6 +26,12 @@ bool ScenePhaseSamplesMainDirectionalShadow(ScenePhase scenePhase) {
scenePhase == ScenePhase::Transparent;
}
bool DrawSettingsSamplesMainDirectionalShadow(
const DrawSettings& drawSettings) {
return ScenePhaseSamplesMainDirectionalShadow(
drawSettings.scenePhase);
}
} // namespace
NativeSceneRecorder::NativeSceneRecorder(
@@ -179,6 +185,50 @@ bool NativeSceneRecorder::RecordScenePhase(
return true;
}
bool NativeSceneRecorder::RecordSceneDrawSettings(
const DrawSettings& drawSettings) {
if (m_context.stage != CameraFrameStage::MainScene) {
return false;
}
const RenderPipelineStageRenderGraphContext graphContext =
BuildGraphContext();
const bool clearAttachments = m_clearAttachments;
const SceneRenderFeaturePassBeginCallback beginRecordedPass =
BuildBeginRecordedPassCallback(graphContext.executionSucceeded);
const SceneRenderFeaturePassEndCallback endRecordedPass =
BuildEndRecordedPassCallback();
const RenderPassGraphBeginCallback beginPhasePass =
[beginRecordedPass, clearAttachments](
const RenderPassContext& passContext) {
return beginRecordedPass(
passContext,
clearAttachments);
};
const std::vector<RenderGraphTextureHandle> additionalReadTextures =
DrawSettingsSamplesMainDirectionalShadow(drawSettings) &&
m_mainDirectionalShadowTexture.IsValid()
? std::vector<RenderGraphTextureHandle>{ m_mainDirectionalShadowTexture }
: std::vector<RenderGraphTextureHandle>{};
if (!::XCEngine::Rendering::RecordRenderPipelineStagePhasePass(
graphContext,
drawSettings.scenePhase,
[&sceneRenderer = m_sceneRenderer, drawSettings](
const RenderPassContext& passContext) {
return sceneRenderer.ExecuteSceneDrawSettings(
passContext,
drawSettings);
},
beginPhasePass,
endRecordedPass,
additionalReadTextures)) {
return false;
}
m_clearAttachments = false;
return true;
}
bool NativeSceneRecorder::RecordInjectionPoint(
SceneRenderInjectionPoint injectionPoint) {
if (m_context.stage != CameraFrameStage::MainScene) {

View File

@@ -4515,22 +4515,6 @@ InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides(
: 0;
}
mono_bool InternalCall_Rendering_ScriptableRenderContext_RecordScene(
uint64_t nativeHandle) {
ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
if (state == nullptr ||
state->graphContext == nullptr ||
state->sceneRecorder == nullptr ||
state->stage != Rendering::CameraFrameStage::MainScene) {
return 0;
}
return state->sceneRecorder->RecordDefaultScene()
? 1
: 0;
}
mono_bool
InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase(
uint64_t nativeHandle,
@@ -4569,6 +4553,31 @@ InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint(
: 0;
}
mono_bool
InternalCall_Rendering_ScriptableRenderContext_DrawRenderers(
uint64_t nativeHandle,
int32_t scenePhase,
int32_t rendererListType) {
ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
if (state == nullptr ||
state->graphContext == nullptr ||
state->sceneRecorder == nullptr ||
state->stage != Rendering::CameraFrameStage::MainScene) {
return 0;
}
Rendering::DrawSettings drawSettings = {};
drawSettings.scenePhase =
static_cast<Rendering::ScenePhase>(scenePhase);
drawSettings.rendererListType =
static_cast<Rendering::RendererListType>(rendererListType);
return state->sceneRecorder->RecordSceneDrawSettings(
drawSettings)
? 1
: 0;
}
int32_t
InternalCall_Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount(
uint64_t nativeHandle) {
@@ -4913,8 +4922,8 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorScale", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorScale));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScene", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordScene));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderers", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderers));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordSceneInjectionPoint", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource));