// Copyright 2016 Dolphin Emulator Project / 2017 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #include #include #include #include #include "common/file_util.h" #include "core/core.h" #include "core/core_timing.h" // Numbers are chosen randomly to make sure the correct one is given. static constexpr std::array CB_IDS{{42, 144, 93, 1026, UINT64_C(0xFFFF7FFFF7FFFF)}}; static constexpr int MAX_SLICE_LENGTH = 20000; // Copied from CoreTiming internals static std::bitset callbacks_ran_flags; static u64 expected_callback = 0; static s64 lateness = 0; template void CallbackTemplate(u64 userdata, s64 cycles_late) { static_assert(IDX < CB_IDS.size(), "IDX out of range"); callbacks_ran_flags.set(IDX); REQUIRE(CB_IDS[IDX] == userdata); REQUIRE(CB_IDS[IDX] == expected_callback); REQUIRE(lateness == cycles_late); } struct ScopeInit final { ScopeInit() { core_timing.Initialize(); } ~ScopeInit() { core_timing.Shutdown(); } Core::Timing::CoreTiming core_timing; }; static void AdvanceAndCheck(Core::Timing::CoreTiming& core_timing, u32 idx, int downcount, int expected_lateness = 0, int cpu_downcount = 0) { callbacks_ran_flags = 0; expected_callback = CB_IDS[idx]; lateness = expected_lateness; // Pretend we executed X cycles of instructions. core_timing.AddTicks(core_timing.GetDowncount() - cpu_downcount); core_timing.Advance(); REQUIRE(decltype(callbacks_ran_flags)().set(idx) == callbacks_ran_flags); REQUIRE(downcount == core_timing.GetDowncount()); }