From 6f950afea788db18fb60caee72a60a891b201425 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 8 Jun 2020 14:12:11 +0100 Subject: [PATCH] Fix display of double values --- .../driver/shaders/dxil/dxil_bytecode.cpp | 2 +- .../driver/shaders/dxil/dxil_disassemble.cpp | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 97611b500..06cea5073 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -267,7 +267,7 @@ void ParseConstant(const LLVMBC::BlockOrRecord &constant, const Type *&curType, else if(curType->bitWidth == 32) memcpy(&v.val.fv[0], &constant.ops[0], sizeof(float)); else - memcpy(&v.val.dv[0], &constant.ops[0], sizeof(float)); + memcpy(&v.val.dv[0], &constant.ops[0], sizeof(double)); addValue(v); } else if(IS_KNOWN(constant.id, ConstantsRecord::STRING)) diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index e36c4cac6..f69e7a191 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -22,6 +22,8 @@ * THE SOFTWARE. ******************************************************************************/ +#include +#include #include "common/formatting.h" #include "dxil_bytecode.h" @@ -808,20 +810,35 @@ rdcstr Value::toString() const { if(type->scalarType == Type::Float) { + double orig; if(type->bitWidth > 32) - ret += StringFormat::Fmt("%le", val.dv[0]); + orig = val.dv[0]; else - ret += StringFormat::Fmt("%e", val.fv[0]); + orig = val.fv[0]; + + // NaNs/infs are printed as hex to ensure we don't lose bits + if(!isnan(orig) && !isinf(orig)) + { + // check we can reparse precisely a float-formatted string. Otherwise we print as hex + rdcstr flt = StringFormat::Fmt("%.6le", orig); + + double reparse = strtod(flt.begin(), NULL); + + if(orig == reparse) + return ret + flt; + } + + ret += StringFormat::Fmt("0x%llX", orig); } else if(type->scalarType == Type::Int) { // LLVM seems to always interpret these as signed? :( if(type->bitWidth > 32) - ret += StringFormat::Fmt("%lld", val.u64v[0]); + ret += StringFormat::Fmt("%lld", val.s64v[0]); else if(type->bitWidth == 1) ret += val.uv[0] ? "true" : "false"; else - ret += StringFormat::Fmt("%d", val.uv[0]); + ret += StringFormat::Fmt("%d", val.iv[0]); } } else if(type->type == Type::Vector)