summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/citra_qt/debugger/graphics_tracing.cpp24
-rw-r--r--src/core/tracer/recorder.cpp81
-rw-r--r--src/core/tracer/recorder.h35
3 files changed, 61 insertions, 79 deletions
diff --git a/src/citra_qt/debugger/graphics_tracing.cpp b/src/citra_qt/debugger/graphics_tracing.cpp
index 654df12af..3f20f149d 100644
--- a/src/citra_qt/debugger/graphics_tracing.cpp
+++ b/src/citra_qt/debugger/graphics_tracing.cpp
@@ -12,6 +12,8 @@
12#include <QPushButton> 12#include <QPushButton>
13#include <QSpinBox> 13#include <QSpinBox>
14 14
15#include <boost/range/algorithm/copy.hpp>
16
15#include "core/hw/gpu.h" 17#include "core/hw/gpu.h"
16#include "core/hw/lcd.h" 18#include "core/hw/lcd.h"
17 19
@@ -76,15 +78,19 @@ void GraphicsTracingWidget::StartRecording() {
76 for (unsigned comp = 0; comp < 3; ++comp) 78 for (unsigned comp = 0; comp < 3; ++comp)
77 vs_float_uniforms[4 * i + comp] = nihstro::to_float24(Pica::g_state.vs.uniforms.f[i][comp].ToFloat32()); 79 vs_float_uniforms[4 * i + comp] = nihstro::to_float24(Pica::g_state.vs.uniforms.f[i][comp].ToFloat32());
78 80
79 auto recorder = new CiTrace::Recorder((u32*)&GPU::g_regs, sizeof(GPU::g_regs) / sizeof(u32), 81 CiTrace::Recorder::InitialState state;
80 (u32*)&LCD::g_regs, sizeof(LCD::g_regs) / sizeof(u32), 82 std::copy_n((u32*)&GPU::g_regs, sizeof(GPU::g_regs) / sizeof(u32), std::back_inserter(state.gpu_registers));
81 (u32*)&Pica::g_state.regs, sizeof(Pica::g_state.regs) / sizeof(u32), 83 std::copy_n((u32*)&LCD::g_regs, sizeof(LCD::g_regs) / sizeof(u32), std::back_inserter(state.lcd_registers));
82 default_attributes.data(), default_attributes.size(), 84 std::copy_n((u32*)&Pica::g_state.regs, sizeof(Pica::g_state.regs) / sizeof(u32), std::back_inserter(state.pica_registers));
83 shader_binary.data(), shader_binary.size(), 85 boost::copy(default_attributes, std::back_inserter(state.default_attributes));
84 swizzle_data.data(), swizzle_data.size(), 86 boost::copy(shader_binary, std::back_inserter(state.vs_program_binary));
85 vs_float_uniforms.data(), vs_float_uniforms.size(), 87 boost::copy(swizzle_data, std::back_inserter(state.vs_swizzle_data));
86 nullptr, 0, nullptr, 0, nullptr, 0 // Geometry shader is not implemented yet, so submit dummy data for now 88 boost::copy(vs_float_uniforms, std::back_inserter(state.vs_float_uniforms));
87 ); 89 //boost::copy(TODO: Not implemented, std::back_inserter(state.gs_program_binary));
90 //boost::copy(TODO: Not implemented, std::back_inserter(state.gs_swizzle_data));
91 //boost::copy(TODO: Not implemented, std::back_inserter(state.gs_float_uniforms));
92
93 auto recorder = new CiTrace::Recorder(state);
88 context->recorder = std::shared_ptr<CiTrace::Recorder>(recorder); 94 context->recorder = std::shared_ptr<CiTrace::Recorder>(recorder);
89 95
90 emit SetStartTracingButtonEnabled(false); 96 emit SetStartTracingButtonEnabled(false);
diff --git a/src/core/tracer/recorder.cpp b/src/core/tracer/recorder.cpp
index c5251634b..656706c0c 100644
--- a/src/core/tracer/recorder.cpp
+++ b/src/core/tracer/recorder.cpp
@@ -12,26 +12,7 @@
12 12
13namespace CiTrace { 13namespace CiTrace {
14 14
15Recorder::Recorder(u32* gpu_registers, u32 gpu_registers_size, 15Recorder::Recorder(const InitialState& initial_state) : initial_state(initial_state) {
16 u32* lcd_registers, u32 lcd_registers_size,
17 u32* pica_registers, u32 pica_registers_size,
18 u32* default_attributes, u32 default_attributes_size,
19 u32* vs_program_binary, u32 vs_program_binary_size,
20 u32* vs_swizzle_data, u32 vs_swizzle_data_size,
21 u32* vs_float_uniforms, u32 vs_float_uniforms_size,
22 u32* gs_program_binary, u32 gs_program_binary_size,
23 u32* gs_swizzle_data, u32 gs_swizzle_data_size,
24 u32* gs_float_uniforms, u32 gs_float_uniforms_size)
25 : gpu_registers(gpu_registers, gpu_registers + gpu_registers_size),
26 lcd_registers(lcd_registers, lcd_registers + lcd_registers_size),
27 pica_registers(pica_registers, pica_registers + pica_registers_size),
28 default_attributes(default_attributes, default_attributes + default_attributes_size),
29 vs_program_binary(vs_program_binary, vs_program_binary + vs_program_binary_size),
30 vs_swizzle_data(vs_swizzle_data, vs_swizzle_data + vs_swizzle_data_size),
31 vs_float_uniforms(vs_float_uniforms, vs_float_uniforms + vs_float_uniforms_size),
32 gs_program_binary(gs_program_binary, gs_program_binary + gs_program_binary_size),
33 gs_swizzle_data(gs_swizzle_data, gs_swizzle_data + gs_swizzle_data_size),
34 gs_float_uniforms(gs_float_uniforms, gs_float_uniforms + gs_float_uniforms_size) {
35 16
36} 17}
37 18
@@ -45,16 +26,16 @@ void Recorder::Finish(const std::string& filename) {
45 // Calculate file offsets 26 // Calculate file offsets
46 auto& initial = header.initial_state_offsets; 27 auto& initial = header.initial_state_offsets;
47 28
48 initial.gpu_registers_size = gpu_registers.size(); 29 initial.gpu_registers_size = initial_state.gpu_registers.size();
49 initial.lcd_registers_size = lcd_registers.size(); 30 initial.lcd_registers_size = initial_state.lcd_registers.size();
50 initial.pica_registers_size = pica_registers.size(); 31 initial.pica_registers_size = initial_state.pica_registers.size();
51 initial.default_attributes_size = default_attributes.size(); 32 initial.default_attributes_size = initial_state.default_attributes.size();
52 initial.vs_program_binary_size = vs_program_binary.size(); 33 initial.vs_program_binary_size = initial_state.vs_program_binary.size();
53 initial.vs_swizzle_data_size = vs_swizzle_data.size(); 34 initial.vs_swizzle_data_size = initial_state.vs_swizzle_data.size();
54 initial.vs_float_uniforms_size = vs_float_uniforms.size(); 35 initial.vs_float_uniforms_size = initial_state.vs_float_uniforms.size();
55 initial.gs_program_binary_size = gs_program_binary.size(); 36 initial.gs_program_binary_size = initial_state.gs_program_binary.size();
56 initial.gs_swizzle_data_size = gs_swizzle_data.size(); 37 initial.gs_swizzle_data_size = initial_state.gs_swizzle_data.size();
57 initial.gs_float_uniforms_size = gs_float_uniforms.size(); 38 initial.gs_float_uniforms_size = initial_state.gs_float_uniforms.size();
58 header.stream_size = stream.size(); 39 header.stream_size = stream.size();
59 40
60 initial.gpu_registers = sizeof(header); 41 initial.gpu_registers = sizeof(header);
@@ -98,44 +79,44 @@ void Recorder::Finish(const std::string& filename) {
98 throw "Failed to write header"; 79 throw "Failed to write header";
99 80
100 // Write initial state 81 // Write initial state
101 written = file.WriteArray(gpu_registers.data(), gpu_registers.size()); 82 written = file.WriteArray(initial_state.gpu_registers.data(), initial_state.gpu_registers.size());
102 if (written != gpu_registers.size() || file.Tell() != initial.lcd_registers) 83 if (written != initial_state.gpu_registers.size() || file.Tell() != initial.lcd_registers)
103 throw "Failed to write GPU registers"; 84 throw "Failed to write GPU registers";
104 85
105 written = file.WriteArray(lcd_registers.data(), lcd_registers.size()); 86 written = file.WriteArray(initial_state.lcd_registers.data(), initial_state.lcd_registers.size());
106 if (written != lcd_registers.size() || file.Tell() != initial.pica_registers) 87 if (written != initial_state.lcd_registers.size() || file.Tell() != initial.pica_registers)
107 throw "Failed to write LCD registers"; 88 throw "Failed to write LCD registers";
108 89
109 written = file.WriteArray(pica_registers.data(), pica_registers.size()); 90 written = file.WriteArray(initial_state.pica_registers.data(), initial_state.pica_registers.size());
110 if (written != pica_registers.size() || file.Tell() != initial.default_attributes) 91 if (written != initial_state.pica_registers.size() || file.Tell() != initial.default_attributes)
111 throw "Failed to write Pica registers"; 92 throw "Failed to write Pica registers";
112 93
113 written = file.WriteArray(default_attributes.data(), default_attributes.size()); 94 written = file.WriteArray(initial_state.default_attributes.data(), initial_state.default_attributes.size());
114 if (written != default_attributes.size() || file.Tell() != initial.vs_program_binary) 95 if (written != initial_state.default_attributes.size() || file.Tell() != initial.vs_program_binary)
115 throw "Failed to write default vertex attributes"; 96 throw "Failed to write default vertex attributes";
116 97
117 written = file.WriteArray(vs_program_binary.data(), vs_program_binary.size()); 98 written = file.WriteArray(initial_state.vs_program_binary.data(), initial_state.vs_program_binary.size());
118 if (written != vs_program_binary.size() || file.Tell() != initial.vs_swizzle_data) 99 if (written != initial_state.vs_program_binary.size() || file.Tell() != initial.vs_swizzle_data)
119 throw "Failed to write vertex shader program binary"; 100 throw "Failed to write vertex shader program binary";
120 101
121 written = file.WriteArray(vs_swizzle_data.data(), vs_swizzle_data.size()); 102 written = file.WriteArray(initial_state.vs_swizzle_data.data(), initial_state.vs_swizzle_data.size());
122 if (written != vs_swizzle_data.size() || file.Tell() != initial.vs_float_uniforms) 103 if (written != initial_state.vs_swizzle_data.size() || file.Tell() != initial.vs_float_uniforms)
123 throw "Failed to write vertex shader swizzle data"; 104 throw "Failed to write vertex shader swizzle data";
124 105
125 written = file.WriteArray(vs_float_uniforms.data(), vs_float_uniforms.size()); 106 written = file.WriteArray(initial_state.vs_float_uniforms.data(), initial_state.vs_float_uniforms.size());
126 if (written != vs_float_uniforms.size() || file.Tell() != initial.gs_program_binary) 107 if (written != initial_state.vs_float_uniforms.size() || file.Tell() != initial.gs_program_binary)
127 throw "Failed to write vertex shader float uniforms"; 108 throw "Failed to write vertex shader float uniforms";
128 109
129 written = file.WriteArray(gs_program_binary.data(), gs_program_binary.size()); 110 written = file.WriteArray(initial_state.gs_program_binary.data(), initial_state.gs_program_binary.size());
130 if (written != gs_program_binary.size() || file.Tell() != initial.gs_swizzle_data) 111 if (written != initial_state.gs_program_binary.size() || file.Tell() != initial.gs_swizzle_data)
131 throw "Failed to write geomtry shader program binary"; 112 throw "Failed to write geomtry shader program binary";
132 113
133 written = file.WriteArray(gs_swizzle_data.data(), gs_swizzle_data.size()); 114 written = file.WriteArray(initial_state.gs_swizzle_data.data(), initial_state.gs_swizzle_data.size());
134 if (written != gs_swizzle_data.size() || file.Tell() != initial.gs_float_uniforms) 115 if (written != initial_state.gs_swizzle_data.size() || file.Tell() != initial.gs_float_uniforms)
135 throw "Failed to write geometry shader swizzle data"; 116 throw "Failed to write geometry shader swizzle data";
136 117
137 written = file.WriteArray(gs_float_uniforms.data(), gs_float_uniforms.size()); 118 written = file.WriteArray(initial_state.gs_float_uniforms.data(), initial_state.gs_float_uniforms.size());
138 if (written != gs_float_uniforms.size() || file.Tell() != initial.gs_float_uniforms + sizeof(u32) * initial.gs_float_uniforms_size) 119 if (written != initial_state.gs_float_uniforms.size() || file.Tell() != initial.gs_float_uniforms + sizeof(u32) * initial.gs_float_uniforms_size)
139 throw "Failed to write geometry shader float uniforms"; 120 throw "Failed to write geometry shader float uniforms";
140 121
141 // Iterate through stream elements, write "extra data" 122 // Iterate through stream elements, write "extra data"
diff --git a/src/core/tracer/recorder.h b/src/core/tracer/recorder.h
index da77aac56..6e4b70015 100644
--- a/src/core/tracer/recorder.h
+++ b/src/core/tracer/recorder.h
@@ -17,21 +17,25 @@ namespace CiTrace {
17 17
18class Recorder { 18class Recorder {
19public: 19public:
20 struct InitialState {
21 std::vector<u32> gpu_registers;
22 std::vector<u32> lcd_registers;
23 std::vector<u32> pica_registers;
24 std::vector<u32> default_attributes;
25 std::vector<u32> vs_program_binary;
26 std::vector<u32> vs_swizzle_data;
27 std::vector<u32> vs_float_uniforms;
28 std::vector<u32> gs_program_binary;
29 std::vector<u32> gs_swizzle_data;
30 std::vector<u32> gs_float_uniforms;
31 };
32
20 /** 33 /**
21 * Recorder constructor 34 * Recorder constructor
22 * @param default_attributes Pointer to an array of 32-bit-aligned 24-bit floating point values. 35 * @param default_attributes Pointer to an array of 32-bit-aligned 24-bit floating point values.
23 * @param vs_float_uniforms Pointer to an array of 32-bit-aligned 24-bit floating point values. 36 * @param vs_float_uniforms Pointer to an array of 32-bit-aligned 24-bit floating point values.
24 */ 37 */
25 Recorder(u32* gpu_registers, u32 gpu_registers_size, 38 Recorder(const InitialState& initial_state);
26 u32* lcd_registers, u32 lcd_registers_size,
27 u32* pica_registers, u32 pica_registers_size,
28 u32* default_attributes, u32 default_attributes_size,
29 u32* vs_program_binary, u32 vs_program_binary_size,
30 u32* vs_swizzle_data, u32 vs_swizzle_data_size,
31 u32* vs_float_uniforms, u32 vs_float_uniforms_size,
32 u32* gs_program_binary, u32 gs_program_binary_size,
33 u32* gs_swizzle_data, u32 gs_swizzle_data_size,
34 u32* gs_float_uniforms, u32 gs_float_uniforms_size);
35 39
36 /// Finish recording of this Citrace and save it using the given filename. 40 /// Finish recording of this Citrace and save it using the given filename.
37 void Finish(const std::string& filename); 41 void Finish(const std::string& filename);
@@ -55,16 +59,7 @@ public:
55 59
56private: 60private:
57 // Initial state of recording start 61 // Initial state of recording start
58 std::vector<u32> gpu_registers; 62 InitialState initial_state;
59 std::vector<u32> lcd_registers;
60 std::vector<u32> pica_registers;
61 std::vector<u32> default_attributes;
62 std::vector<u32> vs_program_binary;
63 std::vector<u32> vs_swizzle_data;
64 std::vector<u32> vs_float_uniforms;
65 std::vector<u32> gs_program_binary;
66 std::vector<u32> gs_swizzle_data;
67 std::vector<u32> gs_float_uniforms;
68 63
69 // Command stream 64 // Command stream
70 struct StreamElement { 65 struct StreamElement {