From 4f784b07d5935184f6c0f41617cab97bb3a30810 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 27 Nov 2015 17:23:10 +0100 Subject: [PATCH] Handle array outputs in SPIR-V, add array index to signature parameter --- renderdoc/api/replay/shader_types.h | 5 +- .../shaders/spirv/spirv_disassemble.cpp | 51 ++++++++++++++----- renderdocui/Interop/Shader.cs | 2 + 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index 58eca0625..d770c63e6 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -119,7 +119,8 @@ struct SigParameter SigParameter() : semanticIndex(0), needSemanticIndex(false), regIndex(0), systemValue(eAttr_None), compType(eCompType_Float), - regChannelMask(0), channelUsedMask(0), compCount(0), stream(0) + regChannelMask(0), channelUsedMask(0), compCount(0), + stream(0), arrayIndex(~0U) { } rdctype::str varName; @@ -138,6 +139,8 @@ struct SigParameter uint8_t channelUsedMask; uint32_t compCount; uint32_t stream; + + uint32_t arrayIndex; }; struct ShaderConstant; diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 6b8bb309a..8ecaf9b5c 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -2379,7 +2379,6 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy { SigParameter sig; - sig.varName = varName; sig.needSemanticIndex = false; // this is super cheeky, but useful to pick up when doing output dumping and @@ -2417,6 +2416,15 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy return; } + bool isArray = false; + uint32_t arraySize = 1; + if(type->type == SPVTypeData::eArray) + { + arraySize = type->arraySize; + isArray = true; + type = type->baseType; + } + switch(type->baseType ? type->baseType->type : type->type) { case SPVTypeData::eBool: @@ -2439,22 +2447,37 @@ void AddSignatureParameter(uint32_t id, uint32_t childIdx, string varName, SPVTy sig.regChannelMask = sig.channelUsedMask = (1<vectorSize)-1; - if(type->matrixSize == 1) + for(uint32_t a=0; a < arraySize; a++) { - sigarray.push_back(sig); - } - else - { - for(uint32_t m=0; m < type->matrixSize; m++) + string n = varName; + + if(isArray) { - SigParameter s = sig; - s.varName = StringFormat::Fmt("%s:%s%u", varName.c_str(), rowmajor ? "row" : "col", m); - s.regIndex += m; - - RDCASSERT(s.regIndex < 16); - - sigarray.push_back(s); + n = StringFormat::Fmt("%s[%u]", varName.c_str(), a); + sig.arrayIndex = a; } + + sig.varName = n; + + if(type->matrixSize == 1) + { + sigarray.push_back(sig); + } + else + { + for(uint32_t m=0; m < type->matrixSize; m++) + { + SigParameter s = sig; + s.varName = StringFormat::Fmt("%s:%s%u", n.c_str(), rowmajor ? "row" : "col", m); + s.regIndex += m; + + RDCASSERT(s.regIndex < 16); + + sigarray.push_back(s); + } + } + + sig.regIndex += RDCMAX(1U, type->matrixSize); } } diff --git a/renderdocui/Interop/Shader.cs b/renderdocui/Interop/Shader.cs index e10ec77cf..be5a3bfdc 100644 --- a/renderdocui/Interop/Shader.cs +++ b/renderdocui/Interop/Shader.cs @@ -224,6 +224,8 @@ namespace renderdoc public byte channelUsedMask; public UInt32 compCount; public UInt32 stream; + + public UInt32 arrayIndex; public string TypeString {