| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Copyright 2015 Citra Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <string>
- #include <unordered_map>
- #include <vector>
- #include <boost/crc.hpp>
- #include "common/common_types.h"
- #include "core/tracer/citrace.h"
- namespace CiTrace {
- class Recorder {
- public:
- struct InitialState {
- std::vector<u32> gpu_registers;
- std::vector<u32> lcd_registers;
- std::vector<u32> pica_registers;
- std::vector<u32> default_attributes;
- std::vector<u32> vs_program_binary;
- std::vector<u32> vs_swizzle_data;
- std::vector<u32> vs_float_uniforms;
- std::vector<u32> gs_program_binary;
- std::vector<u32> gs_swizzle_data;
- std::vector<u32> gs_float_uniforms;
- };
- /**
- * Recorder constructor
- * @param initial_state Initial recorder state
- */
- Recorder(const InitialState& initial_state);
- /// Finish recording of this Citrace and save it using the given filename.
- void Finish(const std::string& filename);
- /// Mark end of a frame
- void FrameFinished();
- /**
- * Store a copy of the given memory range in the recording.
- * @note Use this whenever the GPU is about to access a particular memory region.
- * @note The implementation will make sure to minimize redundant memory updates.
- */
- void MemoryAccessed(const u8* data, u32 size, u32 physical_address);
- /**
- * Record a register write.
- * @note Use this whenever a GPU-related MMIO register has been written to.
- */
- template <typename T>
- void RegisterWritten(u32 physical_address, T value);
- private:
- // Initial state of recording start
- InitialState initial_state;
- // Command stream
- struct StreamElement {
- CTStreamElement data;
- /**
- * Extra data to store along "core" data.
- * This is e.g. used for data used in MemoryUpdates.
- */
- std::vector<u8> extra_data;
- /// Optional CRC hash (e.g. for hashing memory regions)
- boost::crc_32_type::value_type hash;
- /// If true, refer to data already written to the output file instead of extra_data
- bool uses_existing_data;
- };
- std::vector<StreamElement> stream;
- /**
- * Internal cache which maps hashes of memory contents to file offsets at which those memory
- * contents are stored.
- */
- std::unordered_map<boost::crc_32_type::value_type /*hash*/, u32 /*file_offset*/> memory_regions;
- };
- } // namespace
|