citrace.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2015 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "common/common_types.h"
  6. namespace CiTrace {
  7. // NOTE: Things are stored in little-endian
  8. #pragma pack(1)
  9. struct CTHeader {
  10. static const char* ExpectedMagicWord() {
  11. return "CiTr";
  12. }
  13. static u32 ExpectedVersion() {
  14. return 1;
  15. }
  16. char magic[4];
  17. u32 version;
  18. u32 header_size;
  19. struct {
  20. // NOTE: Register range sizes are technically hardware-constants, but the actual limits
  21. // aren't known. Hence we store the presumed limits along the offsets.
  22. // Sizes are given in u32 units.
  23. u32 gpu_registers;
  24. u32 gpu_registers_size;
  25. u32 lcd_registers;
  26. u32 lcd_registers_size;
  27. u32 pica_registers;
  28. u32 pica_registers_size;
  29. u32 default_attributes;
  30. u32 default_attributes_size;
  31. u32 vs_program_binary;
  32. u32 vs_program_binary_size;
  33. u32 vs_swizzle_data;
  34. u32 vs_swizzle_data_size;
  35. u32 vs_float_uniforms;
  36. u32 vs_float_uniforms_size;
  37. u32 gs_program_binary;
  38. u32 gs_program_binary_size;
  39. u32 gs_swizzle_data;
  40. u32 gs_swizzle_data_size;
  41. u32 gs_float_uniforms;
  42. u32 gs_float_uniforms_size;
  43. // Other things we might want to store here:
  44. // - Initial framebuffer data, maybe even a full copy of FCRAM/VRAM
  45. // - Lookup tables for fragment lighting
  46. // - Lookup tables for procedural textures
  47. } initial_state_offsets;
  48. u32 stream_offset;
  49. u32 stream_size;
  50. };
  51. enum CTStreamElementType : u32 {
  52. FrameMarker = 0xE1,
  53. MemoryLoad = 0xE2,
  54. RegisterWrite = 0xE3,
  55. };
  56. struct CTMemoryLoad {
  57. u32 file_offset;
  58. u32 size;
  59. u32 physical_address;
  60. u32 pad;
  61. };
  62. struct CTRegisterWrite {
  63. u32 physical_address;
  64. enum : u32 {
  65. SIZE_8 = 0xD1,
  66. SIZE_16 = 0xD2,
  67. SIZE_32 = 0xD3,
  68. SIZE_64 = 0xD4,
  69. } size;
  70. // TODO: Make it clearer which bits of this member are used for sizes other than 32 bits
  71. u64 value;
  72. };
  73. struct CTStreamElement {
  74. CTStreamElementType type;
  75. union {
  76. CTMemoryLoad memory_load;
  77. CTRegisterWrite register_write;
  78. };
  79. };
  80. #pragma pack()
  81. }