Toast Engine
Toggle main menu visibility
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
19
namespace
voxel {
20
21
inline
constexpr
size_t
k_brick_material_bytes =
static_cast<
size_t
>
(k_brick_voxel_count);
22
23
inline
constexpr
uint32_t k_invalid_brick = k_brick_payload_mask;
24
26
class
TOAST_API BrickPool {
27
public
:
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
69
private
:
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
85
static_assert
(std::endian::native == std::endian::little,
"the brick material layer assumes a little-endian host"
);
86
87
}
brick.hpp
assets::BrickPool::allocate
auto allocate() -> uint32_t
Definition
brick_pool.cpp:41
assets::BrickPool::free
void free(uint32_t id)
The id must come from allocate and not already be freed.
Definition
brick_pool.cpp:66
export.hpp
voxel_constants.hpp
engine
src
toast
voxel
brick_pool.hpp
Generated by
1.17.0