mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 23:02:47 +01:00
Merge pull request #2824 from ReinUsesLisp/mme
Revert "Revert #2466" and stub FirmwareCall 4
This commit is contained in:
commit
b8b1747704
3 changed files with 20 additions and 4 deletions
|
@ -329,6 +329,10 @@ void Maxwell3D::CallMethod(const GPU::MethodCall& method_call) {
|
||||||
ProcessMacroBind(method_call.argument);
|
ProcessMacroBind(method_call.argument);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MAXWELL3D_REG_INDEX(firmware[4]): {
|
||||||
|
ProcessFirmwareCall4();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]):
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]):
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]):
|
||||||
|
@ -419,6 +423,14 @@ void Maxwell3D::ProcessMacroBind(u32 data) {
|
||||||
macro_positions[regs.macros.entry++] = data;
|
macro_positions[regs.macros.entry++] = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Maxwell3D::ProcessFirmwareCall4() {
|
||||||
|
LOG_WARNING(HW_GPU, "(STUBBED) called");
|
||||||
|
|
||||||
|
// Firmware call 4 is a blob that changes some registers depending on its parameters.
|
||||||
|
// These registers don't affect emulation and so are stubbed by setting 0xd00 to 1.
|
||||||
|
regs.reg_array[0xd00] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void Maxwell3D::ProcessQueryGet() {
|
void Maxwell3D::ProcessQueryGet() {
|
||||||
const GPUVAddr sequence_address{regs.query.QueryAddress()};
|
const GPUVAddr sequence_address{regs.query.QueryAddress()};
|
||||||
// Since the sequence address is given as a GPU VAddr, we have to convert it to an application
|
// Since the sequence address is given as a GPU VAddr, we have to convert it to an application
|
||||||
|
|
|
@ -1089,7 +1089,9 @@ public:
|
||||||
INSERT_PADDING_WORDS(14);
|
INSERT_PADDING_WORDS(14);
|
||||||
} shader_config[MaxShaderProgram];
|
} shader_config[MaxShaderProgram];
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x80);
|
INSERT_PADDING_WORDS(0x60);
|
||||||
|
|
||||||
|
u32 firmware[0x20];
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u32 cb_size;
|
u32 cb_size;
|
||||||
|
@ -1319,6 +1321,9 @@ private:
|
||||||
/// Handles writes to the macro bind register.
|
/// Handles writes to the macro bind register.
|
||||||
void ProcessMacroBind(u32 data);
|
void ProcessMacroBind(u32 data);
|
||||||
|
|
||||||
|
/// Handles firmware blob 4
|
||||||
|
void ProcessFirmwareCall4();
|
||||||
|
|
||||||
/// Handles a write to the CLEAR_BUFFERS register.
|
/// Handles a write to the CLEAR_BUFFERS register.
|
||||||
void ProcessClearBuffers();
|
void ProcessClearBuffers();
|
||||||
|
|
||||||
|
@ -1431,6 +1436,7 @@ ASSERT_REG_POSITION(vertex_array[0], 0x700);
|
||||||
ASSERT_REG_POSITION(independent_blend, 0x780);
|
ASSERT_REG_POSITION(independent_blend, 0x780);
|
||||||
ASSERT_REG_POSITION(vertex_array_limit[0], 0x7C0);
|
ASSERT_REG_POSITION(vertex_array_limit[0], 0x7C0);
|
||||||
ASSERT_REG_POSITION(shader_config[0], 0x800);
|
ASSERT_REG_POSITION(shader_config[0], 0x800);
|
||||||
|
ASSERT_REG_POSITION(firmware, 0x8C0);
|
||||||
ASSERT_REG_POSITION(const_buffer, 0x8E0);
|
ASSERT_REG_POSITION(const_buffer, 0x8E0);
|
||||||
ASSERT_REG_POSITION(cb_bind[0], 0x904);
|
ASSERT_REG_POSITION(cb_bind[0], 0x904);
|
||||||
ASSERT_REG_POSITION(tex_cb_index, 0x982);
|
ASSERT_REG_POSITION(tex_cb_index, 0x982);
|
||||||
|
|
|
@ -131,9 +131,7 @@ bool MacroInterpreter::Step(u32 offset, bool is_delay_slot) {
|
||||||
|
|
||||||
// An instruction with the Exit flag will not actually
|
// An instruction with the Exit flag will not actually
|
||||||
// cause an exit if it's executed inside a delay slot.
|
// cause an exit if it's executed inside a delay slot.
|
||||||
// TODO(Blinkhawk): Reversed to always exit. The behavior explained above requires further
|
if (opcode.is_exit && !is_delay_slot) {
|
||||||
// testing on the MME code.
|
|
||||||
if (opcode.is_exit) {
|
|
||||||
// Exit has a delay slot, execute the next instruction
|
// Exit has a delay slot, execute the next instruction
|
||||||
Step(offset, true);
|
Step(offset, true);
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue