From a967805a246a14a7c472bec77940537b96939930 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 21 Jul 2022 14:47:37 +0100 Subject: [PATCH] Don't use StringFormat for SPIR-V GetRawName --- .../driver/shaders/spirv/spirv_debug.cpp | 6 +- renderdoc/driver/shaders/spirv/spirv_debug.h | 6 +- .../shaders/spirv/spirv_debug_setup.cpp | 91 ++++++++++++++----- 3 files changed, 74 insertions(+), 29 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index 6034e25d9..04b0aa948 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -211,7 +211,7 @@ void ThreadState::EnterFunction(const rdcarray &arguments) OpVariable decl(it); ShaderVariable &stackvar = frame->locals[i]; - stackvar.name = debugger.GetRawName(decl.result); + stackvar.name = GetRawName(decl.result); rdcstr sourceName = debugger.GetHumanName(decl.result); @@ -342,7 +342,7 @@ void ThreadState::SetDst(Id id, const ShaderVariable &val) m_State->flags |= ShaderEvents::GeneratedNanOrInf; ids[id] = val; - ids[id].name = debugger.GetRawName(id); + ids[id].name = GetRawName(id); lastWrite[id] = m_State ? m_State->stepIndex : nextInstruction; @@ -545,7 +545,7 @@ bool ThreadState::ReferencePointer(Id id) { StackFrame *frame = callstack.back(); - rdcstr name = debugger.GetRawName(id); + rdcstr name = GetRawName(id); // see if this is a local variable which is newly referenced, if so add source vars for it for(size_t i = 0; i < frame->locals.size(); i++) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.h b/renderdoc/driver/shaders/spirv/spirv_debug.h index 717f9b7e0..6d5392435 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.h +++ b/renderdoc/driver/shaders/spirv/spirv_debug.h @@ -329,6 +329,9 @@ struct LocalMapping rdcarray indexes; }; +Id ParseRawName(const rdcstr &name); +rdcstr GetRawName(Id id); + class Debugger : public Processor, public ShaderDebugger { public: @@ -354,7 +357,6 @@ public: bool IsDebugExtInstSet(Id id) const; bool HasDebugInfo() const { return m_DebugInfo.valid; } bool InDebugScope(uint32_t inst) const; - rdcstr GetRawName(Id id) const; rdcstr GetHumanName(Id id); void AddSourceVars(rdcarray &sourceVars, const ShaderVariable &var, Id id); void AllocateVariable(Id id, Id typeId, ShaderVariable &outVar); @@ -393,8 +395,6 @@ private: uint64_t, const rdcstr &)> callback) const; - static Id ParseRawName(const rdcstr &name); - void MakeSignatureNames(const rdcarray &sigList, rdcarray &sigNames); ///////////////////////////////////////////////////////// diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index d53756069..da1336613 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -114,6 +114,42 @@ static const void *VarElemPointer(const ShaderVariable &var, uint32_t comp) namespace rdcspv { +rdcstr GetRawName(Id id) +{ + // 32-bit value means at most 10 decimal digits, plus a preceeding _, plus trailing NULL. + char name[12] = {}; + char *ptr = name + 10; + uint32_t val = id.value(); + do + { + *ptr = char('0' + (val % 10)); + ptr--; + val /= 10; + } while(val); + + *ptr = '_'; + + return ptr; +} + +Id ParseRawName(const rdcstr &name) +{ + if(name[0] != '_') + return Id(); + + uint32_t val = 0; + for(int i = 1; i < name.count(); i++) + { + if(name[i] < '0' || name[i] > '9') + return Id(); + + val *= 10; + val += uint32_t(name[i] - '0'); + } + + return Id::fromWord(val); +} + void AssignValue(ShaderVariable &dst, const ShaderVariable &src) { dst.value = src.value; @@ -2270,29 +2306,6 @@ void Debugger::WriteThroughPointer(const ShaderVariable &ptr, const ShaderVariab } } -rdcstr Debugger::GetRawName(Id id) const -{ - return StringFormat::Fmt("_%u", id.value()); -} - -Id Debugger::ParseRawName(const rdcstr &name) -{ - if(name[0] != '_') - return Id(); - - uint32_t val = 0; - for(int i = 1; i < name.count(); i++) - { - if(name[i] < '0' || name[i] > '9') - return Id(); - - val *= 10; - val += uint32_t(name[i] - '0'); - } - - return Id::fromWord(val); -} - rdcstr Debugger::GetHumanName(Id id) { // see if we have a dynamic name assigned (to disambiguate), if so use that @@ -3353,3 +3366,35 @@ void Debugger::RegisterOp(Iter it) } }; // namespace rdcspv + +#if ENABLED(ENABLE_UNIT_TESTS) + +#include "catch/catch.hpp" + +TEST_CASE("Check SPIRV Id naming", "[tostr]") +{ + SECTION("Test GetRawName") + { + CHECK(rdcspv::GetRawName(rdcspv::Id::fromWord(1234)) == "_1234"); + CHECK(rdcspv::GetRawName(rdcspv::Id::fromWord(12345)) == "_12345"); + CHECK(rdcspv::GetRawName(rdcspv::Id::fromWord(999)) == "_999"); + CHECK(rdcspv::GetRawName(rdcspv::Id::fromWord(0xffffffff)) == "_4294967295"); + CHECK(rdcspv::GetRawName(rdcspv::Id()) == "_0"); + }; + + SECTION("Test ParseRawName") + { + CHECK(rdcspv::ParseRawName("_1234") == rdcspv::Id::fromWord(1234)); + CHECK(rdcspv::ParseRawName("_12345") == rdcspv::Id::fromWord(12345)); + CHECK(rdcspv::ParseRawName("_999") == rdcspv::Id::fromWord(999)); + CHECK(rdcspv::ParseRawName("_4294967295") == rdcspv::Id::fromWord(0xffffffff)); + CHECK(rdcspv::ParseRawName("_0") == rdcspv::Id()); + CHECK(rdcspv::ParseRawName("1234") == rdcspv::Id()); + CHECK(rdcspv::ParseRawName("999") == rdcspv::Id()); + CHECK(rdcspv::ParseRawName("1") == rdcspv::Id()); + CHECK(rdcspv::ParseRawName("-1234") == rdcspv::Id()); + CHECK(rdcspv::ParseRawName("asdf") == rdcspv::Id()); + }; +} + +#endif