#pragma once #include "RuntimeShaderProgram.h" #include "../../runtime/RuntimeLayerModel.h" #include #include #include #include #include #include #include #include #include class HiddenGlWindow; class RuntimeShaderPrepareWorker { public: RuntimeShaderPrepareWorker() = default; RuntimeShaderPrepareWorker(const RuntimeShaderPrepareWorker&) = delete; RuntimeShaderPrepareWorker& operator=(const RuntimeShaderPrepareWorker&) = delete; ~RuntimeShaderPrepareWorker(); bool Start(std::unique_ptr sharedWindow, std::string& error); void Stop(); void Submit(const std::vector& layers); bool TryConsume(RuntimePreparedShaderProgram& preparedProgram); private: struct PrepareRequest { std::string layerId; std::string shaderId; std::string passId; std::string sourceFingerprint; RuntimeShaderArtifact artifact; RuntimeShaderPassArtifact passArtifact; }; void ThreadMain(); static std::string Fingerprint(const RuntimeShaderArtifact& artifact); std::unique_ptr mWindow; std::mutex mMutex; std::condition_variable mCondition; std::deque mRequests; std::deque mCompleted; std::condition_variable mStartupCondition; std::thread mThread; std::atomic mStopping{ false }; std::atomic mStarted{ false }; bool mStartupReady = false; std::string mStartupError; };