rendering: extract default native scene backend
This commit is contained in:
@@ -15,32 +15,49 @@ namespace Internal {
|
||||
|
||||
namespace {
|
||||
|
||||
class DefaultNativePipelineBackendAsset final : public RenderPipelineAsset {
|
||||
public:
|
||||
std::unique_ptr<RenderPipeline> CreatePipeline() const override {
|
||||
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
||||
}
|
||||
|
||||
FinalColorSettings GetDefaultFinalColorSettings() const override {
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
std::shared_ptr<const RenderPipelineAsset>
|
||||
CreateBuiltinForwardPipelineRendererAsset() {
|
||||
CreateDefaultNativePipelineBackendAsset() {
|
||||
static const std::shared_ptr<const RenderPipelineAsset>
|
||||
s_builtinForwardPipelineAsset =
|
||||
std::make_shared<Pipelines::BuiltinForwardPipelineAsset>();
|
||||
return s_builtinForwardPipelineAsset;
|
||||
s_defaultNativePipelineBackendAsset =
|
||||
std::make_shared<DefaultNativePipelineBackendAsset>();
|
||||
return s_defaultNativePipelineBackendAsset;
|
||||
}
|
||||
|
||||
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
|
||||
std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
|
||||
const std::shared_ptr<const RenderPipelineAsset>& asset) {
|
||||
if (asset == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderPipeline> pipeline = asset->CreatePipeline();
|
||||
if (pipeline == nullptr) {
|
||||
return asset->CreatePipeline();
|
||||
}
|
||||
|
||||
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
|
||||
const std::shared_ptr<const RenderPipelineAsset>& asset) {
|
||||
std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
||||
TryCreatePipelineBackendFromAsset(asset);
|
||||
if (pipelineBackend == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
SceneDrawBackend* const sceneDrawBackend =
|
||||
dynamic_cast<SceneDrawBackend*>(pipeline.get());
|
||||
dynamic_cast<SceneDrawBackend*>(pipelineBackend.get());
|
||||
if (sceneDrawBackend == nullptr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
(void)pipeline.release();
|
||||
(void)pipelineBackend.release();
|
||||
return std::unique_ptr<SceneDrawBackend>(sceneDrawBackend);
|
||||
}
|
||||
|
||||
@@ -56,7 +73,7 @@ std::shared_ptr<const RenderPipelineAsset> CreateFallbackRenderPipelineAsset() {
|
||||
|
||||
std::shared_ptr<const RenderPipelineAsset> CreateDefaultPipelineBackendAsset() {
|
||||
static const std::shared_ptr<const RenderPipelineAsset> s_defaultAsset =
|
||||
CreateBuiltinForwardPipelineRendererAsset();
|
||||
CreateDefaultNativePipelineBackendAsset();
|
||||
return s_defaultAsset;
|
||||
}
|
||||
|
||||
@@ -128,6 +145,39 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
|
||||
return std::make_unique<Pipelines::ScriptableRenderPipelineHost>();
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderPipelineBackend> CreatePipelineBackendFromAsset(
|
||||
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
|
||||
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
|
||||
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
||||
TryCreatePipelineBackendFromAsset(preferredAsset)) {
|
||||
if (outResolvedAsset != nullptr) {
|
||||
*outResolvedAsset = preferredAsset;
|
||||
}
|
||||
return pipelineBackend;
|
||||
}
|
||||
|
||||
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
|
||||
CreateDefaultPipelineBackendAsset();
|
||||
if (defaultAsset != nullptr &&
|
||||
defaultAsset != preferredAsset) {
|
||||
if (std::unique_ptr<RenderPipelineBackend> pipelineBackend =
|
||||
TryCreatePipelineBackendFromAsset(defaultAsset)) {
|
||||
if (outResolvedAsset != nullptr) {
|
||||
*outResolvedAsset = defaultAsset;
|
||||
}
|
||||
return pipelineBackend;
|
||||
}
|
||||
}
|
||||
|
||||
if (outResolvedAsset != nullptr) {
|
||||
*outResolvedAsset =
|
||||
defaultAsset != nullptr
|
||||
? defaultAsset
|
||||
: preferredAsset;
|
||||
}
|
||||
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
||||
}
|
||||
|
||||
std::unique_ptr<SceneDrawBackend> CreateSceneDrawBackendFromAsset(
|
||||
const std::shared_ptr<const RenderPipelineAsset>& preferredAsset,
|
||||
std::shared_ptr<const RenderPipelineAsset>* outResolvedAsset) {
|
||||
@@ -146,14 +196,7 @@ std::unique_ptr<SceneDrawBackend> CreateSceneDrawBackendFromAsset(
|
||||
}
|
||||
|
||||
std::unique_ptr<SceneDrawBackend> CreateDefaultSceneDrawBackend() {
|
||||
if (std::unique_ptr<SceneDrawBackend> sceneDrawBackend =
|
||||
TryCreateSceneDrawBackendFromAsset(
|
||||
CreateDefaultPipelineBackendAsset());
|
||||
sceneDrawBackend != nullptr) {
|
||||
return sceneDrawBackend;
|
||||
}
|
||||
|
||||
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
||||
return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend();
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user