video_core: Refactor GPU interface (#7272)
* video_core: Refactor GPU interface * citra_qt: Better debug widget lifetime
This commit is contained in:
@@ -75,16 +75,7 @@ struct CTMemoryLoad {
|
||||
|
||||
struct CTRegisterWrite {
|
||||
u32 physical_address;
|
||||
|
||||
enum : u32 {
|
||||
SIZE_8 = 0xD1,
|
||||
SIZE_16 = 0xD2,
|
||||
SIZE_32 = 0xD3,
|
||||
SIZE_64 = 0xD4,
|
||||
} size;
|
||||
|
||||
// TODO: Make it clearer which bits of this member are used for sizes other than 32 bits
|
||||
u64 value;
|
||||
u32 value;
|
||||
};
|
||||
|
||||
struct CTStreamElement {
|
||||
|
||||
@@ -22,9 +22,8 @@ void Recorder::Finish(const std::string& filename) {
|
||||
// Calculate file offsets
|
||||
auto& initial = header.initial_state_offsets;
|
||||
|
||||
initial.gpu_registers_size = static_cast<u32>(initial_state.gpu_registers.size());
|
||||
initial.lcd_registers_size = static_cast<u32>(initial_state.lcd_registers.size());
|
||||
initial.pica_registers_size = static_cast<u32>(initial_state.pica_registers.size());
|
||||
initial.lcd_registers_size = static_cast<u32>(initial_state.lcd_registers.size());
|
||||
initial.default_attributes_size = static_cast<u32>(initial_state.default_attributes.size());
|
||||
initial.vs_program_binary_size = static_cast<u32>(initial_state.vs_program_binary.size());
|
||||
initial.vs_swizzle_data_size = static_cast<u32>(initial_state.vs_swizzle_data.size());
|
||||
@@ -81,22 +80,17 @@ void Recorder::Finish(const std::string& filename) {
|
||||
throw "Failed to write header";
|
||||
|
||||
// Write initial state
|
||||
written =
|
||||
file.WriteArray(initial_state.gpu_registers.data(), initial_state.gpu_registers.size());
|
||||
if (written != initial_state.gpu_registers.size() || file.Tell() != initial.lcd_registers)
|
||||
throw "Failed to write GPU registers";
|
||||
|
||||
written =
|
||||
file.WriteArray(initial_state.lcd_registers.data(), initial_state.lcd_registers.size());
|
||||
if (written != initial_state.lcd_registers.size() || file.Tell() != initial.pica_registers)
|
||||
throw "Failed to write LCD registers";
|
||||
|
||||
written = file.WriteArray(initial_state.pica_registers.data(),
|
||||
initial_state.pica_registers.size());
|
||||
if (written != initial_state.pica_registers.size() ||
|
||||
file.Tell() != initial.default_attributes)
|
||||
throw "Failed to write Pica registers";
|
||||
|
||||
written =
|
||||
file.WriteArray(initial_state.lcd_registers.data(), initial_state.lcd_registers.size());
|
||||
if (written != initial_state.lcd_registers.size() || file.Tell() != initial.pica_registers)
|
||||
throw "Failed to write LCD registers";
|
||||
|
||||
written = file.WriteArray(initial_state.default_attributes.data(),
|
||||
initial_state.default_attributes.size());
|
||||
if (written != initial_state.default_attributes.size() ||
|
||||
@@ -187,21 +181,12 @@ void Recorder::MemoryAccessed(const u8* data, u32 size, u32 physical_address) {
|
||||
stream.push_back(element);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void Recorder::RegisterWritten(u32 physical_address, T value) {
|
||||
void Recorder::RegisterWritten(u32 physical_address, u32 value) {
|
||||
StreamElement element = {{RegisterWrite}};
|
||||
element.data.register_write.size = (sizeof(T) == 1) ? CTRegisterWrite::SIZE_8
|
||||
: (sizeof(T) == 2) ? CTRegisterWrite::SIZE_16
|
||||
: (sizeof(T) == 4) ? CTRegisterWrite::SIZE_32
|
||||
: CTRegisterWrite::SIZE_64;
|
||||
element.data.register_write.physical_address = physical_address;
|
||||
element.data.register_write.value = value;
|
||||
|
||||
stream.push_back(element);
|
||||
}
|
||||
|
||||
template void Recorder::RegisterWritten(u32, u8);
|
||||
template void Recorder::RegisterWritten(u32, u16);
|
||||
template void Recorder::RegisterWritten(u32, u32);
|
||||
template void Recorder::RegisterWritten(u32, u64);
|
||||
} // namespace CiTrace
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
@@ -17,7 +16,6 @@ namespace CiTrace {
|
||||
class Recorder {
|
||||
public:
|
||||
struct InitialState {
|
||||
std::vector<u32> gpu_registers;
|
||||
std::vector<u32> lcd_registers;
|
||||
std::vector<u32> pica_registers;
|
||||
std::vector<u32> default_attributes;
|
||||
@@ -52,8 +50,7 @@ public:
|
||||
* Record a register write.
|
||||
* @note Use this whenever a GPU-related MMIO register has been written to.
|
||||
*/
|
||||
template <typename T>
|
||||
void RegisterWritten(u32 physical_address, T value);
|
||||
void RegisterWritten(u32 physical_address, u32 value);
|
||||
|
||||
private:
|
||||
// Initial state of recording start
|
||||
|
||||
Reference in New Issue
Block a user