throw in percent logging for MakeTreePortals

when node_t converts to leaf, destroy anything on it by re-initializing it
This commit is contained in:
Jonathan 2022-08-09 20:33:49 -04:00
parent d6411cef01
commit 44eff2d7b1
5 changed files with 29 additions and 10 deletions

View File

@ -133,7 +133,12 @@ void percent(uint64_t count, uint64_t max, bool displayElapsed)
percent_clock::~percent_clock()
{
if (count != max - 1) {
print("ERROR TO FIX LATER: clock counter ended too early\n");
}
count = max - 1;
increase();
Q_assert(count == max);
//Q_assert(count == max);
}
}; // namespace logging

View File

@ -72,7 +72,7 @@ twosided<std::list<std::unique_ptr<buildportal_t>>> SplitNodePortals(const node_
enum class portaltype_t {
TREE, VIS
};
std::list<std::unique_ptr<buildportal_t>> MakeTreePortals_r(tree_t *tree, node_t *node, portaltype_t type, std::list<std::unique_ptr<buildportal_t>> boundary_portals, portalstats_t &stats);
std::list<std::unique_ptr<buildportal_t>> MakeTreePortals_r(tree_t *tree, node_t *node, portaltype_t type, std::list<std::unique_ptr<buildportal_t>> boundary_portals, portalstats_t &stats, logging::percent_clock &clock);
void MakeTreePortals(tree_t *tree);
std::list<std::unique_ptr<buildportal_t>> MakeHeadnodePortals(tree_t *tree);
void MakePortalsFromBuildportals(tree_t *tree, std::list<std::unique_ptr<buildportal_t>> buildportals);

View File

@ -465,8 +465,10 @@ MakeTreePortals_r
Given the list of portals bounding `node`, returns the portal list for a fully-portalized `node`.
==================
*/
std::list<std::unique_ptr<buildportal_t>> MakeTreePortals_r(tree_t *tree, node_t *node, portaltype_t type, std::list<std::unique_ptr<buildportal_t>> boundary_portals, portalstats_t &stats)
std::list<std::unique_ptr<buildportal_t>> MakeTreePortals_r(tree_t *tree, node_t *node, portaltype_t type, std::list<std::unique_ptr<buildportal_t>> boundary_portals, portalstats_t &stats, logging::percent_clock &clock)
{
clock.increase();
if (node->is_leaf || (type == portaltype_t::VIS && node->detail_separator)) {
return boundary_portals;
}
@ -482,8 +484,8 @@ std::list<std::unique_ptr<buildportal_t>> MakeTreePortals_r(tree_t *tree, node_t
std::list<std::unique_ptr<buildportal_t>> result_portals_front, result_portals_back;
tbb::task_group g;
g.run([&]() { result_portals_front = MakeTreePortals_r(tree, node->children[0], type, std::move(boundary_portals_split.front), stats); });
g.run([&]() { result_portals_back = MakeTreePortals_r(tree, node->children[1], type, std::move(boundary_portals_split.back), stats); });
g.run([&]() { result_portals_front = MakeTreePortals_r(tree, node->children[0], type, std::move(boundary_portals_split.front), stats, clock); });
g.run([&]() { result_portals_back = MakeTreePortals_r(tree, node->children[1], type, std::move(boundary_portals_split.back), stats, clock); });
g.wait();
// sequential part: push the nodeportal down each side of the bsp so it connects leafs
@ -525,9 +527,14 @@ void MakeTreePortals(tree_t *tree)
auto headnodeportals = MakeHeadnodePortals(tree);
auto buildportals = MakeTreePortals_r(tree, tree->headnode, portaltype_t::TREE, std::move(headnodeportals), stats);
{
logging::percent_clock clock;
clock.max = tree->nodes.size() + 1;
auto buildportals = MakeTreePortals_r(tree, tree->headnode, portaltype_t::TREE, std::move(headnodeportals), stats, clock);
MakePortalsFromBuildportals(tree, std::move(buildportals));
}
logging::header("CalcTreeBounds");

View File

@ -267,10 +267,16 @@ void WritePortalFile(tree_t *tree)
portalstats_t stats{};
{
// FIXME: iteration count isn't tree->nodes.size() here
logging::percent_clock clock;
clock.max = tree->nodes.size() + 1;
// vis portal generation doesn't use headnode portals
auto buildportals = MakeTreePortals_r(tree, tree->headnode, portaltype_t::VIS, {}, stats);
auto buildportals = MakeTreePortals_r(tree, tree->headnode, portaltype_t::VIS, {}, stats, clock);
MakePortalsFromBuildportals(tree, std::move(buildportals));
}
/* save portal file for vis tracing */
WritePortalfile(tree->headnode, &state);

View File

@ -100,6 +100,7 @@ static void ConvertNodeToLeaf(node_t *node, const contentflags_t &contents)
node->is_leaf = true;
for (auto &child : node->children) {
*child = {}; // clear everything in the node
child = nullptr;
}