refactor(rendering/srp): unify managed fullscreen raster recording
This commit is contained in:
@@ -11,12 +11,17 @@
|
||||
#include "Input/InputManager.h"
|
||||
#include "Physics/PhysicsWorld.h"
|
||||
#include "Rendering/Execution/CameraFramePlan.h"
|
||||
#include "Rendering/Execution/CameraFrameRenderGraphFrameData.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.h"
|
||||
#include "Rendering/Graph/RenderGraph.h"
|
||||
#include "Rendering/Graph/RenderGraphRecordingContext.h"
|
||||
#include "Rendering/GraphicsSettingsState.h"
|
||||
#include "Rendering/Internal/RenderPipelineFactory.h"
|
||||
#include "Rendering/Passes/BuiltinVectorFullscreenPass.h"
|
||||
#include "Rendering/Planning/FullscreenPassDesc.h"
|
||||
#include "Rendering/Pipelines/NativeSceneRecorder.h"
|
||||
#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h"
|
||||
#include "Rendering/RenderPassGraphContract.h"
|
||||
#include "Rendering/RenderPipelineStageGraphContract.h"
|
||||
#include "Resources/BuiltinResources.h"
|
||||
#include "Scene/Scene.h"
|
||||
@@ -101,7 +106,17 @@ struct ManagedScriptableRenderContextState {
|
||||
Rendering::CameraFrameStage stage = Rendering::CameraFrameStage::MainScene;
|
||||
const Rendering::RenderPipelineStageRenderGraphContext* graphContext = nullptr;
|
||||
Rendering::Pipelines::NativeSceneRecorder* sceneRecorder = nullptr;
|
||||
std::vector<Rendering::FullscreenPassDesc> queuedFullscreenPasses = {};
|
||||
struct RasterPassRecordRequest {
|
||||
Containers::String passName = {};
|
||||
Rendering::FullscreenPassDesc passDesc = {};
|
||||
Rendering::RenderGraphTextureHandle sourceColorTexture = {};
|
||||
std::vector<Rendering::RenderGraphTextureHandle> readTextures = {};
|
||||
std::vector<Rendering::RenderGraphTextureHandle> colorTargets = {};
|
||||
};
|
||||
uint64_t nextPendingRasterPassHandle = 1u;
|
||||
std::unordered_map<uint64_t, RasterPassRecordRequest>
|
||||
pendingRasterPassRequests = {};
|
||||
std::vector<RasterPassRecordRequest> rasterPassRequests = {};
|
||||
};
|
||||
|
||||
struct ManagedCameraRenderRequestContextState {
|
||||
@@ -135,6 +150,21 @@ ManagedScriptableRenderContextState* FindManagedScriptableRenderContextState(
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
ManagedScriptableRenderContextState* state,
|
||||
uint64_t rasterPassHandle) {
|
||||
if (state == nullptr || rasterPassHandle == 0u) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const auto it =
|
||||
state->pendingRasterPassRequests.find(rasterPassHandle);
|
||||
return it != state->pendingRasterPassRequests.end()
|
||||
? &it->second
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
uint64_t RegisterManagedScriptableRenderContextState(
|
||||
ManagedScriptableRenderContextState& state) {
|
||||
uint64_t handle = GetManagedScriptableRenderContextNextHandle()++;
|
||||
@@ -220,6 +250,205 @@ bool ResolveManagedScriptableRenderContextUsesGraphManagedOutputColor(
|
||||
state->graphContext->usesGraphManagedOutputColor;
|
||||
}
|
||||
|
||||
int32_t EncodeManagedRenderGraphTextureHandle(
|
||||
Rendering::RenderGraphTextureHandle handle) {
|
||||
return handle.IsValid()
|
||||
? static_cast<int32_t>(handle.index)
|
||||
: -1;
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureHandle
|
||||
DecodeManagedRenderGraphTextureHandle(
|
||||
int32_t handleValue) {
|
||||
Rendering::RenderGraphTextureHandle handle = {};
|
||||
if (handleValue < 0) {
|
||||
return handle;
|
||||
}
|
||||
|
||||
handle.index = static_cast<Core::uint32>(handleValue);
|
||||
return handle;
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureHandle
|
||||
ResolveManagedScriptableRenderContextSourceColorTexture(
|
||||
const ManagedScriptableRenderContextState* state) {
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr) {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (state->graphContext->sourceColorTexture.IsValid()) {
|
||||
return state->graphContext->sourceColorTexture;
|
||||
}
|
||||
|
||||
const Rendering::CameraFrameRenderGraphResources* const resources =
|
||||
Rendering::TryGetCameraFrameRenderGraphResources(
|
||||
state->graphContext->blackboard);
|
||||
if (resources == nullptr) {
|
||||
return {};
|
||||
}
|
||||
|
||||
switch (state->stage) {
|
||||
case Rendering::CameraFrameStage::PostProcess:
|
||||
return resources->mainScene.color;
|
||||
case Rendering::CameraFrameStage::FinalOutput:
|
||||
return resources->postProcess.color.IsValid()
|
||||
? resources->postProcess.color
|
||||
: resources->mainScene.color;
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureHandle
|
||||
ResolveManagedPrimaryColorTarget(
|
||||
const std::vector<Rendering::RenderGraphTextureHandle>& colorTargets) {
|
||||
const auto it =
|
||||
std::find_if(
|
||||
colorTargets.begin(),
|
||||
colorTargets.end(),
|
||||
[](Rendering::RenderGraphTextureHandle handle) {
|
||||
return handle.IsValid();
|
||||
});
|
||||
return it != colorTargets.end()
|
||||
? *it
|
||||
: Rendering::RenderGraphTextureHandle{};
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureHandle
|
||||
ResolveManagedScriptableRenderContextPrimaryColorTarget(
|
||||
const ManagedScriptableRenderContextState* state) {
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr) {
|
||||
return {};
|
||||
}
|
||||
|
||||
return ResolveManagedPrimaryColorTarget(
|
||||
state->graphContext->colorTargets);
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureHandle
|
||||
ResolveManagedScriptableRenderContextDepthTarget(
|
||||
const ManagedScriptableRenderContextState* state) {
|
||||
return state != nullptr &&
|
||||
state->graphContext != nullptr
|
||||
? state->graphContext->depthTarget
|
||||
: Rendering::RenderGraphTextureHandle{};
|
||||
}
|
||||
|
||||
Rendering::RenderGraphTextureDesc
|
||||
BuildManagedFullscreenTransientDepthTextureDesc(
|
||||
const Rendering::RenderSurface& surface) {
|
||||
Rendering::RenderGraphTextureDesc desc = {};
|
||||
desc.width =
|
||||
surface.GetWidth() > 0u
|
||||
? surface.GetWidth()
|
||||
: surface.GetRenderAreaWidth();
|
||||
desc.height =
|
||||
surface.GetHeight() > 0u
|
||||
? surface.GetHeight()
|
||||
: surface.GetRenderAreaHeight();
|
||||
desc.format = static_cast<Core::uint32>(
|
||||
RHI::Format::D24_UNorm_S8_UInt);
|
||||
desc.textureType = static_cast<Core::uint32>(
|
||||
RHI::TextureType::Texture2D);
|
||||
desc.sampleCount = 1u;
|
||||
desc.sampleQuality = 0u;
|
||||
return desc;
|
||||
}
|
||||
|
||||
Rendering::RenderGraphRecordingSourceBinding
|
||||
BuildManagedScriptableRenderContextSourceBinding(
|
||||
const Rendering::RenderPipelineStageRenderGraphContext& context,
|
||||
Rendering::RenderGraphTextureHandle sourceColorTexture) {
|
||||
if (!sourceColorTexture.IsValid()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
Rendering::RenderGraphRecordingSourceBinding binding =
|
||||
Rendering::MakeRenderGraphRecordingSourceBinding(
|
||||
context.sourceSurface,
|
||||
context.sourceColorView,
|
||||
context.sourceColorState,
|
||||
sourceColorTexture);
|
||||
const bool usesContextSource =
|
||||
context.sourceColorTexture.IsValid() &&
|
||||
context.sourceColorTexture.index == sourceColorTexture.index;
|
||||
if (!usesContextSource) {
|
||||
binding.sourceColorView = nullptr;
|
||||
binding.sourceColorState =
|
||||
RHI::ResourceStates::PixelShaderResource;
|
||||
}
|
||||
|
||||
if (binding.sourceSurface == nullptr) {
|
||||
binding.sourceSurface = &context.surfaceTemplate;
|
||||
}
|
||||
|
||||
return binding;
|
||||
}
|
||||
|
||||
bool RecordManagedFullscreenRasterPass(
|
||||
const Rendering::RenderPipelineStageRenderGraphContext& stageContext,
|
||||
Rendering::RenderPass& pass,
|
||||
Rendering::RenderGraphTextureHandle sourceColorTexture,
|
||||
std::vector<Rendering::RenderGraphTextureHandle> colorTargets,
|
||||
std::vector<Rendering::RenderGraphTextureHandle> additionalReadTextures,
|
||||
const Containers::String& passName) {
|
||||
if (!Rendering::IsCameraFrameFullscreenSequenceStage(stageContext.stage) ||
|
||||
!sourceColorTexture.IsValid() ||
|
||||
!ResolveManagedPrimaryColorTarget(colorTargets).IsValid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphRecordingContext baseContext =
|
||||
Rendering::BuildRenderGraphRecordingContext(
|
||||
stageContext);
|
||||
Rendering::RenderGraphRecordingContextBuildParams params = {};
|
||||
if (!passName.Empty()) {
|
||||
params.passName = &passName;
|
||||
}
|
||||
params.overrideSourceBinding = true;
|
||||
params.sourceBinding =
|
||||
BuildManagedScriptableRenderContextSourceBinding(
|
||||
stageContext,
|
||||
sourceColorTexture);
|
||||
params.overrideColorTargets = true;
|
||||
params.colorTargets = std::move(colorTargets);
|
||||
params.overrideDepthTarget = true;
|
||||
params.depthTarget = {};
|
||||
|
||||
const Rendering::RenderGraphRecordingContext recordingContext =
|
||||
Rendering::BuildRenderGraphRecordingContext(
|
||||
baseContext,
|
||||
std::move(params));
|
||||
const Rendering::RenderPassRenderGraphContext renderGraphContext =
|
||||
Rendering::BuildRenderPassRenderGraphContext(recordingContext);
|
||||
Rendering::RenderPass* const passPtr = &pass;
|
||||
return Rendering::RecordCallbackRasterRenderPass(
|
||||
renderGraphContext,
|
||||
Rendering::BuildSourceColorFullscreenRasterPassGraphIO(),
|
||||
[passPtr](const Rendering::RenderPassContext& passContext) {
|
||||
return passPtr != nullptr &&
|
||||
passPtr->Execute(passContext);
|
||||
},
|
||||
std::move(additionalReadTextures));
|
||||
}
|
||||
|
||||
bool RecordManagedFullscreenPassToTexture(
|
||||
const Rendering::RenderPipelineStageRenderGraphContext& stageContext,
|
||||
Rendering::RenderPass& pass,
|
||||
Rendering::RenderGraphTextureHandle sourceColorTexture,
|
||||
Rendering::RenderGraphTextureHandle outputColorTexture,
|
||||
const Containers::String& passName) {
|
||||
return RecordManagedFullscreenRasterPass(
|
||||
stageContext,
|
||||
pass,
|
||||
sourceColorTexture,
|
||||
{ outputColorTexture },
|
||||
{},
|
||||
passName);
|
||||
}
|
||||
|
||||
const Rendering::DirectionalShadowRenderPlan&
|
||||
ResolveManagedScriptableRenderContextDirectionalShadowPlan(
|
||||
const ManagedScriptableRenderContextState* state) {
|
||||
@@ -686,6 +915,20 @@ static_assert(
|
||||
sizeof(Rendering::FinalColorSettings),
|
||||
"Managed final color bridge layout must match native FinalColorSettings.");
|
||||
|
||||
struct ManagedRenderGraphTextureDescData {
|
||||
uint32_t width = 0u;
|
||||
uint32_t height = 0u;
|
||||
uint32_t format = 0u;
|
||||
uint32_t textureType = 0u;
|
||||
uint32_t sampleCount = 0u;
|
||||
uint32_t sampleQuality = 0u;
|
||||
};
|
||||
|
||||
static_assert(
|
||||
sizeof(ManagedRenderGraphTextureDescData) ==
|
||||
sizeof(Rendering::RenderGraphTextureDesc),
|
||||
"Managed render graph texture desc bridge layout must match native RenderGraphTextureDesc.");
|
||||
|
||||
Rendering::FinalColorOutputTransferMode ResolveManagedFinalColorOutputTransferMode(
|
||||
uint8_t value) {
|
||||
switch (value) {
|
||||
@@ -1007,7 +1250,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
return FlushManagedFullscreenPasses(
|
||||
return FlushManagedRasterPasses(
|
||||
context,
|
||||
managedContextState);
|
||||
}
|
||||
@@ -1063,36 +1306,86 @@ private:
|
||||
return m_recordStageMethod;
|
||||
}
|
||||
|
||||
bool FlushManagedFullscreenPasses(
|
||||
bool FlushManagedRasterPasses(
|
||||
const Rendering::RenderPipelineStageRenderGraphContext& context,
|
||||
const ManagedScriptableRenderContextState& managedContextState) {
|
||||
if (managedContextState.queuedFullscreenPasses.empty()) {
|
||||
if (managedContextState.rasterPassRequests.empty()) {
|
||||
return true;
|
||||
}
|
||||
if (!Rendering::IsCameraFrameFullscreenSequenceStage(context.stage)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<Rendering::RenderPass*> passes = {};
|
||||
passes.reserve(
|
||||
managedContextState.queuedFullscreenPasses.size());
|
||||
Rendering::RenderGraphTextureHandle currentSourceColor =
|
||||
ResolveManagedScriptableRenderContextSourceColorTexture(
|
||||
&managedContextState);
|
||||
const Rendering::RenderGraphTextureHandle finalOutputColor =
|
||||
ResolveManagedScriptableRenderContextPrimaryColorTarget(
|
||||
&managedContextState);
|
||||
if (!currentSourceColor.IsValid() ||
|
||||
!finalOutputColor.IsValid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t passIndex = 0u;
|
||||
passIndex < managedContextState.queuedFullscreenPasses.size();
|
||||
passIndex < managedContextState.rasterPassRequests.size();
|
||||
++passIndex) {
|
||||
const ManagedScriptableRenderContextState::RasterPassRecordRequest&
|
||||
request = managedContextState.rasterPassRequests[passIndex];
|
||||
Rendering::RenderPass* const pass =
|
||||
ConfigureManagedFullscreenPass(
|
||||
m_fullscreenPassPool,
|
||||
passIndex,
|
||||
managedContextState.queuedFullscreenPasses[passIndex]);
|
||||
request.passDesc);
|
||||
if (pass == nullptr) {
|
||||
return false;
|
||||
}
|
||||
passes.push_back(pass);
|
||||
|
||||
const Containers::String resolvedPassName =
|
||||
!request.passName.Empty()
|
||||
? request.passName
|
||||
: managedContextState.rasterPassRequests.size() == 1u
|
||||
? context.passName
|
||||
: Rendering::BuildRenderGraphSequencePassName(
|
||||
context.passName,
|
||||
passIndex);
|
||||
const Rendering::RenderGraphTextureHandle resolvedSourceColor =
|
||||
request.sourceColorTexture.IsValid()
|
||||
? request.sourceColorTexture
|
||||
: currentSourceColor;
|
||||
std::vector<Rendering::RenderGraphTextureHandle>
|
||||
resolvedColorTargets =
|
||||
request.colorTargets;
|
||||
if (!ResolveManagedPrimaryColorTarget(resolvedColorTargets)
|
||||
.IsValid()) {
|
||||
const bool isLastPass =
|
||||
passIndex + 1u ==
|
||||
managedContextState.rasterPassRequests.size();
|
||||
const Rendering::RenderGraphTextureHandle resolvedOutputColor =
|
||||
isLastPass
|
||||
? finalOutputColor
|
||||
: context.graphBuilder.CreateTransientTexture(
|
||||
resolvedPassName + ".Color",
|
||||
Rendering::BuildFullscreenTransientTextureDesc(
|
||||
context.surfaceTemplate));
|
||||
resolvedColorTargets = { resolvedOutputColor };
|
||||
}
|
||||
if (!RecordManagedFullscreenRasterPass(
|
||||
context,
|
||||
*pass,
|
||||
resolvedSourceColor,
|
||||
resolvedColorTargets,
|
||||
request.readTextures,
|
||||
resolvedPassName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
currentSourceColor =
|
||||
ResolveManagedPrimaryColorTarget(
|
||||
resolvedColorTargets);
|
||||
}
|
||||
|
||||
return Rendering::RecordRenderPipelineStageFullscreenPassSequence(
|
||||
context,
|
||||
passes);
|
||||
return true;
|
||||
}
|
||||
|
||||
Rendering::NativeSceneRenderer* ResolveSceneRenderer() {
|
||||
@@ -3414,6 +3707,308 @@ int32_t InternalCall_Rendering_ScriptableRenderContext_GetStage(
|
||||
: static_cast<int32_t>(Rendering::CameraFrameStage::MainScene);
|
||||
}
|
||||
|
||||
int32_t InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
|
||||
uint64_t nativeHandle) {
|
||||
const ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
return EncodeManagedRenderGraphTextureHandle(
|
||||
ResolveManagedScriptableRenderContextSourceColorTexture(
|
||||
state));
|
||||
}
|
||||
|
||||
int32_t InternalCall_Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle(
|
||||
uint64_t nativeHandle) {
|
||||
const ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
return EncodeManagedRenderGraphTextureHandle(
|
||||
ResolveManagedScriptableRenderContextPrimaryColorTarget(
|
||||
state));
|
||||
}
|
||||
|
||||
int32_t InternalCall_Rendering_ScriptableRenderContext_GetDepthTargetHandle(
|
||||
uint64_t nativeHandle) {
|
||||
const ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
return EncodeManagedRenderGraphTextureHandle(
|
||||
ResolveManagedScriptableRenderContextDepthTarget(
|
||||
state));
|
||||
}
|
||||
|
||||
int32_t InternalCall_Rendering_ScriptableRenderContext_CreateTransientTexture(
|
||||
uint64_t nativeHandle,
|
||||
MonoString* name,
|
||||
ManagedRenderGraphTextureDescData* descData) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr ||
|
||||
descData == nullptr) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const auto* const desc =
|
||||
reinterpret_cast<const Rendering::RenderGraphTextureDesc*>(
|
||||
descData);
|
||||
if (!desc->IsValid()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle handle =
|
||||
state->graphContext->graphBuilder.CreateTransientTexture(
|
||||
Containers::String(MonoStringToUtf8(name).c_str()),
|
||||
*desc);
|
||||
return EncodeManagedRenderGraphTextureHandle(handle);
|
||||
}
|
||||
|
||||
int32_t
|
||||
InternalCall_Rendering_ScriptableRenderContext_CreateFullscreenTransientColorTexture(
|
||||
uint64_t nativeHandle,
|
||||
MonoString* name) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle handle =
|
||||
state->graphContext->graphBuilder.CreateTransientTexture(
|
||||
Containers::String(MonoStringToUtf8(name).c_str()),
|
||||
Rendering::BuildFullscreenTransientTextureDesc(
|
||||
state->graphContext->surfaceTemplate));
|
||||
return EncodeManagedRenderGraphTextureHandle(handle);
|
||||
}
|
||||
|
||||
int32_t
|
||||
InternalCall_Rendering_ScriptableRenderContext_CreateFullscreenTransientDepthTexture(
|
||||
uint64_t nativeHandle,
|
||||
MonoString* name) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle handle =
|
||||
state->graphContext->graphBuilder.CreateTransientTexture(
|
||||
Containers::String(MonoStringToUtf8(name).c_str()),
|
||||
BuildManagedFullscreenTransientDepthTextureDesc(
|
||||
state->graphContext->surfaceTemplate));
|
||||
return EncodeManagedRenderGraphTextureHandle(handle);
|
||||
}
|
||||
|
||||
uint64_t InternalCall_Rendering_ScriptableRenderContext_BeginRasterPass(
|
||||
uint64_t nativeHandle,
|
||||
MonoString* passName) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr ||
|
||||
!Rendering::IsCameraFrameFullscreenSequenceStage(state->stage)) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
const Containers::String passNameString(
|
||||
MonoStringToUtf8(passName).c_str());
|
||||
if (passNameString.Empty()) {
|
||||
return 0u;
|
||||
}
|
||||
|
||||
uint64_t rasterPassHandle =
|
||||
state->nextPendingRasterPassHandle++;
|
||||
if (rasterPassHandle == 0u) {
|
||||
rasterPassHandle =
|
||||
state->nextPendingRasterPassHandle++;
|
||||
}
|
||||
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest
|
||||
request = {};
|
||||
request.passName = passNameString;
|
||||
state->pendingRasterPassRequests[rasterPassHandle] =
|
||||
std::move(request);
|
||||
return rasterPassHandle;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_SetRasterPassSourceColorTexture(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle,
|
||||
int32_t sourceTextureHandle) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
const request =
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
state,
|
||||
rasterPassHandle);
|
||||
if (request == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle sourceColorTexture =
|
||||
DecodeManagedRenderGraphTextureHandle(
|
||||
sourceTextureHandle);
|
||||
if (!sourceColorTexture.IsValid()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
request->sourceColorTexture = sourceColorTexture;
|
||||
return 1;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_AddRasterPassReadTexture(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle,
|
||||
int32_t textureHandle) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
const request =
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
state,
|
||||
rasterPassHandle);
|
||||
if (request == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle readTexture =
|
||||
DecodeManagedRenderGraphTextureHandle(
|
||||
textureHandle);
|
||||
if (!readTexture.IsValid()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
request->readTextures.push_back(readTexture);
|
||||
return 1;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_SetRasterPassColorAttachment(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle,
|
||||
int32_t colorAttachmentIndex,
|
||||
int32_t textureHandle) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
const request =
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
state,
|
||||
rasterPassHandle);
|
||||
if (request == nullptr ||
|
||||
colorAttachmentIndex < 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Rendering::RenderGraphTextureHandle colorAttachment =
|
||||
DecodeManagedRenderGraphTextureHandle(
|
||||
textureHandle);
|
||||
if (!colorAttachment.IsValid()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (request->colorTargets.size() <=
|
||||
static_cast<size_t>(colorAttachmentIndex)) {
|
||||
request->colorTargets.resize(
|
||||
static_cast<size_t>(colorAttachmentIndex) + 1u);
|
||||
}
|
||||
|
||||
request->colorTargets[static_cast<size_t>(colorAttachmentIndex)] =
|
||||
colorAttachment;
|
||||
return 1;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_SetRasterPassColorScaleFullscreenExecution(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle,
|
||||
XCEngine::Math::Vector4* vectorPayload) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
const request =
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
state,
|
||||
rasterPassHandle);
|
||||
if (request == nullptr ||
|
||||
vectorPayload == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
request->passDesc =
|
||||
Rendering::FullscreenPassDesc::MakeColorScale(
|
||||
*vectorPayload);
|
||||
return 1;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_SetRasterPassShaderVectorFullscreenExecution(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle,
|
||||
MonoString* shaderPath,
|
||||
MonoString* shaderPassName,
|
||||
XCEngine::Math::Vector4* vectorPayload) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest*
|
||||
const request =
|
||||
FindPendingManagedRasterPassRecordRequest(
|
||||
state,
|
||||
rasterPassHandle);
|
||||
if (request == nullptr ||
|
||||
vectorPayload == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Containers::String shaderPathString(
|
||||
MonoStringToUtf8(shaderPath).c_str());
|
||||
if (shaderPathString.Empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
request->passDesc =
|
||||
Rendering::FullscreenPassDesc::MakeShaderVector(
|
||||
shaderPathString,
|
||||
*vectorPayload,
|
||||
Containers::String(MonoStringToUtf8(shaderPassName).c_str()));
|
||||
return request->passDesc.IsValid()
|
||||
? 1
|
||||
: 0;
|
||||
}
|
||||
|
||||
mono_bool InternalCall_Rendering_ScriptableRenderContext_CommitRasterPass(
|
||||
uint64_t nativeHandle,
|
||||
uint64_t rasterPassHandle) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr ||
|
||||
!Rendering::IsCameraFrameFullscreenSequenceStage(state->stage)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto it =
|
||||
state->pendingRasterPassRequests.find(
|
||||
rasterPassHandle);
|
||||
if (it == state->pendingRasterPassRequests.end()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ManagedScriptableRenderContextState::RasterPassRecordRequest
|
||||
request = std::move(it->second);
|
||||
state->pendingRasterPassRequests.erase(it);
|
||||
if (!request.passDesc.IsValid() ||
|
||||
!ResolveManagedPrimaryColorTarget(request.colorTargets)
|
||||
.IsValid()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->rasterPassRequests.push_back(std::move(request));
|
||||
return 1;
|
||||
}
|
||||
|
||||
int32_t InternalCall_Rendering_ScriptableRenderContext_GetStageColorSource(
|
||||
uint64_t nativeHandle) {
|
||||
const ManagedScriptableRenderContextState* const state =
|
||||
@@ -3974,50 +4569,6 @@ InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint(
|
||||
: 0;
|
||||
}
|
||||
|
||||
mono_bool
|
||||
InternalCall_Rendering_ScriptableRenderContext_RecordFullscreenPass(
|
||||
uint64_t nativeHandle,
|
||||
int32_t passType,
|
||||
MonoString* shaderPath,
|
||||
MonoString* passName,
|
||||
XCEngine::Math::Vector4* vectorPayload) {
|
||||
ManagedScriptableRenderContextState* const state =
|
||||
FindManagedScriptableRenderContextState(nativeHandle);
|
||||
if (state == nullptr ||
|
||||
state->graphContext == nullptr ||
|
||||
!Rendering::IsCameraFrameFullscreenSequenceStage(state->stage)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Rendering::FullscreenPassDesc passDesc = {};
|
||||
switch (static_cast<Rendering::FullscreenPassType>(passType)) {
|
||||
case Rendering::FullscreenPassType::ColorScale:
|
||||
if (vectorPayload == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
passDesc =
|
||||
Rendering::FullscreenPassDesc::MakeColorScale(*vectorPayload);
|
||||
break;
|
||||
case Rendering::FullscreenPassType::ShaderVector:
|
||||
if (vectorPayload == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
passDesc = Rendering::FullscreenPassDesc::MakeShaderVector(
|
||||
Containers::String(MonoStringToUtf8(shaderPath).c_str()),
|
||||
*vectorPayload,
|
||||
Containers::String(MonoStringToUtf8(passName).c_str()));
|
||||
if (!passDesc.IsValid()) {
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
state->queuedFullscreenPasses.push_back(passDesc);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int32_t
|
||||
InternalCall_Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount(
|
||||
uint64_t nativeHandle) {
|
||||
@@ -4299,6 +4850,19 @@ void RegisterInternalCalls() {
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_SetRenderPipelineAsset", reinterpret_cast<const void*>(&InternalCall_Rendering_SetRenderPipelineAsset));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_GetRenderPipelineAsset", reinterpret_cast<const void*>(&InternalCall_Rendering_GetRenderPipelineAsset));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetStage));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetSourceColorTextureHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetDepthTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetDepthTargetHandle));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_CreateTransientTexture", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_CreateTransientTexture));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_CreateFullscreenTransientColorTexture", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_CreateFullscreenTransientColorTexture));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_CreateFullscreenTransientDepthTexture", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_CreateFullscreenTransientDepthTexture));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_BeginRasterPass", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_BeginRasterPass));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_SetRasterPassSourceColorTexture", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_SetRasterPassSourceColorTexture));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_AddRasterPassReadTexture", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_AddRasterPassReadTexture));
|
||||
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_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));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetMainDirectionalShadowEnabled", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetMainDirectionalShadowEnabled));
|
||||
@@ -4352,7 +4916,6 @@ void RegisterInternalCalls() {
|
||||
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_RecordSceneInjectionPoint", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordFullscreenPass", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordFullscreenPass));
|
||||
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));
|
||||
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor));
|
||||
|
||||
Reference in New Issue
Block a user