From 976cb0e21a7dec78a15920f4fa6e12e6975ce449 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 6 Sep 2021 17:07:35 +0100 Subject: [PATCH] Preserve uselists through DXIL decode/encode --- .../driver/shaders/dxil/dxil_bytecode.cpp | 25 ++++++++++++++++++- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 9 +++++++ .../shaders/dxil/dxil_bytecode_editor.cpp | 15 +++++++++++ renderdoc/driver/shaders/dxil/llvm_common.h | 6 +++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index dcce8c0cb..4086490fd 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -1149,7 +1149,30 @@ Program::Program(const byte *bytes, size_t length) } else if(IS_KNOWN(funcChild.id, KnownBlock::USELIST_BLOCK)) { - RDCDEBUG("Ignoring uselist block"); + for(const LLVMBC::BlockOrRecord &uselist : funcChild.children) + { + if(uselist.IsBlock()) + { + RDCERR("Unexpected subblock in USELIST_BLOCK"); + continue; + } + + const bool bb = IS_KNOWN(uselist.id, UselistRecord::BB); + if(IS_KNOWN(uselist.id, UselistRecord::DEFAULT) || bb) + { + UselistEntry u; + u.block = bb; + u.shuffle = uselist.ops; + u.value = m_Values[(size_t)u.shuffle.back()]; + u.shuffle.pop_back(); + f.uselist.push_back(u); + } + else + { + RDCERR("Unexpected record %u in USELIST_BLOCK", uselist.id); + continue; + } + } } else { diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index bd6afe944..c1bdc9d6f 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -579,6 +579,13 @@ struct Block rdcarray preds; }; +struct UselistEntry +{ + bool block = false; + Value value; + rdcarray shuffle; +}; + struct Function { rdcstr name; @@ -597,6 +604,8 @@ struct Function rdcarray constants; rdcarray metadata; + rdcarray uselist; + AttachedMetadata attachedMeta; }; diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp index d15480d77..626006983 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp @@ -1098,6 +1098,21 @@ bytebuf DXIL::ProgramEditor::EncodeProgram() const writer.EndBlock(); } + if(!f.uselist.empty()) + { + writer.BeginBlock(LLVMBC::KnownBlock::USELIST_BLOCK); + + for(const UselistEntry &u : f.uselist) + { + vals = u.shuffle; + vals.push_back(getValueID(u.value)); + + writer.Record(u.block ? LLVMBC::UselistRecord::BB : LLVMBC::UselistRecord::DEFAULT, vals); + } + + writer.EndBlock(); + } + writer.EndBlock(); values.resize(values.size() - f.values.size()); diff --git a/renderdoc/driver/shaders/dxil/llvm_common.h b/renderdoc/driver/shaders/dxil/llvm_common.h index c5ce00fcd..f6172e1f2 100644 --- a/renderdoc/driver/shaders/dxil/llvm_common.h +++ b/renderdoc/driver/shaders/dxil/llvm_common.h @@ -175,6 +175,12 @@ enum class ValueSymtabRecord : uint32_t COMBINED_ENTRY = 5, }; +enum class UselistRecord : uint32_t +{ + DEFAULT = 1, + BB = 2, +}; + enum class MetaDataRecord : uint32_t { STRING_OLD = 1,