#ifndef CORE_SHADER_RECOMPILER_SHADERDISKCACHE_HPP #define CORE_SHADER_RECOMPILER_SHADERDISKCACHE_HPP #include "CompiledVariant.hpp" #include "IntermediateRepresentation/IrMetadata/ResourcePlan.hpp" #include #include #include #include #include #include #include namespace ShaderRecompiler::ShaderDiskCache { inline constexpr std::uint32_t FormatVersion = 44; enum class LoadStatus { Loaded, Absent, KeyMismatch, Rejected, }; struct Counters { std::uint64_t hits = 0; std::uint64_t misses = 0; std::uint64_t writes = 0; std::uint64_t loadFailures = 0; std::uint64_t writeFailures = 0; std::uint64_t bytesRead = 0; std::uint64_t bytesWritten = 0; std::uint64_t planHits = 0; std::uint64_t planMisses = 0; std::uint64_t planWrites = 0; std::uint64_t planLoadFailures = 0; std::uint64_t prebuiltHits = 0; std::uint64_t prebuiltMisses = 0; std::uint64_t prebuiltRejected = 0; std::uint64_t lookupNanoseconds = 0; std::uint64_t readNanoseconds = 0; std::uint64_t decodeNanoseconds = 0; std::uint64_t loadNanoseconds = 0; std::uint64_t maxLoadNanoseconds = 0; std::uint64_t prebuiltBytesRead = 0; std::uint64_t prebuiltLoadNanoseconds = 0; }; [[nodiscard]] std::uint64_t SourceVersion(); void BuildKey(const RecompileRequest& request, std::uint32_t hostSubgroupSize, std::vector& key); [[nodiscard]] std::string EntryName(std::span key); void EncodeResult(const RecompileResult& result, std::vector& out); [[nodiscard]] bool DecodeResult(std::span bytes, RecompileResult& result, std::shared_ptr owner = nullptr); [[nodiscard]] std::vector EncodeEntry(std::span key, const CompiledVariant& variant); [[nodiscard]] LoadStatus DecodeEntry(std::span file, std::span key, CompiledVariant& variant, std::shared_ptr owner = nullptr); void BuildPlanKey(const RecompileRequest& request, std::uint32_t hostSubgroupSize, std::vector& key); [[nodiscard]] bool EncodePlan(const IrResourcePlan& plan, std::vector& out); [[nodiscard]] bool DecodePlan(std::span bytes, IrResourcePlan& plan); [[nodiscard]] std::vector EncodePlanEntry(std::span key, const IrResourcePlan& plan); [[nodiscard]] LoadStatus DecodePlanEntry(std::span file, std::span key, IrResourcePlan& plan); [[nodiscard]] bool Enabled(); [[nodiscard]] std::filesystem::path EntryDirectory(); [[nodiscard]] bool Load(std::span key, CompiledVariant& variant); void Store(std::vector key, std::shared_ptr variant); [[nodiscard]] std::shared_ptr Persist(std::span key, const CompiledVariant& variant); [[nodiscard]] bool LoadPlan(std::span key, IrResourcePlan& plan); void StorePlan(std::vector key, std::shared_ptr plan); void Flush(); void Shutdown(); [[nodiscard]] unsigned Writers(); [[nodiscard]] Counters Totals(); } #endif