|
|
@ -6,6 +6,7 @@ |
|
|
|
|
|
|
|
|
#include <array>
|
|
|
#include <array>
|
|
|
#include <bitset>
|
|
|
#include <bitset>
|
|
|
|
|
|
#include <chrono>
|
|
|
#include <cstdlib>
|
|
|
#include <cstdlib>
|
|
|
#include <memory>
|
|
|
#include <memory>
|
|
|
#include <string>
|
|
|
#include <string>
|
|
|
@ -17,7 +18,6 @@ |
|
|
namespace { |
|
|
namespace { |
|
|
// Numbers are chosen randomly to make sure the correct one is given.
|
|
|
// Numbers are chosen randomly to make sure the correct one is given.
|
|
|
constexpr std::array<u64, 5> CB_IDS{{42, 144, 93, 1026, UINT64_C(0xFFFF7FFFF7FFFF)}}; |
|
|
constexpr std::array<u64, 5> CB_IDS{{42, 144, 93, 1026, UINT64_C(0xFFFF7FFFF7FFFF)}}; |
|
|
constexpr int MAX_SLICE_LENGTH = 10000; // Copied from CoreTiming internals
|
|
|
|
|
|
constexpr std::array<u64, 5> calls_order{{2, 0, 1, 4, 3}}; |
|
|
constexpr std::array<u64, 5> calls_order{{2, 0, 1, 4, 3}}; |
|
|
std::array<s64, 5> delays{}; |
|
|
std::array<s64, 5> delays{}; |
|
|
|
|
|
|
|
|
@ -25,12 +25,12 @@ std::bitset<CB_IDS.size()> callbacks_ran_flags; |
|
|
u64 expected_callback = 0; |
|
|
u64 expected_callback = 0; |
|
|
|
|
|
|
|
|
template <unsigned int IDX> |
|
|
template <unsigned int IDX> |
|
|
void HostCallbackTemplate(u64 userdata, s64 nanoseconds_late) { |
|
|
|
|
|
|
|
|
void HostCallbackTemplate(u64 userdata, std::chrono::nanoseconds ns_late) { |
|
|
static_assert(IDX < CB_IDS.size(), "IDX out of range"); |
|
|
static_assert(IDX < CB_IDS.size(), "IDX out of range"); |
|
|
callbacks_ran_flags.set(IDX); |
|
|
callbacks_ran_flags.set(IDX); |
|
|
REQUIRE(CB_IDS[IDX] == userdata); |
|
|
REQUIRE(CB_IDS[IDX] == userdata); |
|
|
REQUIRE(CB_IDS[IDX] == CB_IDS[calls_order[expected_callback]]); |
|
|
REQUIRE(CB_IDS[IDX] == CB_IDS[calls_order[expected_callback]]); |
|
|
delays[IDX] = nanoseconds_late; |
|
|
|
|
|
|
|
|
delays[IDX] = ns_late.count(); |
|
|
++expected_callback; |
|
|
++expected_callback; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -77,10 +77,12 @@ TEST_CASE("CoreTiming[BasicOrder]", "[core]") { |
|
|
|
|
|
|
|
|
core_timing.SyncPause(true); |
|
|
core_timing.SyncPause(true); |
|
|
|
|
|
|
|
|
u64 one_micro = 1000U; |
|
|
|
|
|
|
|
|
const u64 one_micro = 1000U; |
|
|
for (std::size_t i = 0; i < events.size(); i++) { |
|
|
for (std::size_t i = 0; i < events.size(); i++) { |
|
|
u64 order = calls_order[i]; |
|
|
|
|
|
core_timing.ScheduleEvent(i * one_micro + 100U, events[order], CB_IDS[order]); |
|
|
|
|
|
|
|
|
const u64 order = calls_order[i]; |
|
|
|
|
|
const auto future_ns = std::chrono::nanoseconds{static_cast<s64>(i * one_micro + 100)}; |
|
|
|
|
|
|
|
|
|
|
|
core_timing.ScheduleEvent(future_ns, events[order], CB_IDS[order]); |
|
|
} |
|
|
} |
|
|
/// test pause
|
|
|
/// test pause
|
|
|
REQUIRE(callbacks_ran_flags.none()); |
|
|
REQUIRE(callbacks_ran_flags.none()); |
|
|
@ -116,13 +118,16 @@ TEST_CASE("CoreTiming[BasicOrderNoPausing]", "[core]") { |
|
|
|
|
|
|
|
|
expected_callback = 0; |
|
|
expected_callback = 0; |
|
|
|
|
|
|
|
|
u64 start = core_timing.GetGlobalTimeNs().count(); |
|
|
|
|
|
u64 one_micro = 1000U; |
|
|
|
|
|
|
|
|
const u64 start = core_timing.GetGlobalTimeNs().count(); |
|
|
|
|
|
const u64 one_micro = 1000U; |
|
|
|
|
|
|
|
|
for (std::size_t i = 0; i < events.size(); i++) { |
|
|
for (std::size_t i = 0; i < events.size(); i++) { |
|
|
u64 order = calls_order[i]; |
|
|
|
|
|
core_timing.ScheduleEvent(i * one_micro + 100U, events[order], CB_IDS[order]); |
|
|
|
|
|
|
|
|
const u64 order = calls_order[i]; |
|
|
|
|
|
const auto future_ns = std::chrono::nanoseconds{static_cast<s64>(i * one_micro + 100)}; |
|
|
|
|
|
core_timing.ScheduleEvent(future_ns, events[order], CB_IDS[order]); |
|
|
} |
|
|
} |
|
|
u64 end = core_timing.GetGlobalTimeNs().count(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const u64 end = core_timing.GetGlobalTimeNs().count(); |
|
|
const double scheduling_time = static_cast<double>(end - start); |
|
|
const double scheduling_time = static_cast<double>(end - start); |
|
|
const double timer_time = static_cast<double>(TestTimerSpeed(core_timing)); |
|
|
const double timer_time = static_cast<double>(TestTimerSpeed(core_timing)); |
|
|
|
|
|
|
|
|
|