From 55c1ace6ef6dc409f919e8dff43fd98b0ce69960 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 22 Jun 2018 16:04:59 +0100 Subject: [PATCH] Fix incorrect serialisation of ProgramUniformValue. Closes #1019 --- renderdoc/driver/gl/gl_common.cpp | 5 ++++ renderdoc/driver/gl/gl_driver.h | 2 +- renderdoc/driver/gl/gl_program_iterate.cpp | 32 ++++++++++++++++------ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 82457e982..a28c40650 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -1069,6 +1069,11 @@ bool GLInitParams::IsSupportedVersion(uint64_t ver) if(ver == 0x1A) return true; + // 0x1B -> 0x1C - fixed incorrect float/double serialisation in serialisation of + // ProgramUniformValue + if(ver == 0x1B) + return true; + return false; } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index c3e36f30e..0e7744796 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -53,7 +53,7 @@ struct GLInitParams uint32_t height; // check if a frame capture section version is supported - static const uint64_t CurrentVersion = 0x1B; + static const uint64_t CurrentVersion = 0x1C; static bool IsSupportedVersion(uint64_t ver); }; diff --git a/renderdoc/driver/gl/gl_program_iterate.cpp b/renderdoc/driver/gl/gl_program_iterate.cpp index fed4a041c..a62d44191 100644 --- a/renderdoc/driver/gl/gl_program_iterate.cpp +++ b/renderdoc/driver/gl/gl_program_iterate.cpp @@ -245,14 +245,30 @@ void DoSerialise(SerialiserType &ser, ProgramUniformValue &el) int32_t *iv = el.data.ival; uint32_t *uv = el.data.uval; - if(baseType == VarType::Double) - ser.Serialise("data", fv, elemCount, SerialiserFlags::NoFlags); - else if(baseType == VarType::Float) - ser.Serialise("data", dv, elemCount, SerialiserFlags::NoFlags); - else if(baseType == VarType::Int) - ser.Serialise("data", iv, elemCount, SerialiserFlags::NoFlags); - else if(baseType == VarType::UInt) - ser.Serialise("data", uv, elemCount, SerialiserFlags::NoFlags); + // originally the logic was backwards and floats were serialised with dv and doubles with fv. + // This caused extra garbage to be written for floats, and truncated double data. + if(ser.VersionAtLeast(0x1C)) + { + if(baseType == VarType::Float) + ser.Serialise("data", fv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::Int) + ser.Serialise("data", iv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::UInt) + ser.Serialise("data", uv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::Double) + ser.Serialise("data", dv, elemCount, SerialiserFlags::NoFlags); + } + else + { + if(baseType == VarType::Double) + ser.Serialise("data", fv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::Float) + ser.Serialise("data", dv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::Int) + ser.Serialise("data", iv, elemCount, SerialiserFlags::NoFlags); + else if(baseType == VarType::UInt) + ser.Serialise("data", uv, elemCount, SerialiserFlags::NoFlags); + } } template