From 95b0ecf774578a4faa74bb92e000b942b65727e6 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Sun, 13 Dec 2015 11:22:47 -0800 Subject: [PATCH] Sharing more of trace viewer code. --- src/xenia/emulator.cc | 8 ++- src/xenia/gpu/gl4/gl4_trace_viewer_main.cc | 61 +--------------------- src/xenia/gpu/trace_reader.cc | 5 +- src/xenia/gpu/trace_reader.h | 6 +-- src/xenia/gpu/trace_viewer.cc | 54 +++++++++++++++++++ src/xenia/gpu/trace_viewer.h | 8 +-- 6 files changed, 72 insertions(+), 70 deletions(-) diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index d0f71b35c..745b85ea9 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -50,8 +50,12 @@ Emulator::~Emulator() { } // Give the systems time to shutdown before we delete them. - graphics_system_->Shutdown(); - audio_system_->Shutdown(); + if (graphics_system_) { + graphics_system_->Shutdown(); + } + if (audio_system_) { + audio_system_->Shutdown(); + } input_system_.reset(); graphics_system_.reset(); diff --git a/src/xenia/gpu/gl4/gl4_trace_viewer_main.cc b/src/xenia/gpu/gl4/gl4_trace_viewer_main.cc index 70db61b9a..6a684a064 100644 --- a/src/xenia/gpu/gl4/gl4_trace_viewer_main.cc +++ b/src/xenia/gpu/gl4/gl4_trace_viewer_main.cc @@ -7,21 +7,11 @@ ****************************************************************************** */ -#include - -#include - #include "xenia/base/logging.h" #include "xenia/base/main.h" -#include "xenia/gpu/trace_viewer.h" - -// HACK: until we have another impl, we just use gl4 directly. #include "xenia/gpu/gl4/gl4_command_processor.h" #include "xenia/gpu/gl4/gl4_graphics_system.h" -#include "xenia/gpu/gl4/gl4_shader.h" -#include "xenia/ui/file_picker.h" - -DEFINE_string(target_trace_file, "", "Specifies the trace file to load."); +#include "xenia/gpu/trace_viewer.h" namespace xe { namespace gpu { @@ -69,55 +59,8 @@ class GL4TraceViewer : public TraceViewer { }; int trace_viewer_main(const std::vector& args) { - // Grab path from the flag or unnamed argument. - std::wstring path; - if (!FLAGS_target_trace_file.empty()) { - // Passed as a named argument. - // TODO(benvanik): find something better than gflags that supports - // unicode. - path = xe::to_wstring(FLAGS_target_trace_file); - } else if (args.size() >= 2) { - // Passed as an unnamed argument. - path = args[1]; - } - - // If no path passed, ask the user. - if (path.empty()) { - auto file_picker = xe::ui::FilePicker::Create(); - file_picker->set_mode(ui::FilePicker::Mode::kOpen); - file_picker->set_type(ui::FilePicker::Type::kFile); - file_picker->set_multi_selection(false); - file_picker->set_title(L"Select Trace File"); - file_picker->set_extensions({ - {L"Supported Files", L"*.*"}, {L"All Files (*.*)", L"*.*"}, - }); - if (file_picker->Show()) { - auto selected_files = file_picker->selected_files(); - if (!selected_files.empty()) { - path = selected_files[0]; - } - } - } - - if (path.empty()) { - xe::FatalError("No trace file specified"); - return 1; - } - - // Normalize the path and make absolute. - auto abs_path = xe::to_absolute_path(path); - GL4TraceViewer trace_viewer; - if (!trace_viewer.Setup()) { - xe::FatalError("Unable to setup trace viewer"); - return 1; - } - if (!trace_viewer.Load(std::move(abs_path))) { - xe::FatalError("Unable to load trace file; not found?"); - return 1; - } - trace_viewer.Run(); - return 0; + return trace_viewer.Main(args); } } // namespace gl4 diff --git a/src/xenia/gpu/trace_reader.cc b/src/xenia/gpu/trace_reader.cc index 4f8da3e89..f60b2c956 100644 --- a/src/xenia/gpu/trace_reader.cc +++ b/src/xenia/gpu/trace_reader.cc @@ -43,9 +43,8 @@ void TraceReader::Close() { void TraceReader::ParseTrace() { auto trace_ptr = trace_data_; - Frame current_frame = { - trace_ptr, nullptr, 0, - }; + Frame current_frame; + current_frame.start_ptr = trace_ptr; const PacketStartCommand* packet_start = nullptr; const uint8_t* packet_start_ptr = nullptr; const uint8_t* last_ptr = trace_ptr; diff --git a/src/xenia/gpu/trace_reader.h b/src/xenia/gpu/trace_reader.h index fff24279d..b033f9d05 100644 --- a/src/xenia/gpu/trace_reader.h +++ b/src/xenia/gpu/trace_reader.h @@ -71,9 +71,9 @@ class TraceReader { }; }; - const uint8_t* start_ptr; - const uint8_t* end_ptr; - int command_count; + const uint8_t* start_ptr = nullptr; + const uint8_t* end_ptr = nullptr; + int command_count = 0; std::vector commands; }; diff --git a/src/xenia/gpu/trace_viewer.cc b/src/xenia/gpu/trace_viewer.cc index f5517ea41..54ce1fd64 100644 --- a/src/xenia/gpu/trace_viewer.cc +++ b/src/xenia/gpu/trace_viewer.cc @@ -24,10 +24,13 @@ #include "xenia/gpu/sampler_info.h" #include "xenia/gpu/texture_info.h" #include "xenia/memory.h" +#include "xenia/ui/file_picker.h" #include "xenia/ui/imgui_drawer.h" #include "xenia/ui/window.h" #include "xenia/xbox.h" +DEFINE_string(target_trace_file, "", "Specifies the trace file to load."); + namespace xe { namespace gpu { @@ -44,6 +47,57 @@ TraceViewer::TraceViewer() = default; TraceViewer::~TraceViewer() = default; +int TraceViewer::Main(const std::vector& args) { + // Grab path from the flag or unnamed argument. + std::wstring path; + if (!FLAGS_target_trace_file.empty()) { + // Passed as a named argument. + // TODO(benvanik): find something better than gflags that supports + // unicode. + path = xe::to_wstring(FLAGS_target_trace_file); + } else if (args.size() >= 2) { + // Passed as an unnamed argument. + path = args[1]; + } + + // If no path passed, ask the user. + if (path.empty()) { + auto file_picker = xe::ui::FilePicker::Create(); + file_picker->set_mode(ui::FilePicker::Mode::kOpen); + file_picker->set_type(ui::FilePicker::Type::kFile); + file_picker->set_multi_selection(false); + file_picker->set_title(L"Select Trace File"); + file_picker->set_extensions({ + {L"Supported Files", L"*.*"}, {L"All Files (*.*)", L"*.*"}, + }); + if (file_picker->Show()) { + auto selected_files = file_picker->selected_files(); + if (!selected_files.empty()) { + path = selected_files[0]; + } + } + } + + if (path.empty()) { + xe::FatalError("No trace file specified"); + return 1; + } + + // Normalize the path and make absolute. + auto abs_path = xe::to_absolute_path(path); + + if (!Setup()) { + xe::FatalError("Unable to setup trace viewer"); + return 1; + } + if (!Load(std::move(abs_path))) { + xe::FatalError("Unable to load trace file; not found?"); + return 1; + } + Run(); + return 0; +} + bool TraceViewer::Setup() { // Main display window. loop_ = ui::Loop::Create(); diff --git a/src/xenia/gpu/trace_viewer.h b/src/xenia/gpu/trace_viewer.h index f657565d6..51db4a148 100644 --- a/src/xenia/gpu/trace_viewer.h +++ b/src/xenia/gpu/trace_viewer.h @@ -37,9 +37,7 @@ class TraceViewer { public: virtual ~TraceViewer(); - bool Setup(); - bool Load(std::wstring trace_file_path); - void Run(); + int Main(const std::vector& args); protected: TraceViewer(); @@ -73,6 +71,10 @@ class TraceViewer { kHostDisasm, }; + bool Setup(); + bool Load(std::wstring trace_file_path); + void Run(); + void DrawUI(); void DrawControllerUI(); void DrawPacketDisassemblerUI();