29 struct KarrasTreeTraverser;
32 struct KarrasTreeTraverserHost;
35 struct KarrasTreeTraverserAccessed;
42 const u8 *lchild_flag;
43 const u8 *rchild_flag;
53 return lchild_id[id] + offset_leaf *
u32(lchild_flag[
id]);
63 return rchild_id[id] + offset_leaf *
u32(rchild_flag[
id]);
70 template<u32 tree_depth,
class Functor1,
class Functor2,
class Functor3>
73 Functor1 &&traverse_condition,
74 Functor2 &&on_found_leaf,
75 Functor3 &&on_excluded_node)
const {
77 static constexpr u32 _nindex = 4294967295;
80 std::array<u32, tree_depth> id_stack;
82 u32 stack_cursor = tree_depth - 1;
83 id_stack[stack_cursor] = root_node;
86 while (stack_cursor < tree_depth) {
89 u32 current_node_id = id_stack[stack_cursor];
90 id_stack[stack_cursor] = _nindex;
94 bool cur_id_valid = traverse_condition(current_node_id);
100 on_found_leaf(current_node_id);
107 id_stack[stack_cursor - 1] = rid;
110 id_stack[stack_cursor - 1] = lid;
115 on_excluded_node(current_node_id);
121 template<u32 tree_depth,
class Functor1,
class Functor2,
class Functor3>
123 Functor1 &&traverse_condition,
124 Functor2 &&on_found_leaf,
125 Functor3 &&on_excluded_node)
const {
130 stack_based_traversal<tree_depth>(
132 std::forward<Functor1>(traverse_condition),
133 std::forward<Functor2>(on_found_leaf),
134 std::forward<Functor3>(on_excluded_node));
std::uint8_t u8
8 bit unsigned integer
std::uint32_t u32
32 bit unsigned integer
A buffer allocated in USM (Unified Shared Memory)
void complete_event_state(sycl::event e) const
Complete the event state of the buffer.
const T * get_read_access(sham::EventList &depends_list, SourceLocation src_loc=SourceLocation{}) const
Get a read-only pointer to the buffer's data.
Class to manage a list of SYCL events.
void stack_based_traversal(u32 root_node, Functor1 &&traverse_condition, Functor2 &&on_found_leaf, Functor3 &&on_excluded_node) const
stack based tree traversal
bool is_id_leaf(u32 id) const
is the given id a leaf (Note that if there is no internal cell every node is a leaf)
void stack_based_traversal(Functor1 &&traverse_condition, Functor2 &&on_found_leaf, Functor3 &&on_excluded_node) const
stack based tree traversal
u32 get_left_child(u32 id) const
Retrieves the left child node identifier for a given node ID.
u32 get_right_child(u32 id) const
Retrieves the right child node identifier for a given node ID.
std::vector< u32 > buf_rchild_id
ref to right child id buffer
std::vector< u32 > buf_lchild_id
ref to left child id buffer
u32 offset_leaf
how many internal nodes before the first leaf ?
std::vector< u8 > buf_lchild_flag
ref to left child flag buffer
KarrasTreeTraverserAccessed get_read_access() const
get read only accessor
std::vector< u8 > buf_rchild_flag
ref to right child flag buffer
Utility struct to traverse a Karras Radix Tree.
bool is_root_leaf() const
is the root a leaf ?
const sham::DeviceBuffer< u8 > & buf_lchild_flag
ref to left child flag buffer
u32 offset_leaf
how many internal nodes before the first leaf ?
const sham::DeviceBuffer< u8 > & buf_rchild_flag
ref to right child flag buffer
KarrasTreeTraverserAccessed get_read_access(sham::EventList &deps) const
get read only accessor
const sham::DeviceBuffer< u32 > & buf_rchild_id
ref to right child id buffer
void complete_event_state(sycl::event e) const
complete the buffer states with the resulting event
const sham::DeviceBuffer< u32 > & buf_lchild_id
ref to left child id buffer