From 108edc096ee0fa54c15002283421c183259a84af Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 21 May 2026 17:43:17 +1000 Subject: [PATCH] Separating build queue --- ...erBuild.cpp => RuntimeLayerBuildQueue.cpp} | 108 ---------------- src/app/RuntimeLayerControllerStartup.cpp | 115 ++++++++++++++++++ 2 files changed, 115 insertions(+), 108 deletions(-) rename src/app/{RuntimeLayerControllerBuild.cpp => RuntimeLayerBuildQueue.cpp} (56%) create mode 100644 src/app/RuntimeLayerControllerStartup.cpp diff --git a/src/app/RuntimeLayerControllerBuild.cpp b/src/app/RuntimeLayerBuildQueue.cpp similarity index 56% rename from src/app/RuntimeLayerControllerBuild.cpp rename to src/app/RuntimeLayerBuildQueue.cpp index f14523e..f9c9018 100644 --- a/src/app/RuntimeLayerControllerBuild.cpp +++ b/src/app/RuntimeLayerBuildQueue.cpp @@ -1,12 +1,7 @@ #include "RuntimeLayerController.h" -#include "AppConfigProvider.h" -#include "RuntimeJson.h" #include "../logging/Logger.h" -#include -#include -#include #include namespace RenderCadenceCompositor @@ -16,103 +11,6 @@ namespace constexpr std::size_t kMaxConcurrentRuntimeShaderBuilds = 2; } -bool RuntimeLayerController::LoadSupportedShaderCatalog(const std::string& shaderLibrary, unsigned maxTemporalHistoryFrames) -{ - const std::filesystem::path shaderRoot = FindRepoPath(shaderLibrary); - std::string error; - if (!mShaderCatalog.Load(shaderRoot, maxTemporalHistoryFrames, error)) - { - LogWarning("runtime-shader", "Supported shader catalog is empty: " + error); - return false; - } - - std::size_t preparedFontAtlases = 0; - for (const auto& entry : mShaderCatalog.FontAtlases()) - preparedFontAtlases += entry.second.size(); - - Log( - "runtime-shader", - "Supported shader catalog loaded with " + std::to_string(mShaderCatalog.Shaders().size()) + - " shader(s), prepared " + std::to_string(preparedFontAtlases) + " font atlas asset(s)."); - return true; -} - -void RuntimeLayerController::InitializeLayerModel(std::string& runtimeShaderId) -{ - if (InitializeLayerModelFromRuntimeState()) - return; - - if (!runtimeShaderId.empty()) - Log("runtime-state", "Falling back to configured runtime shader '" + runtimeShaderId + "'."); - - std::lock_guard lock(mRuntimeLayerMutex); - std::string error; - if (!mRuntimeLayerModel.InitializeSingleLayer(mShaderCatalog, runtimeShaderId, error)) - { - LogWarning("runtime-shader", error + " Runtime shader build disabled."); - runtimeShaderId.clear(); - mRuntimeLayerModel.Clear(); - } -} - -bool RuntimeLayerController::InitializeLayerModelFromRuntimeState() -{ - const std::filesystem::path runtimeStatePath = mRuntimeStatePath.empty() ? ResolveRuntimeStatePath() : mRuntimeStatePath; - if (runtimeStatePath.empty()) - return false; - if (!std::filesystem::exists(runtimeStatePath)) - return false; - - std::ifstream input(runtimeStatePath, std::ios::binary); - if (!input) - { - LogWarning("runtime-state", "Could not open runtime state file: " + runtimeStatePath.string()); - return false; - } - - std::ostringstream buffer; - buffer << input.rdbuf(); - - JsonValue runtimeState; - std::string error; - if (!ParseJson(buffer.str(), runtimeState, error)) - { - LogWarning("runtime-state", "Could not parse runtime state file: " + error); - return false; - } - - { - std::lock_guard lock(mRuntimeLayerMutex); - if (!mRuntimeLayerModel.InitializeFromRuntimeState(mShaderCatalog, runtimeState, error)) - { - LogWarning("runtime-state", "Could not restore runtime state: " + error); - return false; - } - } - - Log("runtime-state", "Restored runtime layer stack from " + runtimeStatePath.string() + "."); - return true; -} - -std::filesystem::path RuntimeLayerController::ResolveRuntimeStatePath() const -{ - const std::filesystem::path runtimeDirectory = FindRepoPath("runtime"); - if (!runtimeDirectory.empty()) - return runtimeDirectory / "runtime_state.json"; - return std::filesystem::current_path() / "runtime" / "runtime_state.json"; -} - -void RuntimeLayerController::RequestRuntimeStatePersistence() -{ - std::lock_guard lock(mRuntimeLayerMutex); - RequestRuntimeStatePersistenceLocked(); -} - -void RuntimeLayerController::RequestRuntimeStatePersistenceLocked() -{ - mPersistenceWriter.RequestSave(mRuntimeLayerModel.Snapshot()); -} - void RuntimeLayerController::StartLayerShaderBuild(const std::string& layerId, const std::string& shaderId, bool preserveExistingRenderArtifact) { CleanupRetiredShaderBuilds(); @@ -255,10 +153,4 @@ void RuntimeLayerController::StopAllRuntimeShaderBuilds() for (auto& bridge : retiredBuilds) bridge->Stop(); } - -std::string RuntimeLayerController::FirstRuntimeLayerId() const -{ - std::lock_guard lock(mRuntimeLayerMutex); - return mRuntimeLayerModel.FirstLayerId(); -} } diff --git a/src/app/RuntimeLayerControllerStartup.cpp b/src/app/RuntimeLayerControllerStartup.cpp new file mode 100644 index 0000000..841f077 --- /dev/null +++ b/src/app/RuntimeLayerControllerStartup.cpp @@ -0,0 +1,115 @@ +#include "RuntimeLayerController.h" + +#include "AppConfigProvider.h" +#include "RuntimeJson.h" +#include "../logging/Logger.h" + +#include +#include +#include + +namespace RenderCadenceCompositor +{ +bool RuntimeLayerController::LoadSupportedShaderCatalog(const std::string& shaderLibrary, unsigned maxTemporalHistoryFrames) +{ + const std::filesystem::path shaderRoot = FindRepoPath(shaderLibrary); + std::string error; + if (!mShaderCatalog.Load(shaderRoot, maxTemporalHistoryFrames, error)) + { + LogWarning("runtime-shader", "Supported shader catalog is empty: " + error); + return false; + } + + std::size_t preparedFontAtlases = 0; + for (const auto& entry : mShaderCatalog.FontAtlases()) + preparedFontAtlases += entry.second.size(); + + Log( + "runtime-shader", + "Supported shader catalog loaded with " + std::to_string(mShaderCatalog.Shaders().size()) + + " shader(s), prepared " + std::to_string(preparedFontAtlases) + " font atlas asset(s)."); + return true; +} + +void RuntimeLayerController::InitializeLayerModel(std::string& runtimeShaderId) +{ + if (InitializeLayerModelFromRuntimeState()) + return; + + if (!runtimeShaderId.empty()) + Log("runtime-state", "Falling back to configured runtime shader '" + runtimeShaderId + "'."); + + std::lock_guard lock(mRuntimeLayerMutex); + std::string error; + if (!mRuntimeLayerModel.InitializeSingleLayer(mShaderCatalog, runtimeShaderId, error)) + { + LogWarning("runtime-shader", error + " Runtime shader build disabled."); + runtimeShaderId.clear(); + mRuntimeLayerModel.Clear(); + } +} + +bool RuntimeLayerController::InitializeLayerModelFromRuntimeState() +{ + const std::filesystem::path runtimeStatePath = mRuntimeStatePath.empty() ? ResolveRuntimeStatePath() : mRuntimeStatePath; + if (runtimeStatePath.empty()) + return false; + if (!std::filesystem::exists(runtimeStatePath)) + return false; + + std::ifstream input(runtimeStatePath, std::ios::binary); + if (!input) + { + LogWarning("runtime-state", "Could not open runtime state file: " + runtimeStatePath.string()); + return false; + } + + std::ostringstream buffer; + buffer << input.rdbuf(); + + JsonValue runtimeState; + std::string error; + if (!ParseJson(buffer.str(), runtimeState, error)) + { + LogWarning("runtime-state", "Could not parse runtime state file: " + error); + return false; + } + + { + std::lock_guard lock(mRuntimeLayerMutex); + if (!mRuntimeLayerModel.InitializeFromRuntimeState(mShaderCatalog, runtimeState, error)) + { + LogWarning("runtime-state", "Could not restore runtime state: " + error); + return false; + } + } + + Log("runtime-state", "Restored runtime layer stack from " + runtimeStatePath.string() + "."); + return true; +} + +std::filesystem::path RuntimeLayerController::ResolveRuntimeStatePath() const +{ + const std::filesystem::path runtimeDirectory = FindRepoPath("runtime"); + if (!runtimeDirectory.empty()) + return runtimeDirectory / "runtime_state.json"; + return std::filesystem::current_path() / "runtime" / "runtime_state.json"; +} + +void RuntimeLayerController::RequestRuntimeStatePersistence() +{ + std::lock_guard lock(mRuntimeLayerMutex); + RequestRuntimeStatePersistenceLocked(); +} + +void RuntimeLayerController::RequestRuntimeStatePersistenceLocked() +{ + mPersistenceWriter.RequestSave(mRuntimeLayerModel.Snapshot()); +} + +std::string RuntimeLayerController::FirstRuntimeLayerId() const +{ + std::lock_guard lock(mRuntimeLayerMutex); + return mRuntimeLayerModel.FirstLayerId(); +} +}