From 50266cdee2c7ea42338d26395259efb85041d817 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 27 Jun 2019 09:17:43 +0100 Subject: [PATCH] Fix serialisation of D3D12_WRITEBUFFERIMMEDIATE_PARAMETER's gpu address --- renderdoc/driver/d3d12/d3d12_common.cpp | 5 +++++ renderdoc/driver/d3d12/d3d12_device.h | 2 +- renderdoc/driver/d3d12/d3d12_serialise.cpp | 12 +++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_common.cpp b/renderdoc/driver/d3d12/d3d12_common.cpp index 9bb0df227..f04a0299b 100644 --- a/renderdoc/driver/d3d12/d3d12_common.cpp +++ b/renderdoc/driver/d3d12/d3d12_common.cpp @@ -158,6 +158,11 @@ bool D3D12InitParams::IsSupportedVersion(uint64_t ver) if(ver == CurrentVersion) return true; + // 0x6 -> 0x7 - Fixed serialisation of D3D12_WRITEBUFFERIMMEDIATE_PARAMETER to properly replay the + // GPU address + if(ver == 0x6) + return true; + // 0x5 -> 0x6 - Multiply by number of planes in format when serialising initial states - // i.e. stencil is saved with depth in initial states. if(ver == 0x5) diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 7cae8cf55..f8fb07fdc 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -46,7 +46,7 @@ struct D3D12InitParams D3D_FEATURE_LEVEL MinimumFeatureLevel; // check if a frame capture section version is supported - static const uint64_t CurrentVersion = 0x6; + static const uint64_t CurrentVersion = 0x7; static bool IsSupportedVersion(uint64_t ver); }; diff --git a/renderdoc/driver/d3d12/d3d12_serialise.cpp b/renderdoc/driver/d3d12/d3d12_serialise.cpp index 8005d2751..3b14512cb 100644 --- a/renderdoc/driver/d3d12/d3d12_serialise.cpp +++ b/renderdoc/driver/d3d12/d3d12_serialise.cpp @@ -1250,7 +1250,17 @@ void DoSerialise(SerialiserType &ser, D3D12_SUBRESOURCE_RANGE_UINT64 &el) template void DoSerialise(SerialiserType &ser, D3D12_WRITEBUFFERIMMEDIATE_PARAMETER &el) { - SERIALISE_MEMBER(Dest); + if(ser.VersionAtLeast(0x7)) + { + SERIALISE_MEMBER_TYPED(D3D12BufferLocation, Dest); + } + else + { + RDCERR( + "Replay will crash - old capture with corrupted D3D12_WRITEBUFFERIMMEDIATE_PARAMETER. " + "Re-capture to fix this."); + SERIALISE_MEMBER(Dest); + } SERIALISE_MEMBER(Value); }