#pragma once #include "RuntimeStore.h" #include #include #include #include struct RuntimeSnapshotVersions { uint64_t renderStateVersion = 0; uint64_t parameterStateVersion = 0; }; struct RuntimeRenderStateSnapshot { RuntimeSnapshotVersions versions; unsigned outputWidth = 0; unsigned outputHeight = 0; std::vector states; }; class RuntimeSnapshotProvider { public: explicit RuntimeSnapshotProvider(RuntimeStore& runtimeStore); bool BuildLayerPassFragmentShaderSources(const std::string& layerId, std::vector& passSources, std::string& error) const; unsigned GetMaxTemporalHistoryFrames() const; RuntimeSnapshotVersions GetVersions() const; void AdvanceFrame(); RuntimeRenderStateSnapshot PublishRenderStateSnapshot(unsigned outputWidth, unsigned outputHeight) const; bool TryPublishRenderStateSnapshot(unsigned outputWidth, unsigned outputHeight, RuntimeRenderStateSnapshot& snapshot) const; bool TryRefreshPublishedSnapshotParameters(RuntimeRenderStateSnapshot& snapshot) const; void RefreshDynamicRenderStateFields(std::vector& states) const; private: bool TryGetPublishedRenderStateSnapshot(unsigned outputWidth, unsigned outputHeight, const RuntimeSnapshotVersions& versions, RuntimeRenderStateSnapshot& snapshot) const; void StorePublishedRenderStateSnapshot(const RuntimeRenderStateSnapshot& snapshot) const; static bool SnapshotMatches(const RuntimeRenderStateSnapshot& snapshot, unsigned outputWidth, unsigned outputHeight, const RuntimeSnapshotVersions& versions); RuntimeStore& mRuntimeStore; mutable std::mutex mPublishedSnapshotMutex; mutable bool mHasPublishedRenderStateSnapshot = false; mutable RuntimeRenderStateSnapshot mPublishedRenderStateSnapshot; };