diff options
| author | Tony Wasserka <neobrainx@gmail.com> | 2015-07-13 21:39:58 +0200 | 
|---|---|---|
| committer | Tony Wasserka <neobrainx@gmail.com> | 2015-07-13 21:39:58 +0200 | 
| commit | 884b681ccaf3cb4057ca0ed0102e446736bb535f (patch) | |
| tree | 9359e9b88f0147879c672638d8c02960d2179d3a /src/core/tracer/citrace.h | |
| parent | c4e11519afb8c51b591b88f6bfa531b04d15d588 (diff) | |
| parent | 29abb11e8fbb6a78edf84496979ef946bf4e45a7 (diff) | |
Merge pull request #702 from neobrain/citrace
Add CiTrace recording support.
Diffstat (limited to 'src/core/tracer/citrace.h')
| -rw-r--r-- | src/core/tracer/citrace.h | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/src/core/tracer/citrace.h b/src/core/tracer/citrace.h new file mode 100644 index 000000000..5deb6ce9e --- /dev/null +++ b/src/core/tracer/citrace.h @@ -0,0 +1,101 @@ +// Copyright 2015 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <cstdint> + +namespace CiTrace { + +// NOTE: Things are stored in little-endian + +#pragma pack(1) + +struct CTHeader { +    static const char* ExpectedMagicWord() { +        return "CiTr"; +    } + +    static uint32_t ExpectedVersion() { +        return 1; +    } + +    char magic[4]; +    uint32_t version; +    uint32_t header_size; + +    struct { +        // NOTE: Register range sizes are technically hardware-constants, but the actual limits +        // aren't known. Hence we store the presumed limits along the offsets. +        // Sizes are given in uint32_t units. +        uint32_t gpu_registers; +        uint32_t gpu_registers_size; +        uint32_t lcd_registers; +        uint32_t lcd_registers_size; +        uint32_t pica_registers; +        uint32_t pica_registers_size; +        uint32_t default_attributes; +        uint32_t default_attributes_size; +        uint32_t vs_program_binary; +        uint32_t vs_program_binary_size; +        uint32_t vs_swizzle_data; +        uint32_t vs_swizzle_data_size; +        uint32_t vs_float_uniforms; +        uint32_t vs_float_uniforms_size; +        uint32_t gs_program_binary; +        uint32_t gs_program_binary_size; +        uint32_t gs_swizzle_data; +        uint32_t gs_swizzle_data_size; +        uint32_t gs_float_uniforms; +        uint32_t gs_float_uniforms_size; + +        // Other things we might want to store here: +        // - Initial framebuffer data, maybe even a full copy of FCRAM/VRAM +        // - Lookup tables for fragment lighting +        // - Lookup tables for procedural textures +    } initial_state_offsets; + +    uint32_t stream_offset; +    uint32_t stream_size; +}; + +enum CTStreamElementType : uint32_t { +    FrameMarker   = 0xE1, +    MemoryLoad    = 0xE2, +    RegisterWrite = 0xE3, +}; + +struct CTMemoryLoad { +    uint32_t file_offset; +    uint32_t size; +    uint32_t physical_address; +    uint32_t pad; +}; + +struct CTRegisterWrite { +    uint32_t physical_address; + +    enum : uint32_t { +        SIZE_8  = 0xD1, +        SIZE_16 = 0xD2, +        SIZE_32 = 0xD3, +        SIZE_64 = 0xD4 +    } size; + +    // TODO: Make it clearer which bits of this member are used for sizes other than 32 bits +    uint64_t value; +}; + +struct CTStreamElement { +    CTStreamElementType type; + +    union { +        CTMemoryLoad memory_load; +        CTRegisterWrite register_write; +    }; +}; + +#pragma pack() + +} | 
