diff options
| -rw-r--r-- | src/citra_qt/debugger/graphics_tracing.cpp | 8 | ||||
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/tracer/citrace.h (renamed from src/core/tracer/tracer.h) | 5 | ||||
| -rw-r--r-- | src/core/tracer/recorder.cpp | 70 | ||||
| -rw-r--r-- | src/core/tracer/recorder.h | 23 |
5 files changed, 65 insertions, 43 deletions
diff --git a/src/citra_qt/debugger/graphics_tracing.cpp b/src/citra_qt/debugger/graphics_tracing.cpp index eac405820..3e88346c0 100644 --- a/src/citra_qt/debugger/graphics_tracing.cpp +++ b/src/citra_qt/debugger/graphics_tracing.cpp | |||
| @@ -62,12 +62,20 @@ void GraphicsTracingWidget::StartRecording() { | |||
| 62 | 62 | ||
| 63 | // Encode floating point numbers to 24-bit values | 63 | // Encode floating point numbers to 24-bit values |
| 64 | // TODO: Drop this explicit conversion once we store float24 values bit-correctly internally. | 64 | // TODO: Drop this explicit conversion once we store float24 values bit-correctly internally. |
| 65 | std::array<Math::Vec4<uint32_t>, 16> default_attributes; | ||
| 66 | for (unsigned i = 0; i < 16; ++i) { | ||
| 67 | for (unsigned comp = 0; comp < 3; ++comp) { | ||
| 68 | default_attributes[i][comp] = nihstro::to_float24(Pica::g_state.vs.default_attributes[i][comp].ToFloat32()); | ||
| 69 | } | ||
| 70 | } | ||
| 71 | |||
| 65 | std::array<Math::Vec4<uint32_t>, 96> vs_float_uniforms; | 72 | std::array<Math::Vec4<uint32_t>, 96> vs_float_uniforms; |
| 66 | for (unsigned i = 0; i < 96; ++i) | 73 | for (unsigned i = 0; i < 96; ++i) |
| 67 | for (unsigned comp = 0; comp < 3; ++comp) | 74 | for (unsigned comp = 0; comp < 3; ++comp) |
| 68 | vs_float_uniforms[i][comp] = nihstro::to_float24(Pica::g_state.vs.uniforms.f[i][comp].ToFloat32()); | 75 | vs_float_uniforms[i][comp] = nihstro::to_float24(Pica::g_state.vs.uniforms.f[i][comp].ToFloat32()); |
| 69 | 76 | ||
| 70 | auto recorder = new CiTrace::Recorder((u32*)&GPU::g_regs, 0x700, nullptr, 0, (u32*)&Pica::g_state.regs, 0x300, | 77 | auto recorder = new CiTrace::Recorder((u32*)&GPU::g_regs, 0x700, nullptr, 0, (u32*)&Pica::g_state.regs, 0x300, |
| 78 | (u32*)default_attributes.data(), default_attributes.size() * 4, | ||
| 71 | shader_binary.data(), shader_binary.size(), | 79 | shader_binary.data(), shader_binary.size(), |
| 72 | swizzle_data.data(), swizzle_data.size(), | 80 | swizzle_data.data(), swizzle_data.size(), |
| 73 | (u32*)vs_float_uniforms.data(), vs_float_uniforms.size() * 4, | 81 | (u32*)vs_float_uniforms.data(), vs_float_uniforms.size() * 4, |
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5066eb258..8267ee586 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -245,7 +245,7 @@ set(HEADERS | |||
| 245 | loader/loader.h | 245 | loader/loader.h |
| 246 | loader/ncch.h | 246 | loader/ncch.h |
| 247 | tracer/recorder.h | 247 | tracer/recorder.h |
| 248 | tracer/tracer.h | 248 | tracer/citrace.h |
| 249 | mem_map.h | 249 | mem_map.h |
| 250 | memory.h | 250 | memory.h |
| 251 | memory_setup.h | 251 | memory_setup.h |
diff --git a/src/core/tracer/tracer.h b/src/core/tracer/citrace.h index 1545d7439..5deb6ce9e 100644 --- a/src/core/tracer/tracer.h +++ b/src/core/tracer/citrace.h | |||
| @@ -35,6 +35,8 @@ struct CTHeader { | |||
| 35 | uint32_t lcd_registers_size; | 35 | uint32_t lcd_registers_size; |
| 36 | uint32_t pica_registers; | 36 | uint32_t pica_registers; |
| 37 | uint32_t pica_registers_size; | 37 | uint32_t pica_registers_size; |
| 38 | uint32_t default_attributes; | ||
| 39 | uint32_t default_attributes_size; | ||
| 38 | uint32_t vs_program_binary; | 40 | uint32_t vs_program_binary; |
| 39 | uint32_t vs_program_binary_size; | 41 | uint32_t vs_program_binary_size; |
| 40 | uint32_t vs_swizzle_data; | 42 | uint32_t vs_swizzle_data; |
| @@ -50,7 +52,8 @@ struct CTHeader { | |||
| 50 | 52 | ||
| 51 | // Other things we might want to store here: | 53 | // Other things we might want to store here: |
| 52 | // - Initial framebuffer data, maybe even a full copy of FCRAM/VRAM | 54 | // - Initial framebuffer data, maybe even a full copy of FCRAM/VRAM |
| 53 | // - Default vertex attributes | 55 | // - Lookup tables for fragment lighting |
| 56 | // - Lookup tables for procedural textures | ||
| 54 | } initial_state_offsets; | 57 | } initial_state_offsets; |
| 55 | 58 | ||
| 56 | uint32_t stream_offset; | 59 | uint32_t stream_offset; |
diff --git a/src/core/tracer/recorder.cpp b/src/core/tracer/recorder.cpp index 73ebdd388..c5251634b 100644 --- a/src/core/tracer/recorder.cpp +++ b/src/core/tracer/recorder.cpp | |||
| @@ -12,18 +12,20 @@ | |||
| 12 | 12 | ||
| 13 | namespace CiTrace { | 13 | namespace CiTrace { |
| 14 | 14 | ||
| 15 | Recorder::Recorder(u32* gpu_registers, u32 gpu_registers_size, | 15 | Recorder::Recorder(u32* gpu_registers, u32 gpu_registers_size, |
| 16 | u32* lcd_registers, u32 lcd_registers_size, | 16 | u32* lcd_registers, u32 lcd_registers_size, |
| 17 | u32* pica_registers, u32 pica_registers_size, | 17 | u32* pica_registers, u32 pica_registers_size, |
| 18 | u32* vs_program_binary, u32 vs_program_binary_size, | 18 | u32* default_attributes, u32 default_attributes_size, |
| 19 | u32* vs_swizzle_data, u32 vs_swizzle_data_size, | 19 | u32* vs_program_binary, u32 vs_program_binary_size, |
| 20 | u32* vs_float_uniforms, u32 vs_float_uniforms_size, | 20 | u32* vs_swizzle_data, u32 vs_swizzle_data_size, |
| 21 | u32* gs_program_binary, u32 gs_program_binary_size, | 21 | u32* vs_float_uniforms, u32 vs_float_uniforms_size, |
| 22 | u32* gs_swizzle_data, u32 gs_swizzle_data_size, | 22 | u32* gs_program_binary, u32 gs_program_binary_size, |
| 23 | u32* gs_float_uniforms, u32 gs_float_uniforms_size) | 23 | u32* gs_swizzle_data, u32 gs_swizzle_data_size, |
| 24 | u32* gs_float_uniforms, u32 gs_float_uniforms_size) | ||
| 24 | : gpu_registers(gpu_registers, gpu_registers + gpu_registers_size), | 25 | : gpu_registers(gpu_registers, gpu_registers + gpu_registers_size), |
| 25 | lcd_registers(lcd_registers, lcd_registers + lcd_registers_size), | 26 | lcd_registers(lcd_registers, lcd_registers + lcd_registers_size), |
| 26 | pica_registers(pica_registers, pica_registers + pica_registers_size), | 27 | pica_registers(pica_registers, pica_registers + pica_registers_size), |
| 28 | default_attributes(default_attributes, default_attributes + default_attributes_size), | ||
| 27 | vs_program_binary(vs_program_binary, vs_program_binary + vs_program_binary_size), | 29 | vs_program_binary(vs_program_binary, vs_program_binary + vs_program_binary_size), |
| 28 | vs_swizzle_data(vs_swizzle_data, vs_swizzle_data + vs_swizzle_data_size), | 30 | vs_swizzle_data(vs_swizzle_data, vs_swizzle_data + vs_swizzle_data_size), |
| 29 | vs_float_uniforms(vs_float_uniforms, vs_float_uniforms + vs_float_uniforms_size), | 31 | vs_float_uniforms(vs_float_uniforms, vs_float_uniforms + vs_float_uniforms_size), |
| @@ -43,27 +45,29 @@ void Recorder::Finish(const std::string& filename) { | |||
| 43 | // Calculate file offsets | 45 | // Calculate file offsets |
| 44 | auto& initial = header.initial_state_offsets; | 46 | auto& initial = header.initial_state_offsets; |
| 45 | 47 | ||
| 46 | initial.gpu_registers_size = gpu_registers.size(); | 48 | initial.gpu_registers_size = gpu_registers.size(); |
| 47 | initial.lcd_registers_size = lcd_registers.size(); | 49 | initial.lcd_registers_size = lcd_registers.size(); |
| 48 | initial.pica_registers_size = pica_registers.size(); | 50 | initial.pica_registers_size = pica_registers.size(); |
| 49 | initial.vs_program_binary_size = vs_program_binary.size(); | 51 | initial.default_attributes_size = default_attributes.size(); |
| 50 | initial.vs_swizzle_data_size = vs_swizzle_data.size(); | 52 | initial.vs_program_binary_size = vs_program_binary.size(); |
| 51 | initial.vs_float_uniforms_size = vs_float_uniforms.size(); | 53 | initial.vs_swizzle_data_size = vs_swizzle_data.size(); |
| 52 | initial.gs_program_binary_size = gs_program_binary.size(); | 54 | initial.vs_float_uniforms_size = vs_float_uniforms.size(); |
| 53 | initial.gs_swizzle_data_size = gs_swizzle_data.size(); | 55 | initial.gs_program_binary_size = gs_program_binary.size(); |
| 54 | initial.gs_float_uniforms_size = gs_float_uniforms.size(); | 56 | initial.gs_swizzle_data_size = gs_swizzle_data.size(); |
| 55 | header.stream_size = stream.size(); | 57 | initial.gs_float_uniforms_size = gs_float_uniforms.size(); |
| 56 | 58 | header.stream_size = stream.size(); | |
| 57 | initial.gpu_registers = sizeof(header); | 59 | |
| 58 | initial.lcd_registers = initial.gpu_registers + initial.gpu_registers_size * sizeof(u32); | 60 | initial.gpu_registers = sizeof(header); |
| 59 | initial.pica_registers = initial.lcd_registers + initial.lcd_registers_size * sizeof(u32);; | 61 | initial.lcd_registers = initial.gpu_registers + initial.gpu_registers_size * sizeof(u32); |
| 60 | initial.vs_program_binary = initial.pica_registers + initial.pica_registers_size * sizeof(u32); | 62 | initial.pica_registers = initial.lcd_registers + initial.lcd_registers_size * sizeof(u32);; |
| 61 | initial.vs_swizzle_data = initial.vs_program_binary + initial.vs_program_binary_size * sizeof(u32); | 63 | initial.default_attributes = initial.pica_registers + initial.pica_registers_size * sizeof(u32); |
| 62 | initial.vs_float_uniforms = initial.vs_swizzle_data + initial.vs_swizzle_data_size * sizeof(u32); | 64 | initial.vs_program_binary = initial.default_attributes + initial.default_attributes_size * sizeof(u32); |
| 63 | initial.gs_program_binary = initial.vs_float_uniforms + initial.vs_float_uniforms_size * sizeof(u32); | 65 | initial.vs_swizzle_data = initial.vs_program_binary + initial.vs_program_binary_size * sizeof(u32); |
| 64 | initial.gs_swizzle_data = initial.gs_program_binary + initial.gs_program_binary_size * sizeof(u32); | 66 | initial.vs_float_uniforms = initial.vs_swizzle_data + initial.vs_swizzle_data_size * sizeof(u32); |
| 65 | initial.gs_float_uniforms = initial.gs_swizzle_data + initial.gs_swizzle_data_size * sizeof(u32); | 67 | initial.gs_program_binary = initial.vs_float_uniforms + initial.vs_float_uniforms_size * sizeof(u32); |
| 66 | header.stream_offset = initial.gs_float_uniforms + initial.gs_float_uniforms_size * sizeof(u32); | 68 | initial.gs_swizzle_data = initial.gs_program_binary + initial.gs_program_binary_size * sizeof(u32); |
| 69 | initial.gs_float_uniforms = initial.gs_swizzle_data + initial.gs_swizzle_data_size * sizeof(u32); | ||
| 70 | header.stream_offset = initial.gs_float_uniforms + initial.gs_float_uniforms_size * sizeof(u32); | ||
| 67 | 71 | ||
| 68 | // Iterate through stream elements, update relevant stream element data | 72 | // Iterate through stream elements, update relevant stream element data |
| 69 | for (auto& stream_element : stream) { | 73 | for (auto& stream_element : stream) { |
| @@ -103,9 +107,13 @@ void Recorder::Finish(const std::string& filename) { | |||
| 103 | throw "Failed to write LCD registers"; | 107 | throw "Failed to write LCD registers"; |
| 104 | 108 | ||
| 105 | written = file.WriteArray(pica_registers.data(), pica_registers.size()); | 109 | written = file.WriteArray(pica_registers.data(), pica_registers.size()); |
| 106 | if (written != pica_registers.size() || file.Tell() != initial.vs_program_binary) | 110 | if (written != pica_registers.size() || file.Tell() != initial.default_attributes) |
| 107 | throw "Failed to write Pica registers"; | 111 | throw "Failed to write Pica registers"; |
| 108 | 112 | ||
| 113 | written = file.WriteArray(default_attributes.data(), default_attributes.size()); | ||
| 114 | if (written != default_attributes.size() || file.Tell() != initial.vs_program_binary) | ||
| 115 | throw "Failed to write default vertex attributes"; | ||
| 116 | |||
| 109 | written = file.WriteArray(vs_program_binary.data(), vs_program_binary.size()); | 117 | written = file.WriteArray(vs_program_binary.data(), vs_program_binary.size()); |
| 110 | if (written != vs_program_binary.size() || file.Tell() != initial.vs_swizzle_data) | 118 | if (written != vs_program_binary.size() || file.Tell() != initial.vs_swizzle_data) |
| 111 | throw "Failed to write vertex shader program binary"; | 119 | throw "Failed to write vertex shader program binary"; |
diff --git a/src/core/tracer/recorder.h b/src/core/tracer/recorder.h index 8fec0a971..da77aac56 100644 --- a/src/core/tracer/recorder.h +++ b/src/core/tracer/recorder.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | 13 | ||
| 14 | #include "tracer.h" | 14 | #include "citrace.h" |
| 15 | 15 | ||
| 16 | namespace CiTrace { | 16 | namespace CiTrace { |
| 17 | 17 | ||
| @@ -19,17 +19,19 @@ class Recorder { | |||
| 19 | public: | 19 | public: |
| 20 | /** | 20 | /** |
| 21 | * Recorder constructor | 21 | * Recorder constructor |
| 22 | * @param default_attributes Pointer to an array of 32-bit-aligned 24-bit floating point values. | ||
| 22 | * @param vs_float_uniforms 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. |
| 23 | */ | 24 | */ |
| 24 | Recorder(u32* gpu_registers, u32 gpu_registers_size, | 25 | Recorder(u32* gpu_registers, u32 gpu_registers_size, |
| 25 | u32* lcd_registers, u32 lcd_registers_size, | 26 | u32* lcd_registers, u32 lcd_registers_size, |
| 26 | u32* pica_registers, u32 pica_registers_size, | 27 | u32* pica_registers, u32 pica_registers_size, |
| 27 | u32* vs_program_binary, u32 vs_program_binary_size, | 28 | u32* default_attributes, u32 default_attributes_size, |
| 28 | u32* vs_swizzle_data, u32 vs_swizzle_data_size, | 29 | u32* vs_program_binary, u32 vs_program_binary_size, |
| 29 | u32* vs_float_uniforms, u32 vs_float_uniforms_size, | 30 | u32* vs_swizzle_data, u32 vs_swizzle_data_size, |
| 30 | u32* gs_program_binary, u32 gs_program_binary_size, | 31 | u32* vs_float_uniforms, u32 vs_float_uniforms_size, |
| 31 | u32* gs_swizzle_data, u32 gs_swizzle_data_size, | 32 | u32* gs_program_binary, u32 gs_program_binary_size, |
| 32 | u32* gs_float_uniforms, u32 gs_float_uniforms_size); | 33 | u32* gs_swizzle_data, u32 gs_swizzle_data_size, |
| 34 | u32* gs_float_uniforms, u32 gs_float_uniforms_size); | ||
| 33 | 35 | ||
| 34 | /// Finish recording of this Citrace and save it using the given filename. | 36 | /// Finish recording of this Citrace and save it using the given filename. |
| 35 | void Finish(const std::string& filename); | 37 | void Finish(const std::string& filename); |
| @@ -56,6 +58,7 @@ private: | |||
| 56 | std::vector<u32> gpu_registers; | 58 | std::vector<u32> gpu_registers; |
| 57 | std::vector<u32> lcd_registers; | 59 | std::vector<u32> lcd_registers; |
| 58 | std::vector<u32> pica_registers; | 60 | std::vector<u32> pica_registers; |
| 61 | std::vector<u32> default_attributes; | ||
| 59 | std::vector<u32> vs_program_binary; | 62 | std::vector<u32> vs_program_binary; |
| 60 | std::vector<u32> vs_swizzle_data; | 63 | std::vector<u32> vs_swizzle_data; |
| 61 | std::vector<u32> vs_float_uniforms; | 64 | std::vector<u32> vs_float_uniforms; |