From 27d7961db15ed5890d2ad0eff1218e26dcdaf82c Mon Sep 17 00:00:00 2001 From: lucy96chen <47800040+lucy96chen@users.noreply.github.com> Date: Thu, 13 Oct 2022 17:07:54 -0700 Subject: Shader cache index header (#2448) * checkpoint * Added shaderCachePath field to IDevice desc in gfx.slang, gfx-smoke.slang should be functional * ran premake * Revert erroneous commits from rebasing * Added ShaderCacheIndex class header with design details * Header edits * more header edits * Post-rebase premake.bat run to fix solution weirdness; Initialize commitHash to nullptr and check that a commitHash is successfully returned --- source/compiler-core/slang-dxc-compiler.cpp | 17 ++++---- source/slang/slang-shader-cache-index.h | 60 +++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 source/slang/slang-shader-cache-index.h (limited to 'source') diff --git a/source/compiler-core/slang-dxc-compiler.cpp b/source/compiler-core/slang-dxc-compiler.cpp index 6619d000c..52933eaa7 100644 --- a/source/compiler-core/slang-dxc-compiler.cpp +++ b/source/compiler-core/slang-dxc-compiler.cpp @@ -599,16 +599,19 @@ SlangResult DXCDownstreamCompiler::getVersionString(slang::IBlob** outVersionStr versionString.append("."); versionString.append(minor); - char* commitHash; + char* commitHash = nullptr; uint32_t unused; versionInfo2->GetCommitInfo(&unused, &commitHash); + if (commitHash) + { + // Successfully queried the commit hash, append to the version and return. + versionString.append(commitHash); + CoTaskMemFree(commitHash); - versionString.append(commitHash); - CoTaskMemFree(commitHash); - - version = StringBlob::create(versionString.getBuffer()); - *outVersionString = version.detach(); - return SLANG_OK; + version = StringBlob::create(versionString.getBuffer()); + *outVersionString = version.detach(); + return SLANG_OK; + } } } diff --git a/source/slang/slang-shader-cache-index.h b/source/slang/slang-shader-cache-index.h new file mode 100644 index 000000000..530aacf11 --- /dev/null +++ b/source/slang/slang-shader-cache-index.h @@ -0,0 +1,60 @@ +#pragma once +#include "../../slang.h" + +#include "../core/slang-string.h" +#include "../core/slang-linked-list.h" +#include "../core/slang-dictionary.h" + +namespace Slang +{ + class ShaderCacheIndex + { + public: + struct ShaderCacheEntry + { + slang::Digest dependencyBasedDigest; + slang::Digest astBasedDigest; + }; + + ShaderCacheIndex(SlangInt size) + : entryCountLimit(size) + {} + + // Load a previous cache index saved to disk. If not found, create a new cache index + // and save it to disk as filename. + SlangResult loadCacheIndexFromFile(String filename); + + // Fetch the cache entry corresponding to the provided key. If found, move the entry to + // the front of entries and return the entry. Else, return nullptr. + ShaderCacheEntry* findEntry(const slang::Digest& key); + + // Add an entry to the cache with the provided key and contents hashes. If + // adding an entry causes the cache to exceed size limitations, this will also + // delete the least recently used entry. + void addEntry(const slang::Digest& dependencyDigest, const slang::Digest& astDigest); + + // Update the contents hash for the specified entry in the cache and update the + // corresponding file on disk. + void updateEntry(const slang::Digest& dependencyDigest, const slang::Digest& astDigest); + + private: + // Update the cache index on disk. This should be called any time an entry changes. + SlangResult saveCacheIndexToFile(); + + // Delete the last entry from entries and remove its key/value pair from keyToContents + // as well as remove the corresponding file on disk. This should only be used when the + // cache has reached the size limit specified by entryLimit to create space for a new entry. + void deleteEntry(); + + // Dictionary mapping each shader's key to its corresponding node (entry) in the list + // of entries. + Dictionary*> keyToEntry; + + // Linked list containing the entries stored in the shader cache in order + // of most to least recently used. + LinkedList entries; + + // The maximum number of cache entries allowed. + SlangInt entryCountLimit = -1; + } +} -- cgit v1.2.3