Factoring out a lot of reusable GPU code from gl4/.
This commit is contained in:
102
src/xenia/gpu/trace_reader.h
Normal file
102
src/xenia/gpu/trace_reader.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* 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 <string>
|
||||
|
||||
#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<const TraceCommandType*>(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<Command> 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();
|
||||
|
||||
std::unique_ptr<MappedMemory> mmap_;
|
||||
const uint8_t* trace_data_ = nullptr;
|
||||
size_t trace_size_ = 0;
|
||||
std::vector<Frame> frames_;
|
||||
};
|
||||
|
||||
} // namespace gpu
|
||||
} // namespace xe
|
||||
|
||||
#endif // XENIA_GPU_TRACE_READER_H_
|
||||
Reference in New Issue
Block a user