#pragma once #include "ShaderDiskCache.hpp" #include namespace ShaderRecompiler::ShaderDiskCache { inline constexpr std::uint64_t PackMagic = 0x314b434150535041ull; struct PackHeader { std::uint64_t magic = PackMagic; std::uint64_t sourceVersion = 0; std::uint64_t fileBytes = 0; std::uint64_t entryCount = 0; std::uint64_t indexHash = 0; }; struct PackRecord { std::array hash{}; std::uint64_t offset = 0; std::uint64_t size = 0; }; static_assert(sizeof(PackHeader) == 40 && sizeof(PackRecord) == 32); struct PackLoadTimings { std::uint64_t lookupNanoseconds = 0; std::uint64_t decodeNanoseconds = 0; std::uint64_t bytes = 0; }; [[nodiscard]] std::array PackKeyHash(std::span key); [[nodiscard]] std::vector PrebuiltCachePaths(const std::filesystem::path& cacheRoot); class CachePack { public: explicit CachePack(const std::filesystem::path& path); ~CachePack(); CachePack(const CachePack&) = delete; CachePack& operator=(const CachePack&) = delete; [[nodiscard]] bool Valid() const { return error.empty(); } [[nodiscard]] const std::string& Error() const { return error; } [[nodiscard]] std::size_t Count() const { return records.size(); } [[nodiscard]] LoadStatus Load(std::span key, CompiledVariant& variant, PackLoadTimings& timings) const; private: void Validate(); std::span file; std::span records; std::string error; void* mapping = nullptr; void* fileHandle = nullptr; }; }