Toast Engine
Loading...
Searching...
No Matches
brick_pool.hpp
Go to the documentation of this file.
1
6
7#pragma once
8#include "brick.hpp"
9#include "voxel_constants.hpp"
10
11#include <atomic>
12#include <bit>
13#include <cstdint>
14#include <memory>
15#include <span>
16#include <toast/export.hpp>
17#include <vector>
18
19namespace voxel {
20
21inline constexpr size_t k_brick_material_bytes = static_cast<size_t>(k_brick_voxel_count);
22
23inline constexpr uint32_t k_invalid_brick = k_brick_payload_mask;
24
26class TOAST_API BrickPool {
27public:
28 explicit BrickPool(uint32_t capacity);
29
31 [[nodiscard]]
32 auto allocate() -> uint32_t;
33
35 void free(uint32_t id);
36
37 [[nodiscard]]
38 auto material(uint32_t id) -> std::span<uint8_t, k_brick_material_bytes>;
39
40 [[nodiscard]]
41 auto material(uint32_t id) const -> std::span<const uint8_t, k_brick_material_bytes>;
42
43 [[nodiscard]]
44 auto occupancy(uint32_t id) -> BrickOccupancy&;
45
46 [[nodiscard]]
47 auto occupancy(uint32_t id) const -> const BrickOccupancy&;
48
49 [[nodiscard]]
50 auto capacity() const noexcept -> uint32_t {
51 return m_capacity;
52 }
53
54 [[nodiscard]]
55 auto allocatedCount() const noexcept -> uint32_t {
56 return m_allocated.load(std::memory_order_relaxed);
57 }
58
59 [[nodiscard]]
60 auto freeCount() const noexcept -> uint32_t {
61 return m_capacity - allocatedCount();
62 }
63
64 [[nodiscard]]
65 auto isValid(uint32_t id) const noexcept -> bool {
66 return id < m_next_unused.load(std::memory_order_acquire);
67 }
68
69private:
70 void clearBrick(uint32_t id);
71
72 uint32_t m_capacity = 0;
73
74 std::atomic<uint32_t> m_next_unused {0};
75
76 std::atomic<uint32_t> m_allocated {0};
77
78 std::atomic<uint64_t> m_free_head;
79 std::unique_ptr<std::atomic<uint32_t>[]> m_next_free; // NOLINT(modernize-avoid-c-arrays)
80 std::unique_ptr<std::atomic<bool>[]> m_is_free; // NOLINT(modernize-avoid-c-arrays)
81 std::unique_ptr<uint8_t[]> m_material; // NOLINT(modernize-avoid-c-arrays)
82 std::vector<BrickOccupancy> m_occupancy;
83};
84
85static_assert(std::endian::native == std::endian::little, "the brick material layer assumes a little-endian host");
86
87}
auto allocate() -> uint32_t
Definition brick_pool.cpp:41
void free(uint32_t id)
The id must come from allocate and not already be freed.
Definition brick_pool.cpp:66