|
|
|
@ -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 = |
|
|
|
|