#include "render_3D/detail/Render_Domain.h" #include #include #include namespace renderive::render_3d::detail { namespace { static_assert(noexcept(std::declval().post(std::declval()))); TEST(RenderDomain, SharesDomainPerGpuIndex) { auto first = Render_Domain::acquire(0x7ffffffcU); auto second = Render_Domain::acquire(0x7ffffffcU); auto other = Render_Domain::acquire(0x7ffffffbU); EXPECT_EQ(first, second); EXPECT_NE(first, other); } TEST(RenderDomain, PreparedTaskRunsAfterNoThrowHandoff) { auto domain = Render_Domain::acquire(0x7ffffffaU); std::atomic executed{}; auto task = domain->prepare([&] { executed.store(true, std::memory_order_release); }); domain->post(std::move(task)); domain->invoke([] {}); EXPECT_TRUE(executed.load(std::memory_order_acquire)); } TEST(RenderDomain, AbandonedPreparedTasksReleaseReservedCapacity) { auto domain = Render_Domain::acquire(0x7ffffff9U); for (std::size_t index = 0; index < 128; ++index) { auto task = domain->prepare([] {}); } domain->invoke([] {}); } TEST(RenderDomain, NestedInvokeExecutesInlineOnTheAffinityThread) { auto domain = Render_Domain::acquire(0x7ffffff8U); const int value = domain->invoke([domain] { return domain->invoke([] { return 42; }); }); EXPECT_EQ(value, 42); } TEST(RenderDomain, ReportsBoundedAdmissionStatistics) { auto domain = Render_Domain::acquire(0x7ffffff7U); const auto statistics = domain->statistics(); EXPECT_EQ(statistics.capacity, 64U); EXPECT_TRUE(statistics.admitted <= statistics.capacity); EXPECT_TRUE(statistics.queued <= statistics.capacity); } } }