Maxwell3D: Process Macros on MultiMethod.

This commit is contained in:
Fernando Sahmkow 2020-04-20 12:27:57 -04:00
parent 3fedcc2f6e
commit 18a88d19dc
1 changed files with 47 additions and 25 deletions

View File

@ -280,34 +280,56 @@ void Maxwell3D::CallMethod(const GPU::MethodCall& method_call) {
} }
} }
void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount, u32 methods_pending) { void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount,
switch (method) { u32 methods_pending) {
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]): // Methods after 0xE00 are special, they're actually triggers for some microcode that was
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]): // uploaded to the GPU during initialization.
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]): if (method >= MacroRegistersStart) {
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[3]): // We're trying to execute a macro
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[4]): if (executing_macro == 0) {
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[5]): // A macro call must begin by writing the macro method's register, not its argument.
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[6]): ASSERT_MSG((method % 2) == 0,
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[7]): "Can't start macro execution by writing to the ARGS register");
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[8]): executing_macro = method;
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[9]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[10]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[11]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[12]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[13]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[14]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[15]): {
ProcessCBMultiData(method, base_start, amount);
break;
} }
default: {
for (std::size_t i = 0; i < amount; i++) { for (std::size_t i = 0; i < amount; i++) {
CallMethod({method, base_start[i], 0, methods_pending - static_cast<u32>(i)}); macro_params.push_back(base_start[i]);
} }
// Call the macro when there are no more parameters in the command buffer
if (amount == methods_pending) {
CallMacroMethod(executing_macro, macro_params.size(), macro_params.data());
macro_params.clear();
}
return;
}
switch (method) {
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[2]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[3]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[4]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[5]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[6]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[7]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[8]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[9]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[10]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[11]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[12]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[13]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[14]):
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[15]): {
ProcessCBMultiData(method, base_start, amount);
break;
}
default: {
for (std::size_t i = 0; i < amount; i++) {
CallMethod({method, base_start[i], 0, methods_pending - static_cast<u32>(i)});
} }
} }
}
} }
void Maxwell3D::StepInstance(const MMEDrawMode expected_mode, const u32 count) { void Maxwell3D::StepInstance(const MMEDrawMode expected_mode, const u32 count) {