DMAPusher: Propagate multimethod writes into the engines.
This commit is contained in:
		@@ -209,16 +209,31 @@ void GPU::CallMethod(const MethodCall& method_call) {
 | 
			
		||||
 | 
			
		||||
    ASSERT(method_call.subchannel < bound_engines.size());
 | 
			
		||||
 | 
			
		||||
    if (ExecuteMethodOnEngine(method_call)) {
 | 
			
		||||
    if (ExecuteMethodOnEngine(method_call.method)) {
 | 
			
		||||
        CallEngineMethod(method_call);
 | 
			
		||||
    } else {
 | 
			
		||||
        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) {
 | 
			
		||||
@@ -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) {
 | 
			
		||||
    // Bind the current subchannel to the desired engine id.
 | 
			
		||||
    LOG_DEBUG(HW_GPU, "Binding subchannel {} to engine {}", method_call.subchannel,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user