diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index 0fab07b6a..a7f545c85 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -119,6 +119,9 @@ namespace dxvk { if (ins.arg(2) == spv::DecorationIndex && ins.arg(1) == o1VarId) m_o1IdxOffset = ins.offset() + 3; } + + if (ins.opCode() == spv::OpCapability) + m_capabilities.push_back(spv::Capability(ins.arg(1))); } } @@ -129,16 +132,11 @@ namespace dxvk { bool DxvkShader::hasCapability(spv::Capability cap) { - for (auto ins : m_code) { - // OpCapability instructions come first - if (ins.opCode() != spv::OpCapability) - return false; - - if (ins.arg(1) == cap) - return true; - } + auto entry = std::find( + m_capabilities.begin(), + m_capabilities.end(), cap); - return false; + return entry != m_capabilities.end(); } diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index e177cb7be..6e99b1d90 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -255,6 +255,8 @@ namespace dxvk { DxvkShaderConstData m_constData; DxvkShaderKey m_key; + std::vector m_capabilities; + size_t m_o1IdxOffset = 0; size_t m_o1LocOffset = 0;