diff options
| author | Triang3l <triang3l@yandex.ru> | 2019-10-25 21:32:17 +0300 |
|---|---|---|
| committer | Triang3l <triang3l@yandex.ru> | 2019-10-25 21:32:17 +0300 |
| commit | 36f4158f099ffed5f40c441102738992799b25fe (patch) | |
| tree | 94bb83ccae3ebde33b35dfc490be3be04db6b8cc | |
| parent | f75d927cc5483481e1f99c60610461032c164a04 (diff) | |
[GPU] Trace dump: Do PIX/RenderDoc capture if attached
| -rw-r--r-- | src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc | 19 | ||||
| -rw-r--r-- | src/xenia/gpu/trace_dump.cc | 2 | ||||
| -rw-r--r-- | src/xenia/gpu/trace_dump.h | 3 | ||||
| -rw-r--r-- | src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc | 20 |
4 files changed, 44 insertions, 0 deletions
diff --git a/src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc b/src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc index b10a9c1e5..c68b29788 100644 --- a/src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc +++ b/src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc @@ -12,6 +12,7 @@ #include "xenia/gpu/d3d12/d3d12_command_processor.h" #include "xenia/gpu/d3d12/d3d12_graphics_system.h" #include "xenia/gpu/trace_dump.h" +#include "xenia/ui/d3d12/d3d12_provider.h" namespace xe { namespace gpu { @@ -24,6 +25,24 @@ class D3D12TraceDump : public TraceDump { std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override { return std::unique_ptr<gpu::GraphicsSystem>(new D3D12GraphicsSystem()); } + + void BeginHostCapture() override { + auto provider = static_cast<const ui::d3d12::D3D12Provider*>( + graphics_system_->provider()); + IDXGraphicsAnalysis* graphics_analysis = provider->GetGraphicsAnalysis(); + if (graphics_analysis) { + graphics_analysis->BeginCapture(); + } + } + + void EndHostCapture() override { + auto provider = static_cast<const ui::d3d12::D3D12Provider*>( + graphics_system_->provider()); + IDXGraphicsAnalysis* graphics_analysis = provider->GetGraphicsAnalysis(); + if (graphics_analysis) { + graphics_analysis->EndCapture(); + } + } }; int trace_dump_main(const std::vector<std::wstring>& args) { diff --git a/src/xenia/gpu/trace_dump.cc b/src/xenia/gpu/trace_dump.cc index 971d8fc16..b7b27df1a 100644 --- a/src/xenia/gpu/trace_dump.cc +++ b/src/xenia/gpu/trace_dump.cc @@ -126,10 +126,12 @@ bool TraceDump::Load(std::wstring trace_file_path) { } int TraceDump::Run() { + BeginHostCapture(); player_->SeekFrame(0); player_->SeekCommand( static_cast<int>(player_->current_frame()->commands.size() - 1)); player_->WaitOnPlayback(); + EndHostCapture(); // Capture. int result = 0; diff --git a/src/xenia/gpu/trace_dump.h b/src/xenia/gpu/trace_dump.h index eb7ab43da..f2e4c7347 100644 --- a/src/xenia/gpu/trace_dump.h +++ b/src/xenia/gpu/trace_dump.h @@ -43,6 +43,9 @@ class TraceDump { virtual std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() = 0; + virtual void BeginHostCapture() = 0; + virtual void EndHostCapture() = 0; + std::unique_ptr<Emulator> emulator_; GraphicsSystem* graphics_system_ = nullptr; std::unique_ptr<TracePlayer> player_; diff --git a/src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc b/src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc index bd4c1f9a5..a895b6e42 100644 --- a/src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc +++ b/src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc @@ -12,6 +12,8 @@ #include "xenia/gpu/trace_dump.h" #include "xenia/gpu/vulkan/vulkan_command_processor.h" #include "xenia/gpu/vulkan/vulkan_graphics_system.h" +#include "xenia/ui/vulkan/vulkan_device.h" +#include "xenia/ui/vulkan/vulkan_provider.h" namespace xe { namespace gpu { @@ -24,6 +26,24 @@ class VulkanTraceDump : public TraceDump { std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override { return std::unique_ptr<gpu::GraphicsSystem>(new VulkanGraphicsSystem()); } + + void BeginHostCapture() override { + auto device = static_cast<const ui::vulkan::VulkanProvider*>( + graphics_system_->provider()) + ->device(); + if (device->is_renderdoc_attached()) { + device->BeginRenderDocFrameCapture(); + } + } + + void EndHostCapture() override { + auto device = static_cast<const ui::vulkan::VulkanProvider*>( + graphics_system_->provider()) + ->device(); + if (device->is_renderdoc_attached()) { + device->EndRenderDocFrameCapture(); + } + } }; int trace_dump_main(const std::vector<std::wstring>& args) { |
