skyline/app/src/main/cpp/skyline/soc/host1x/classes/host1x.cpp

43 lines
1.6 KiB
C++

// SPDX-License-Identifier: MPL-2.0
// Copyright © 2021 Skyline Team and Contributors (https://github.com/skyline-emu/)
#include <common.h>
#include "class.h"
#include "host1x.h"
namespace skyline::soc::host1x {
Host1xClass::Host1xClass(const DeviceState &state, SyncpointSet &syncpoints) : state(state), syncpoints(syncpoints) {}
void Host1xClass::CallMethod(u32 method, u32 argument) {
constexpr static u32 LoadSyncpointPayload32MethodId{0x4E}; //!< See '14.3.2.12 32-Bit Sync Point Comparison Methods' in TRM
constexpr static u32 WaitSyncpoint32MethodId{0x50}; //!< As above
switch (method) {
case IncrementSyncpointMethodId: {
IncrementSyncpointMethod incrSyncpoint{.raw = argument};
// incrSyncpoint.condition doesn't matter for Host1x class increments
state.logger->Debug("Increment syncpoint: {}", incrSyncpoint.index);
syncpoints.at(incrSyncpoint.index).Increment();
break;
}
case LoadSyncpointPayload32MethodId:
syncpointPayload = argument;
break;
case WaitSyncpoint32MethodId: {
u32 syncpointId{static_cast<u8>(argument)};
state.logger->Debug("Wait syncpoint: {}, thresh: {}", syncpointId, syncpointPayload);
syncpoints.at(syncpointId).Wait(syncpointPayload, std::chrono::steady_clock::duration::max());
break;
}
default:
state.logger->Error("Unknown host1x class method called: 0x{:X}", method);
break;
}
}
}