diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/citra_qt/debugger/graphics_tracing.cpp | 24 | ||||
| -rw-r--r-- | src/core/tracer/recorder.cpp | 81 | ||||
| -rw-r--r-- | src/core/tracer/recorder.h | 35 |
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 | ||
| 13 | namespace CiTrace { | 13 | namespace CiTrace { |
| 14 | 14 | ||
| 15 | Recorder::Recorder(u32* gpu_registers, u32 gpu_registers_size, | 15 | Recorder::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 | ||
| 18 | class Recorder { | 18 | class Recorder { |
| 19 | public: | 19 | public: |
| 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 | ||
| 56 | private: | 60 | private: |
| 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 { |