From 0e054d864c3a24ba91ff0b68eaf7a08b4ef07a39 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 16 Dec 2020 17:24:53 +0000 Subject: [PATCH] Don't use capture writer after it is destroyed. Closes #2121 --- renderdoc/driver/d3d11/d3d11_device.cpp | 7 +++++-- renderdoc/driver/d3d12/d3d12_device.cpp | 7 +++++-- renderdoc/driver/gl/gl_driver.cpp | 7 +++++-- renderdoc/driver/vulkan/vk_core.cpp | 7 +++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 7dbfa2777..647042b8e 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2080,6 +2080,8 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd) captureWriter = new StreamWriter(StreamWriter::InvalidStream); } + uint64_t captureSectionSize = 0; + { WriteSerialiser ser(captureWriter, Ownership::Stream); @@ -2149,11 +2151,12 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd) } UnlockForChunkFlushing(); + + captureSectionSize = captureWriter->GetOffset(); } RDCLOG("Captured D3D11 frame with %f MB capture section in %f seconds", - double(captureWriter->GetOffset()) / (1024.0 * 1024.0), - m_CaptureTimer.GetMilliseconds() / 1000.0); + double(captureSectionSize) / (1024.0 * 1024.0), m_CaptureTimer.GetMilliseconds() / 1000.0); RenderDoc::Inst().FinishCaptureWriting(rdc, m_CapturedFrames.back().frameNumber); diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 5bfc280f9..c238fdbbb 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -2436,6 +2436,8 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd) captureWriter = new StreamWriter(StreamWriter::InvalidStream); } + uint64_t captureSectionSize = 0; + { WriteSerialiser ser(captureWriter, Ownership::Stream); @@ -2521,11 +2523,12 @@ bool WrappedID3D12Device::EndFrameCapture(void *dev, void *wnd) } RDCDEBUG("Done"); + + captureSectionSize = captureWriter->GetOffset(); } RDCLOG("Captured D3D12 frame with %f MB capture section in %f seconds", - double(captureWriter->GetOffset()) / (1024.0 * 1024.0), - m_CaptureTimer.GetMilliseconds() / 1000.0); + double(captureSectionSize) / (1024.0 * 1024.0), m_CaptureTimer.GetMilliseconds() / 1000.0); RenderDoc::Inst().FinishCaptureWriting(rdc, m_CapturedFrames.back().frameNumber); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 7a9441211..ab69ffc95 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -2299,6 +2299,8 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd) captureWriter = new StreamWriter(StreamWriter::InvalidStream); } + uint64_t captureSectionSize = 0; + { WriteSerialiser ser(captureWriter, Ownership::Stream); @@ -2384,11 +2386,12 @@ bool WrappedOpenGL::EndFrameCapture(void *dev, void *wnd) RDCDEBUG("Done"); } + + captureSectionSize = captureWriter->GetOffset(); } RDCLOG("Captured GL frame with %f MB capture section in %f seconds", - double(captureWriter->GetOffset()) / (1024.0 * 1024.0), - m_CaptureTimer.GetMilliseconds() / 1000.0); + double(captureSectionSize) / (1024.0 * 1024.0), m_CaptureTimer.GetMilliseconds() / 1000.0); RenderDoc::Inst().FinishCaptureWriting(rdc, m_CapturedFrames.back().frameNumber); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 06a6cce49..d749c4cb2 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1994,6 +1994,8 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) captureWriter = new StreamWriter(StreamWriter::InvalidStream); } + uint64_t captureSectionSize = 0; + { WriteSerialiser ser(captureWriter, Ownership::Stream); @@ -2076,11 +2078,12 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) RDCDEBUG("Done"); } + + captureSectionSize = captureWriter->GetOffset(); } RDCLOG("Captured Vulkan frame with %f MB capture section in %f seconds", - double(captureWriter->GetOffset()) / (1024.0 * 1024.0), - m_CaptureTimer.GetMilliseconds() / 1000.0); + double(captureSectionSize) / (1024.0 * 1024.0), m_CaptureTimer.GetMilliseconds() / 1000.0); RenderDoc::Inst().FinishCaptureWriting(rdc, m_CapturedFrames.back().frameNumber);