From d898eff3bed74aff619c40d6639d14c6e7c55bde Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 17 Jul 2022 03:53:40 +0200 Subject: [PATCH] [dxvk] Don't remove private inpurs from interface list in SPIR-V 1.4+ And if we have to, exit after one iteration since otherwise our iterator gets invalidated. --- src/dxvk/dxvk_shader.cpp | 31 ++++++++++++++++++++----------- src/dxvk/dxvk_shader.h | 1 + 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index 07acc49bd..c05130f5a 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -171,6 +171,8 @@ namespace dxvk { spv::StorageClass storageClass = spv::StorageClassMax; }; + uint32_t spirvVersion = code.data()[1]; + std::unordered_map types; std::unordered_map constants; std::unordered_set candidates; @@ -214,6 +216,9 @@ namespace dxvk { break; } } + + if (ins.opCode() == spv::OpFunction) + break; } if (!inputVarId) @@ -292,21 +297,25 @@ namespace dxvk { code.endInsertion(); // Remove variable from interface list - for (auto ins : code) { - if (ins.opCode() == spv::OpEntryPoint) { - uint32_t argIdx = 2 + code.strLen(ins.chr(2)); + if (spirvVersion < spvVersion(1, 4)) { + for (auto ins : code) { + if (ins.opCode() == spv::OpEntryPoint) { + uint32_t argIdx = 2 + code.strLen(ins.chr(2)); - while (argIdx < ins.length()) { - if (ins.arg(argIdx) == inputVarId) { - ins.setArg(0, spv::OpEntryPoint | ((ins.length() - 1) << spv::WordCountShift)); + while (argIdx < ins.length()) { + if (ins.arg(argIdx) == inputVarId) { + ins.setArg(0, spv::OpEntryPoint | ((ins.length() - 1) << spv::WordCountShift)); - code.beginInsertion(ins.offset() + argIdx); - code.erase(1); - code.endInsertion(); - break; + code.beginInsertion(ins.offset() + argIdx); + code.erase(1); + code.endInsertion(); + break; + } + + argIdx += 1; } - argIdx += 1; + break; } } } diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index cae24b640..6ed5c632e 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -9,6 +9,7 @@ #include "../spirv/spirv_code_buffer.h" #include "../spirv/spirv_compression.h" +#include "../spirv/spirv_module.h" namespace dxvk {