video_core: gpu: Implement WaitFence and IncrementSyncPoint.
This commit is contained in:
		@@ -194,30 +194,6 @@ void GPU::SyncGuestHost() {
 | 
			
		||||
void GPU::OnCommandListEnd() {
 | 
			
		||||
    renderer->Rasterizer().ReleaseFences();
 | 
			
		||||
}
 | 
			
		||||
// Note that, traditionally, methods are treated as 4-byte addressable locations, and hence
 | 
			
		||||
// their numbers are written down multiplied by 4 in Docs. Here we are not multiply by 4.
 | 
			
		||||
// So the values you see in docs might be multiplied by 4.
 | 
			
		||||
enum class BufferMethods {
 | 
			
		||||
    BindObject = 0x0,
 | 
			
		||||
    Nop = 0x2,
 | 
			
		||||
    SemaphoreAddressHigh = 0x4,
 | 
			
		||||
    SemaphoreAddressLow = 0x5,
 | 
			
		||||
    SemaphoreSequence = 0x6,
 | 
			
		||||
    SemaphoreTrigger = 0x7,
 | 
			
		||||
    NotifyIntr = 0x8,
 | 
			
		||||
    WrcacheFlush = 0x9,
 | 
			
		||||
    Unk28 = 0xA,
 | 
			
		||||
    UnkCacheFlush = 0xB,
 | 
			
		||||
    RefCnt = 0x14,
 | 
			
		||||
    SemaphoreAcquire = 0x1A,
 | 
			
		||||
    SemaphoreRelease = 0x1B,
 | 
			
		||||
    FenceValue = 0x1C,
 | 
			
		||||
    FenceAction = 0x1D,
 | 
			
		||||
    Unk78 = 0x1E,
 | 
			
		||||
    Unk7c = 0x1F,
 | 
			
		||||
    Yield = 0x20,
 | 
			
		||||
    NonPullerMethods = 0x40,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum class GpuSemaphoreOperation {
 | 
			
		||||
    AcquireEqual = 0x1,
 | 
			
		||||
@@ -277,7 +253,12 @@ void GPU::CallPullerMethod(const MethodCall& method_call) {
 | 
			
		||||
    case BufferMethods::UnkCacheFlush:
 | 
			
		||||
    case BufferMethods::WrcacheFlush:
 | 
			
		||||
    case BufferMethods::FenceValue:
 | 
			
		||||
        break;
 | 
			
		||||
    case BufferMethods::FenceAction:
 | 
			
		||||
        ProcessFenceActionMethod();
 | 
			
		||||
        break;
 | 
			
		||||
    case BufferMethods::WaitForInterrupt:
 | 
			
		||||
        ProcessWaitForInterruptMethod();
 | 
			
		||||
        break;
 | 
			
		||||
    case BufferMethods::SemaphoreTrigger: {
 | 
			
		||||
        ProcessSemaphoreTriggerMethod();
 | 
			
		||||
@@ -391,6 +372,25 @@ void GPU::ProcessBindMethod(const MethodCall& method_call) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GPU::ProcessFenceActionMethod() {
 | 
			
		||||
    switch (regs.fence_action.op) {
 | 
			
		||||
    case FenceOperation::Acquire:
 | 
			
		||||
        WaitFence(regs.fence_action.syncpoint_id, regs.fence_value);
 | 
			
		||||
        break;
 | 
			
		||||
    case FenceOperation::Increment:
 | 
			
		||||
        IncrementSyncPoint(regs.fence_action.syncpoint_id);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        UNIMPLEMENTED_MSG("Unimplemented operation {}",
 | 
			
		||||
                          static_cast<u32>(regs.fence_action.op.Value()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GPU::ProcessWaitForInterruptMethod() {
 | 
			
		||||
    // TODO(bunnei) ImplementMe
 | 
			
		||||
    LOG_WARNING(HW_GPU, "(STUBBED) called");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GPU::ProcessSemaphoreTriggerMethod() {
 | 
			
		||||
    const auto semaphoreOperationMask = 0xF;
 | 
			
		||||
    const auto op =
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user