From be108694b341657f2db6eade8d5528df088c6e5e Mon Sep 17 00:00:00 2001 From: Bryan Bernhart Date: Wed, 6 Jul 2022 12:05:41 -0700 Subject: [PATCH] Fix re-capture when using residency manager. Allows D3D12EventTraceReplay to configure event tracing for capture when using a residency manager. --- src/gpgmm/common/TraceEvent.cpp | 8 +++++-- src/gpgmm/common/TraceEvent.h | 2 +- src/gpgmm/d3d12/ResidencyManagerD3D12.cpp | 8 +++---- src/gpgmm/d3d12/ResidencyManagerD3D12.h | 2 +- src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp | 16 +++++++++----- src/gpgmm/d3d12/ResourceAllocatorD3D12.h | 2 +- .../D3D12EventTraceReplay.cpp | 21 ++++++++++++++----- src/tests/unittests/EventTraceWriterTests.cpp | 2 +- 8 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/gpgmm/common/TraceEvent.cpp b/src/gpgmm/common/TraceEvent.cpp index e5be1537c..990151791 100644 --- a/src/gpgmm/common/TraceEvent.cpp +++ b/src/gpgmm/common/TraceEvent.cpp @@ -37,7 +37,8 @@ namespace gpgmm { const TraceEventPhase& ignoreMask, bool flushOnDestruct) { #if defined(GPGMM_DISABLE_TRACING) - gpgmm::WarningLog() << "Event tracing enabled but unable to record due to GPGMM_DISABLE_TRACING."; + gpgmm::WarningLog() + << "Event tracing enabled but unable to record due to GPGMM_DISABLE_TRACING."; #endif GetInstance()->SetConfiguration(traceFile, ignoreMask, flushOnDestruct); @@ -45,7 +46,10 @@ namespace gpgmm { "GPGMM_MainThread"); } - void ShutdownEventTrace() { + void FlushEventTraceToDisk() { + if (!IsEventTraceEnabled()) { + return; + } GetInstance()->FlushQueuedEventsToDisk(); } diff --git a/src/gpgmm/common/TraceEvent.h b/src/gpgmm/common/TraceEvent.h index 86f3c73ce..835f47d68 100644 --- a/src/gpgmm/common/TraceEvent.h +++ b/src/gpgmm/common/TraceEvent.h @@ -179,7 +179,7 @@ namespace gpgmm { const TraceEventPhase& ignoreMask, bool flushOnDestruct); - void ShutdownEventTrace(); + void FlushEventTraceToDisk(); bool IsEventTraceEnabled(); diff --git a/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp b/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp index 8f6a4b6a5..dd6af6015 100644 --- a/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp +++ b/src/gpgmm/d3d12/ResidencyManagerD3D12.cpp @@ -222,8 +222,8 @@ namespace gpgmm::d3d12 { : descriptor.EvictBatchSize), mIsUMA(descriptor.IsUMA), mIsBudgetChangeEventsDisabled(descriptor.UpdateBudgetByPolling), - mShutdownEventTrace(descriptor.RecordOptions.EventScope & - EVENT_RECORD_SCOPE_PER_INSTANCE), + mFlushEventBuffersOnDestruct(descriptor.RecordOptions.EventScope & + EVENT_RECORD_SCOPE_PER_INSTANCE), mThreadPool(ThreadPool::Create()) { GPGMM_TRACE_EVENT_OBJECT_NEW(this); @@ -236,8 +236,8 @@ namespace gpgmm::d3d12 { GPGMM_TRACE_EVENT_OBJECT_DESTROY(this); StopBudgetNotificationUpdates(); - if (mShutdownEventTrace) { - ShutdownEventTrace(); + if (mFlushEventBuffersOnDestruct) { + FlushEventTraceToDisk(); } } diff --git a/src/gpgmm/d3d12/ResidencyManagerD3D12.h b/src/gpgmm/d3d12/ResidencyManagerD3D12.h index 224a1bf0a..92287a997 100644 --- a/src/gpgmm/d3d12/ResidencyManagerD3D12.h +++ b/src/gpgmm/d3d12/ResidencyManagerD3D12.h @@ -288,7 +288,7 @@ namespace gpgmm::d3d12 { const uint64_t mEvictBatchSize; const bool mIsUMA; const bool mIsBudgetChangeEventsDisabled; - const bool mShutdownEventTrace; + const bool mFlushEventBuffersOnDestruct; VideoMemorySegment mLocalVideoMemorySegment; VideoMemorySegment mNonLocalVideoMemorySegment; diff --git a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp index 9db27ebff..7906d9700 100644 --- a/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp +++ b/src/gpgmm/d3d12/ResourceAllocatorD3D12.cpp @@ -340,13 +340,17 @@ namespace gpgmm::d3d12 { return E_INVALIDARG; } - if (!IsEventTraceEnabled() && newDescriptor.RecordOptions.Flags != EVENT_RECORD_FLAG_NONE) { + if (pResidencyManager == nullptr && + newDescriptor.RecordOptions.Flags != EVENT_RECORD_FLAG_NONE) { StartupEventTrace( allocatorDescriptor.RecordOptions.TraceFile, static_cast(~newDescriptor.RecordOptions.Flags | 0), allocatorDescriptor.RecordOptions.EventScope & EVENT_RECORD_SCOPE_PER_PROCESS); SetEventMessageLevel(GetLogSeverity(newDescriptor.RecordOptions.MinMessageLevel)); + } else { + // Do not override the event scope from a event trace already enabled. + newDescriptor.RecordOptions.EventScope = EVENT_RECORD_SCOPE_PER_PROCESS; } // Do not override the default min. log level specified by the residency manager. @@ -391,8 +395,8 @@ namespace gpgmm::d3d12 { mIsAlwaysCommitted(descriptor.Flags & ALLOCATOR_FLAG_ALWAYS_COMMITED), mIsAlwaysInBudget(descriptor.Flags & ALLOCATOR_FLAG_ALWAYS_IN_BUDGET), mMaxResourceHeapSize(descriptor.MaxResourceHeapSize), - mShutdownEventTrace(descriptor.RecordOptions.EventScope & - EVENT_RECORD_SCOPE_PER_INSTANCE), + mFlushEventBuffersOnDestruct(descriptor.RecordOptions.EventScope & + EVENT_RECORD_SCOPE_PER_INSTANCE), mUseDetailedTimingEvents(descriptor.RecordOptions.UseDetailedTimingEvents) { GPGMM_TRACE_EVENT_OBJECT_NEW(this); @@ -609,8 +613,10 @@ namespace gpgmm::d3d12 { #if defined(GPGMM_ENABLE_DEVICE_CHECKS) ReportLiveDeviceObjects(mDevice); #endif - if (mShutdownEventTrace) { - ShutdownEventTrace(); + mResidencyManager = nullptr; + + if (mFlushEventBuffersOnDestruct) { + FlushEventTraceToDisk(); } } diff --git a/src/gpgmm/d3d12/ResourceAllocatorD3D12.h b/src/gpgmm/d3d12/ResourceAllocatorD3D12.h index d553de410..1a44a3178 100644 --- a/src/gpgmm/d3d12/ResourceAllocatorD3D12.h +++ b/src/gpgmm/d3d12/ResourceAllocatorD3D12.h @@ -586,7 +586,7 @@ namespace gpgmm::d3d12 { const bool mIsAlwaysCommitted; const bool mIsAlwaysInBudget; const uint64_t mMaxResourceHeapSize; - const bool mShutdownEventTrace; + const bool mFlushEventBuffersOnDestruct; const bool mUseDetailedTimingEvents; static constexpr uint64_t kNumOfResourceHeapTypes = 8u; diff --git a/src/tests/capture_replay_tests/D3D12EventTraceReplay.cpp b/src/tests/capture_replay_tests/D3D12EventTraceReplay.cpp index 8745d5dc0..91f94aced 100644 --- a/src/tests/capture_replay_tests/D3D12EventTraceReplay.cpp +++ b/src/tests/capture_replay_tests/D3D12EventTraceReplay.cpp @@ -326,6 +326,21 @@ class D3D12EventTraceReplay : public D3D12TestBase, public CaptureReplayTestWith residencyDesc.EvictBatchSize = snapshot["EvictBatchSize"].asUInt64(); residencyDesc.InitialFenceValue = snapshot["InitialFenceValue"].asUInt64(); + if (envParams.CaptureEventMask != 0) { + residencyDesc.RecordOptions.Flags |= + static_cast(envParams.CaptureEventMask); + residencyDesc.RecordOptions.TraceFile = traceFile.path; + residencyDesc.RecordOptions.MinMessageLevel = + GetMessageSeverity(envParams.LogLevel); + + // Keep recording across multiple playback iterations to ensure all + // events will be captured instead of overwritten per iteration. + if (envParams.Iterations == 1) { + residencyDesc.RecordOptions.EventScope = + EVENT_RECORD_SCOPE_PER_INSTANCE; + } + } + ComPtr residencyManager; ASSERT_SUCCEEDED(ResidencyManager::CreateResidencyManager( residencyDesc, &residencyManager)); @@ -394,7 +409,6 @@ class D3D12EventTraceReplay : public D3D12TestBase, public CaptureReplayTestWith if (envParams.CaptureEventMask != 0) { allocatorDesc.RecordOptions.Flags |= static_cast(envParams.CaptureEventMask); - allocatorDesc.RecordOptions.Flags |= EVENT_RECORD_FLAG_CAPTURE; allocatorDesc.RecordOptions.TraceFile = traceFile.path; allocatorDesc.RecordOptions.MinMessageLevel = GetMessageSeverity(envParams.LogLevel); @@ -440,7 +454,7 @@ class D3D12EventTraceReplay : public D3D12TestBase, public CaptureReplayTestWith ComPtr resourceAllocator; ASSERT_SUCCEEDED(ResourceAllocator::CreateAllocator( - allocatorDesc, &resourceAllocator, &residencyManager)); + allocatorDesc, residencyManager.Get(), &resourceAllocator)); ASSERT_TRUE( createdAllocatorToID.insert({allocatorID, std::move(resourceAllocator)}) @@ -578,9 +592,6 @@ TEST_P(D3D12EventTraceReplay, Recapture) { forceParams.CaptureEventMask = EVENT_RECORD_FLAG_CAPTURE; RunSingleTest(forceParams); - - forceParams.CaptureEventMask = EVENT_RECORD_FLAG_NONE; - RunSingleTest(forceParams); } GPGMM_INSTANTIATE_CAPTURE_REPLAY_TEST(D3D12EventTraceReplay); diff --git a/src/tests/unittests/EventTraceWriterTests.cpp b/src/tests/unittests/EventTraceWriterTests.cpp index 17b6b8f64..0b4c4212a 100644 --- a/src/tests/unittests/EventTraceWriterTests.cpp +++ b/src/tests/unittests/EventTraceWriterTests.cpp @@ -30,7 +30,7 @@ class EventTraceWriterTests : public testing::Test { } void TearDown() override { - ShutdownEventTrace(); + FlushEventTraceToDisk(); } };