summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/citra_qt/debugger/graphics_tracing.cpp8
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/tracer/citrace.h (renamed from src/core/tracer/tracer.h)5
-rw-r--r--src/core/tracer/recorder.cpp70
-rw-r--r--src/core/tracer/recorder.h23
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
13namespace CiTrace { 13namespace CiTrace {
14 14
15Recorder::Recorder(u32* gpu_registers, u32 gpu_registers_size, 15Recorder::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
16namespace CiTrace { 16namespace CiTrace {
17 17
@@ -19,17 +19,19 @@ class Recorder {
19public: 19public:
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;