mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxbc,d3d11] Don't access shex chunk if it is not defined
This commit is contained in:
parent
d01c9cb6d4
commit
4f90d7bf5f
@ -20,8 +20,6 @@ namespace dxvk {
|
|||||||
reinterpret_cast<const char*>(pShaderBytecode),
|
reinterpret_cast<const char*>(pShaderBytecode),
|
||||||
BytecodeLength);
|
BytecodeLength);
|
||||||
|
|
||||||
DxbcModule module(reader);
|
|
||||||
|
|
||||||
// If requested by the user, dump both the raw DXBC
|
// If requested by the user, dump both the raw DXBC
|
||||||
// shader and the compiled SPIR-V module to a file.
|
// shader and the compiled SPIR-V module to a file.
|
||||||
const std::string& dumpPath = pDevice->GetOptions()->shaderDumpPath;
|
const std::string& dumpPath = pDevice->GetOptions()->shaderDumpPath;
|
||||||
@ -30,14 +28,21 @@ namespace dxvk {
|
|||||||
reader.store(std::ofstream(str::topath(str::format(dumpPath, "/", name, ".dxbc").c_str()).c_str(),
|
reader.store(std::ofstream(str::topath(str::format(dumpPath, "/", name, ".dxbc").c_str()).c_str(),
|
||||||
std::ios_base::binary | std::ios_base::trunc));
|
std::ios_base::binary | std::ios_base::trunc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Error out if the shader is invalid
|
||||||
|
DxbcModule module(reader);
|
||||||
|
auto programInfo = module.programInfo();
|
||||||
|
|
||||||
|
if (!programInfo)
|
||||||
|
throw DxvkError("Invalid shader binary.");
|
||||||
|
|
||||||
// Decide whether we need to create a pass-through
|
// Decide whether we need to create a pass-through
|
||||||
// geometry shader for vertex shader stream output
|
// geometry shader for vertex shader stream output
|
||||||
bool passthroughShader = pDxbcModuleInfo->xfb != nullptr
|
bool passthroughShader = pDxbcModuleInfo->xfb != nullptr
|
||||||
&& (module.programInfo().type() == DxbcProgramType::VertexShader
|
&& (programInfo->type() == DxbcProgramType::VertexShader
|
||||||
|| module.programInfo().type() == DxbcProgramType::DomainShader);
|
|| programInfo->type() == DxbcProgramType::DomainShader);
|
||||||
|
|
||||||
if (module.programInfo().shaderStage() != pShaderKey->type() && !passthroughShader)
|
if (programInfo->shaderStage() != pShaderKey->type() && !passthroughShader)
|
||||||
throw DxvkError("Mismatching shader type.");
|
throw DxvkError("Mismatching shader type.");
|
||||||
|
|
||||||
m_shader = passthroughShader
|
m_shader = passthroughShader
|
||||||
|
@ -35,7 +35,10 @@ namespace dxvk {
|
|||||||
* \brief Shader type
|
* \brief Shader type
|
||||||
* \returns Shader type
|
* \returns Shader type
|
||||||
*/
|
*/
|
||||||
DxbcProgramInfo programInfo() const {
|
std::optional<DxbcProgramInfo> programInfo() const {
|
||||||
|
if (m_shexChunk == nullptr)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
return m_shexChunk->programInfo();
|
return m_shexChunk->programInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user