#include "RuntimeShaderBridge.h" #include RuntimeShaderBridge::~RuntimeShaderBridge() { Stop(); } void RuntimeShaderBridge::Start(const std::string& shaderId, ArtifactCallback onArtifactReady, ErrorCallback onError) { Start(std::string(), shaderId, std::move(onArtifactReady), std::move(onError)); } void RuntimeShaderBridge::Start(const std::string& layerId, const std::string& shaderId, ArtifactCallback onArtifactReady, ErrorCallback onError) { Stop(); if (shaderId.empty()) return; mLayerId = layerId; mOnArtifactReady = std::move(onArtifactReady); mOnError = std::move(onError); mStopping.store(false, std::memory_order_release); mCompiler.StartShaderBuild(shaderId); mThread = std::thread([this]() { ThreadMain(); }); } void RuntimeShaderBridge::Stop() { mStopping.store(true, std::memory_order_release); if (mThread.joinable()) mThread.join(); mCompiler.Stop(); mLayerId.clear(); mOnArtifactReady = ArtifactCallback(); mOnError = ErrorCallback(); } void RuntimeShaderBridge::ThreadMain() { while (!mStopping.load(std::memory_order_acquire)) { RuntimeSlangShaderBuild build; if (mCompiler.TryConsume(build)) { if (build.succeeded) { build.artifact.layerId = mLayerId; if (mOnArtifactReady) mOnArtifactReady(build.artifact); } else if (mOnError) { mOnError(build.message); } return; } std::this_thread::sleep_for(std::chrono::milliseconds(5)); } }