refactor(rendering): formalize pipeline selection and engine asset discovery

This commit is contained in:
2026-04-19 04:31:48 +08:00
parent 78bcd2e9ca
commit 48bfde28e3
17 changed files with 294 additions and 121 deletions

View File

@@ -25,19 +25,19 @@ public:
return m_environmentGeneration;
}
void SetRenderPipelineAssetDescriptor(
void SetConfiguredRenderPipelineAssetDescriptor(
const Pipelines::ManagedRenderPipelineAssetDescriptor& descriptor);
void ClearRenderPipelineAssetDescriptor();
void ClearConfiguredRenderPipelineAssetDescriptor();
Pipelines::ManagedRenderPipelineAssetDescriptor
GetRenderPipelineAssetDescriptor() const {
return m_renderPipelineAssetDescriptor;
GetConfiguredRenderPipelineAssetDescriptor() const {
return m_configuredRenderPipelineAssetDescriptor;
}
private:
void BumpEnvironmentGeneration();
Pipelines::ManagedRenderPipelineAssetDescriptor
m_renderPipelineAssetDescriptor = {};
m_configuredRenderPipelineAssetDescriptor = {};
std::shared_ptr<const Pipelines::ManagedRenderPipelineBridge>
m_managedRenderPipelineBridge = nullptr;
size_t m_managedRenderPipelineBridgeGeneration = 1u;

View File

@@ -61,7 +61,7 @@ private:
ResolveManagedAssetRuntime() const;
ManagedRenderPipelineAssetDescriptor m_descriptor;
ScriptableRenderPipelineHostAsset m_fallbackAsset;
ScriptableRenderPipelineHostAsset m_executionHostAsset;
mutable std::shared_ptr<const class ManagedRenderPipelineAssetRuntime>
m_managedAssetRuntime = nullptr;
mutable size_t m_managedAssetRuntimeBridgeGeneration = 0u;
@@ -108,12 +108,13 @@ std::shared_ptr<const ManagedRenderPipelineBridge>
GetManagedRenderPipelineBridge();
size_t GetManagedRenderPipelineEnvironmentGeneration();
void SetManagedRenderPipelineAssetDescriptor(
void SetConfiguredManagedRenderPipelineAssetDescriptor(
const ManagedRenderPipelineAssetDescriptor& descriptor);
void ClearManagedRenderPipelineAssetDescriptor();
ManagedRenderPipelineAssetDescriptor GetManagedRenderPipelineAssetDescriptor();
void ClearConfiguredManagedRenderPipelineAssetDescriptor();
ManagedRenderPipelineAssetDescriptor
GetConfiguredManagedRenderPipelineAssetDescriptor();
std::shared_ptr<const RenderPipelineAsset>
CreateManagedOrDefaultScriptableRenderPipelineAsset();
CreateConfiguredManagedRenderPipelineAsset();
} // namespace Pipelines
} // namespace Rendering

View File

@@ -34,6 +34,11 @@ class MonoManagedRenderPipelineStageRecorder;
class MonoScriptRuntime : public IScriptRuntime {
public:
struct ManagedAssemblyDescriptor {
std::string name;
std::filesystem::path path;
};
struct Settings {
std::filesystem::path assemblyDirectory;
std::filesystem::path corlibDirectory;
@@ -41,6 +46,7 @@ public:
std::filesystem::path appAssemblyPath;
std::string coreAssemblyName = "XCEngine.ScriptCore";
std::string appAssemblyName = "GameScripts";
std::vector<ManagedAssemblyDescriptor> engineAssemblies;
std::string baseNamespace = "XCEngine";
std::string baseClassName = "MonoBehaviour";
};
@@ -179,6 +185,11 @@ private:
uint32_t gcHandle = 0;
};
struct LoadedManagedAssemblyData {
MonoAssembly* assembly = nullptr;
MonoImage* image = nullptr;
};
void ResolveSettings();
bool InitializeRootDomain();
bool CreateAppDomain();
@@ -186,6 +197,11 @@ private:
void SetCurrentDomain() const;
bool LoadAssemblies();
bool LoadAssemblyImage(
const ManagedAssemblyDescriptor& descriptor,
const char* roleLabel,
MonoAssembly*& outAssembly,
MonoImage*& outImage);
bool DiscoverScriptClasses();
void DiscoverScriptClassesInImage(const std::string& assemblyName, MonoImage* image);
void DiscoverRenderPipelineAssetClassesInImage(
@@ -223,6 +239,7 @@ private:
void ClearManagedInstances();
void ClearExternalManagedObjects();
void ClearClassCache();
MonoImage* FindLoadedAssemblyImage(const std::string& assemblyName) const;
bool ResolveManagedClass(
const std::string& assemblyName,
const std::string& namespaceName,
@@ -296,6 +313,8 @@ private:
std::unordered_map<std::string, ClassMetadata> m_classes;
std::vector<ScriptClassDescriptor> m_renderPipelineAssetClasses;
std::unordered_map<std::string, LoadedManagedAssemblyData>
m_loadedManagedAssemblies;
std::unordered_map<InstanceKey, InstanceData, InstanceKeyHasher> m_instances;
std::unordered_map<uint32_t, ExternalManagedObjectData> m_externalManagedObjects;
std::shared_ptr<void> m_runtimeLifetimeToken;