From 7cb6c6553b06b1b88aa8d70556f7ff8a730c05b3 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Fri, 3 Nov 2023 21:27:29 -0600 Subject: [PATCH] tests: add ClipStackWinding benchmark, qvec benchmark --- tests/benchmark.cc | 76 ++++++++++++++++++++++++++++++++++++++++++++++ tests/test_vis.cc | 22 ++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/tests/benchmark.cc b/tests/benchmark.cc index 088c82a2..c6d31032 100644 --- a/tests/benchmark.cc +++ b/tests/benchmark.cc @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -78,3 +79,78 @@ TEST_CASE("SplitFace" * doctest::test_suite("benchmark")) // run with doctest assertions, to validate that they actually work test_polylib(true); } + +TEST_CASE("vis windings") +{ + ankerl::nanobench::Bench b; + b.run("create pstack_t", [&]() { + pstack_t stack{}; + ankerl::nanobench::doNotOptimizeAway(stack); + }); + + b.run("create pstack_t + 1x AllocStackWinding", [&]() { + pstack_t stack{}; + + auto *w1 = AllocStackWinding(stack); + ankerl::nanobench::doNotOptimizeAway(*w1); + + FreeStackWinding(w1, stack); + + ankerl::nanobench::doNotOptimizeAway(stack); + }); + + b.run("create pstack_t + 2x AllocStackWinding", [&]() { + pstack_t stack{}; + + auto *w1 = AllocStackWinding(stack); + ankerl::nanobench::doNotOptimizeAway(*w1); + + auto *w2 = AllocStackWinding(stack); + ankerl::nanobench::doNotOptimizeAway(*w2); + + FreeStackWinding(w1, stack); + FreeStackWinding(w2, stack); + + ankerl::nanobench::doNotOptimizeAway(stack); + }); + + b.run("setup + ClipStackWinding", [&]() { + pstack_t stack{}; + + auto *w1 = AllocStackWinding(stack); + w1->resize(4); + (*w1)[0] = {0, 0, 0}; + (*w1)[1] = {32, 0, 0}; + (*w1)[2] = {32, 0, -32}; + (*w1)[3] = {0, 0, -32}; + w1->set_winding_sphere(); + + w1 = ClipStackWinding(w1, stack, qplane3d({-1, 0, 0}, -16)); + ankerl::nanobench::doNotOptimizeAway(*w1); + + FreeStackWinding(w1, stack); + ankerl::nanobench::doNotOptimizeAway(stack); + }); +} + +TEST_CASE("vector math") +{ + ankerl::nanobench::Bench b; + ankerl::nanobench::Rng rng; + + qvec3d vec0 {rng.uniform01(), rng.uniform01(), rng.uniform01()}; + qvec3d vec1 {rng.uniform01(), rng.uniform01(), rng.uniform01()}; + + b.run("dot product", [&]() { + vec0[0] = qv::dot(vec0, vec1); + }); + b.run("add", [&]() { + vec0 = vec0 + vec1; + }); + b.run("subtract", [&]() { + vec0 = vec0 - vec1; + }); + + b.doNotOptimizeAway(vec0); + b.doNotOptimizeAway(vec1); +} diff --git a/tests/test_vis.cc b/tests/test_vis.cc index a504b93f..22884d17 100644 --- a/tests/test_vis.cc +++ b/tests/test_vis.cc @@ -2,6 +2,7 @@ #include #include +#include #include "test_qbsp.hh" #include "testutils.hh" @@ -46,3 +47,24 @@ TEST_CASE("q2_detail_leak_test.map" * doctest::may_fail()) CHECK(!leaf_sees(player_start_leaf, item_enviro_leaf)); } } + +TEST_CASE("ClipStackWinding") { + pstack_t stack{}; + + auto *w1 = AllocStackWinding(stack); + w1->resize(4); + (*w1)[0] = {0, 0, 0}; + (*w1)[1] = {32, 0, 0}; + (*w1)[2] = {32, 0, -32}; + (*w1)[3] = {0, 0, -32}; + w1->set_winding_sphere(); + + w1 = ClipStackWinding(w1, stack, qplane3d({-1, 0, 0}, -16)); + CHECK(w1->size() == 4); + CHECK((*w1)[0] == qvec3d(0, 0, 0)); + CHECK((*w1)[1] == qvec3d(16, 0, 0)); + CHECK((*w1)[2] == qvec3d(16, 0, -32)); + CHECK((*w1)[3] == qvec3d(0, 0, -32)); + + FreeStackWinding(w1, stack); +}