From deeb7fe3eb7864ecd5b802b1dc75ea7afd2ca7b0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 15 Feb 2023 15:45:46 +0000 Subject: [PATCH] Handle non-void return instructions properly in DXIL --- .../driver/shaders/dxil/dxil_bytecode.cpp | 18 ++++-------------- .../driver/shaders/dxil/dxil_disassemble.cpp | 9 ++++++++- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 52233a589..1b8496cb4 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -1293,22 +1293,12 @@ Program::Program(const byte *bytes, size_t length) : alloc(32 * 1024) } else if(op.type == FunctionRecord::INST_RET) { - Instruction *inst = NULL; + // even rets returning a value are still void + Instruction *inst = new(alloc) Instruction; + inst->type = GetVoidType(); - if(op.remaining() == 0) - { - inst = new(alloc) Instruction; - inst->type = GetVoidType(); - - RDCASSERT(inst->type); - } - else - { - inst = values.nextValue(); + if(op.remaining() != 0) inst->args.push_back(op.getSymbol()); - inst->type = inst->args.back()->type; - values.addValue(); - } inst->op = Operation::Ret; diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index c8d6298df..392fae2f4 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -732,7 +732,14 @@ void Program::MakeDisassemblyString() break; } - case Operation::Ret: m_Disassembly += "ret " + inst.type->toString(); break; + case Operation::Ret: + { + if(inst.args.empty()) + m_Disassembly += "ret " + inst.type->toString(); + else + m_Disassembly += "ret " + argToString(inst.args[0], true); + break; + } case Operation::Unreachable: m_Disassembly += "unreachable"; break; case Operation::Alloca: {