diff --git a/src/dxvk/dxvk_include.h b/src/dxvk/dxvk_include.h index 11690202f..c1a1ac21a 100644 --- a/src/dxvk/dxvk_include.h +++ b/src/dxvk/dxvk_include.h @@ -12,6 +12,8 @@ #include "../util/rc/util_rc.h" #include "../util/rc/util_rc_ptr.h" +#include "../util/sha1/sha1_util.h" + #include "../util/sync/sync_spinlock.h" #include "./vulkan/dxvk_vulkan_extensions.h" diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index cbc1558e1..65b962fe9 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -47,6 +47,12 @@ namespace dxvk { const DxvkInterfaceSlots& iface, const SpirvCodeBuffer& code) : m_stage(stage), m_code(code), m_interface(iface) { + // Compute shader hash once + m_hash = Sha1Hash::compute( + reinterpret_cast(code.data()), + code.size()); + + // Write back resource slot infos for (uint32_t i = 0; i < slotCount; i++) m_slots.push_back(slotInfos[i]); diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index 06ff35de8..2387fe5c4 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -170,10 +170,21 @@ namespace dxvk { m_debugName = name; } + /** + * \brief Shader hash + * + * The SHA-1 hash of the generated SPIR-V shader. + * \returns SHA-1 hash of this shader + */ + Sha1Hash hash() const { + return m_hash; + } + private: VkShaderStageFlagBits m_stage; SpirvCodeBuffer m_code; + Sha1Hash m_hash; std::vector m_slots; std::vector m_idOffsets;