#pragma once #include "replay_parser.h" #include "replay_ringbuffer.h" #include #include #include #include #include #include #include #include #include class ReplayParserPM4 : public ReplayParser { ReplayParserPM4() = default; ReplayParserPM4(const ReplayParserPM4 &) = delete; ReplayParserPM4(ReplayParserPM4 &&) = delete; ReplayParserPM4 &operator=(const ReplayParserPM4 &) = delete; ReplayParserPM4 &operator=(ReplayParserPM4 &&) = delete; public: virtual ~ReplayParserPM4() = default; bool runUntilTimestamp(uint64_t timestamp) override; static std::unique_ptr Create(gpu::GraphicsDriver *driver, RingBuffer *ringBuffer, phys_ptr heap, const std::string &path); private: bool handleCommandBuffer(void *buffer, uint32_t sizeBytes); void handleSetBuffer(decaf::pm4::CaptureSetBuffer &setBuffer); void handleRegisterSnapshot(phys_ptr registers, uint32_t count); void handleMemoryLoad(decaf::pm4::CaptureMemoryLoad &load, std::vector &data); bool scanType0(latte::pm4::HeaderType0 header, const gsl::span> &data); bool scanType3(latte::pm4::HeaderType3 header, const gsl::span> &data); bool scanCommandBuffer(void *words, uint32_t numWords); private: gpu::GraphicsDriver *mGraphicsDriver = nullptr; RingBuffer *mRingBuffer = nullptr; std::ifstream mFile; phys_ptr mHeap = nullptr; phys_ptr mRegisterStorage = nullptr; };