feat(srp): formalize scene recording and draw entrypoints
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user