#pragma once #include #include #include "../dxbc/dxbc_module.h" #include "../dxvk/dxvk_device.h" #include "../d3d10/d3d10_shader.h" #include "../util/sha1/sha1_util.h" #include "../util/util_env.h" #include "d3d11_device_child.h" #include "d3d11_interfaces.h" namespace dxvk { class D3D11Device; /** * \brief Common shader object * * Stores the compiled SPIR-V shader and the SHA-1 * hash of the original DXBC shader, which can be * used to identify the shader. */ class D3D11CommonShader { public: D3D11CommonShader(); D3D11CommonShader( D3D11Device* pDevice, const DxvkShaderKey* pShaderKey, const DxbcModuleInfo* pDxbcModuleInfo, const void* pShaderBytecode, size_t BytecodeLength); ~D3D11CommonShader(); Rc GetShader() const { return m_shader; } Rc GetIcb() const { return m_buffer; } std::string GetName() const { return m_shader->debugName(); } private: Rc m_shader; Rc m_buffer; }; /** * \brief Shader module set * * Some applications may compile the same shader multiple * times, so we should cache the resulting shader modules * and reuse them rather than creating new ones. This * class is thread-safe. */ class D3D11ShaderModuleSet { public: D3D11ShaderModuleSet(); ~D3D11ShaderModuleSet(); HRESULT GetShaderModule( D3D11Device* pDevice, const DxvkShaderKey* pShaderKey, const DxbcModuleInfo* pDxbcModuleInfo, const void* pShaderBytecode, size_t BytecodeLength, D3D11CommonShader* pShader); private: std::mutex m_mutex; std::unordered_map< DxvkShaderKey, D3D11CommonShader, DxvkHash, DxvkEq> m_modules; }; }