|
|
@ -209,16 +209,31 @@ void GPU::CallMethod(const MethodCall& method_call) { |
|
|
|
|
|
|
|
|
ASSERT(method_call.subchannel < bound_engines.size()); |
|
|
ASSERT(method_call.subchannel < bound_engines.size()); |
|
|
|
|
|
|
|
|
if (ExecuteMethodOnEngine(method_call)) { |
|
|
|
|
|
|
|
|
if (ExecuteMethodOnEngine(method_call.method)) { |
|
|
CallEngineMethod(method_call); |
|
|
CallEngineMethod(method_call); |
|
|
} else { |
|
|
} else { |
|
|
CallPullerMethod(method_call); |
|
|
CallPullerMethod(method_call); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool GPU::ExecuteMethodOnEngine(const MethodCall& method_call) { |
|
|
|
|
|
const auto method = static_cast<BufferMethods>(method_call.method); |
|
|
|
|
|
return method >= BufferMethods::NonPullerMethods; |
|
|
|
|
|
|
|
|
void GPU::CallMultiMethod(u32 method, u32 subchannel, const u32* base_start, u32 amount, u32 methods_pending) { |
|
|
|
|
|
LOG_TRACE(HW_GPU, "Processing method {:08X} on subchannel {}", method, |
|
|
|
|
|
subchannel); |
|
|
|
|
|
|
|
|
|
|
|
ASSERT(subchannel < bound_engines.size()); |
|
|
|
|
|
|
|
|
|
|
|
if (ExecuteMethodOnEngine(method)) { |
|
|
|
|
|
CallEngineMultiMethod(method, subchannel, base_start, amount, methods_pending); |
|
|
|
|
|
} else { |
|
|
|
|
|
for (std::size_t i = 0; i < amount; i++) { |
|
|
|
|
|
CallPullerMethod({method, base_start[i], subchannel, methods_pending - static_cast<u32>(i)}); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool GPU::ExecuteMethodOnEngine(u32 method) { |
|
|
|
|
|
const auto buffer_method = static_cast<BufferMethods>(method); |
|
|
|
|
|
return buffer_method >= BufferMethods::NonPullerMethods; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void GPU::CallPullerMethod(const MethodCall& method_call) { |
|
|
void GPU::CallPullerMethod(const MethodCall& method_call) { |
|
|
@ -298,6 +313,30 @@ void GPU::CallEngineMethod(const MethodCall& method_call) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void GPU::CallEngineMultiMethod(u32 method, u32 subchannel, const u32* base_start, u32 amount, u32 methods_pending) { |
|
|
|
|
|
const EngineID engine = bound_engines[subchannel]; |
|
|
|
|
|
|
|
|
|
|
|
switch (engine) { |
|
|
|
|
|
case EngineID::FERMI_TWOD_A: |
|
|
|
|
|
fermi_2d->CallMultiMethod(method, base_start, amount, methods_pending); |
|
|
|
|
|
break; |
|
|
|
|
|
case EngineID::MAXWELL_B: |
|
|
|
|
|
maxwell_3d->CallMultiMethod(method, base_start, amount, methods_pending); |
|
|
|
|
|
break; |
|
|
|
|
|
case EngineID::KEPLER_COMPUTE_B: |
|
|
|
|
|
kepler_compute->CallMultiMethod(method, base_start, amount, methods_pending); |
|
|
|
|
|
break; |
|
|
|
|
|
case EngineID::MAXWELL_DMA_COPY_A: |
|
|
|
|
|
maxwell_dma->CallMultiMethod(method, base_start, amount, methods_pending); |
|
|
|
|
|
break; |
|
|
|
|
|
case EngineID::KEPLER_INLINE_TO_MEMORY_B: |
|
|
|
|
|
kepler_memory->CallMultiMethod(method, base_start, amount, methods_pending); |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
UNIMPLEMENTED_MSG("Unimplemented engine"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void GPU::ProcessBindMethod(const MethodCall& method_call) { |
|
|
void GPU::ProcessBindMethod(const MethodCall& method_call) { |
|
|
// Bind the current subchannel to the desired engine id.
|
|
|
// Bind the current subchannel to the desired engine id.
|
|
|
LOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", method_call.subchannel, |
|
|
LOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", method_call.subchannel, |
|
|
|