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