/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2015 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_GPU_TRACE_READER_H_ #define XENIA_GPU_TRACE_READER_H_ #include #include "xenia/base/mapped_memory.h" #include "xenia/gpu/trace_protocol.h" #include "xenia/memory.h" namespace xe { namespace gpu { // void Foo() { // auto trace_ptr = trace_data; // while (trace_ptr < trace_data + trace_size) { // auto cmd_type = *reinterpret_cast(trace_ptr); // switch (cmd_type) { // case TraceCommandType::kPrimaryBufferStart: // break; // case TraceCommandType::kPrimaryBufferEnd: // break; // case TraceCommandType::kIndirectBufferStart: // break; // case TraceCommandType::kIndirectBufferEnd: // break; // case TraceCommandType::kPacketStart: // break; // case TraceCommandType::kPacketEnd: // break; // case TraceCommandType::kMemoryRead: // break; // case TraceCommandType::kMemoryWrite: // break; // case TraceCommandType::kEvent: // break; // } // /*trace_ptr = graphics_system->PlayTrace( // trace_ptr, trace_size - (trace_ptr - trace_data), // GraphicsSystem::TracePlaybackMode::kBreakOnSwap);*/ // } //} class TraceReader { public: struct Frame { struct Command { enum class Type { kDraw, kSwap, }; const uint8_t* head_ptr; const uint8_t* start_ptr; const uint8_t* end_ptr; Type type; union { struct { // } draw; struct { // } swap; }; }; const uint8_t* start_ptr; const uint8_t* end_ptr; int command_count; std::vector commands; }; TraceReader() = default; virtual ~TraceReader() = default; const Frame* frame(int n) const { return &frames_[n]; } int frame_count() const { return int(frames_.size()); } bool Open(const std::wstring& path); void Close(); protected: void ParseTrace(); bool DecompressMemory(const uint8_t* src, size_t src_size, uint8_t* dest, size_t dest_size); std::unique_ptr mmap_; const uint8_t* trace_data_ = nullptr; size_t trace_size_ = 0; std::vector frames_; }; } // namespace gpu } // namespace xe #endif // XENIA_GPU_TRACE_READER_H_