#pragma once #include "RuntimeCoordinator.h" #include "RuntimeEventPayloads.h" #include #include #include class RenderEngine; struct RuntimeEvent; struct RuntimeEventDispatchResult; class RuntimeEventDispatcher; class RuntimeServices; class RuntimeStore; class ShaderBuildQueue; class VideoBackend; class RuntimeUpdateController { public: RuntimeUpdateController( RuntimeStore& runtimeStore, RuntimeCoordinator& runtimeCoordinator, RuntimeEventDispatcher& runtimeEventDispatcher, RuntimeServices& runtimeServices, RenderEngine& renderEngine, ShaderBuildQueue& shaderBuildQueue, VideoBackend& videoBackend); bool ApplyRuntimeCoordinatorResult(const RuntimeCoordinatorResult& result, std::string* error = nullptr); bool ProcessRuntimeWork(); void RequestShaderBuild(); void BroadcastRuntimeState(); private: void HandleRuntimeStateBroadcastRequested(const RuntimeEvent& event); void HandleShaderBuildRequested(const RuntimeEvent& event); void HandleShaderBuildPrepared(const RuntimeEvent& event); void HandleShaderBuildFailed(const RuntimeEvent& event); void HandleCompileStatusChanged(const RuntimeEvent& event); void HandleRenderResetRequested(const RuntimeEvent& event); bool ConsumeReadyShaderBuild(uint64_t expectedGeneration, bool publishPreparedEvent, bool publishFailureEvent); void PublishShaderBuildLifecycleEvent( RuntimeEventShaderBuildPhase phase, uint64_t generation, unsigned inputWidth, unsigned inputHeight, bool succeeded, const std::string& message); bool ShouldSuppressCoordinatorFollowUp(const RuntimeEvent& event, std::size_t& pendingSuppressions); RuntimeEventDispatchResult DispatchRuntimeEvents(std::size_t maxEvents = 0); RuntimeStore& mRuntimeStore; RuntimeCoordinator& mRuntimeCoordinator; RuntimeEventDispatcher& mRuntimeEventDispatcher; RuntimeServices& mRuntimeServices; RenderEngine& mRenderEngine; ShaderBuildQueue& mShaderBuildQueue; VideoBackend& mVideoBackend; std::size_t mPendingCoordinatorShaderBuildEvents = 0; std::size_t mPendingCoordinatorCompileStatusEvents = 0; std::size_t mPendingCoordinatorRenderResetEvents = 0; };