Toast Engine
Loading...
Searching...
No Matches
gpu_layout.hpp
Go to the documentation of this file.
1
6
7#pragma once
8#include "brick_pool.hpp"
9#include "palette.hpp"
10#include "voxel_constants.hpp"
11#include "voxel_volume.hpp"
12
13#include <cstddef>
14#include <cstdint>
15#include <glm/glm.hpp>
16#include <span>
17#include <toast/export.hpp>
18#include <vector>
19
20namespace voxel::gpu {
21
22inline constexpr uint32_t k_material_words_per_brick = k_brick_voxel_count / 4;
23
24inline constexpr uint32_t k_occupancy_words_per_brick = 16;
25
26inline constexpr uint32_t k_coarse_bricks = 4;
27
28inline constexpr uint32_t k_palette_words = k_palette_size * 4;
29
30static_assert(k_brick_voxel_count % 4 == 0, "brick material bytes must pack into whole 32-bit words");
31static_assert(sizeof(BrickOccupancy) == 64, "occupancy must be eight 64-bit slices");
32static_assert(sizeof(PaletteEntry) == 16, "a palette entry must be four 32-bit words");
33
36 uint32_t brick_dims_x = 0;
37 uint32_t brick_dims_y = 0;
38 uint32_t brick_dims_z = 0;
39
41 uint32_t grid_offset = 0;
42
43 uint32_t coarse_dims_x = 0;
44 uint32_t coarse_dims_y = 0;
45 uint32_t coarse_dims_z = 0;
46
48 uint32_t coarse_offset = 0;
49
51 uint32_t palette_offset = 0;
52
53 float max_emissive = 1.0f;
54};
55
56static_assert(sizeof(VolumeRecord) == 40, "VolumeRecord is mirrored by voxel_dda.slang member for member");
57static_assert(offsetof(VolumeRecord, grid_offset) == 12);
58static_assert(offsetof(VolumeRecord, coarse_offset) == 28);
59static_assert(offsetof(VolumeRecord, palette_offset) == 32);
60static_assert(offsetof(VolumeRecord, max_emissive) == 36);
61
62struct PackedPool {
64 std::vector<uint32_t> materials;
65
67 std::vector<uint32_t> occupancy;
68};
69
72 const Volume* volume = nullptr;
73 const Palette* palette = nullptr;
74};
75
77 std::vector<VolumeRecord> records;
78
80 std::vector<uint32_t> grids;
81
83 std::vector<uint32_t> coarse;
84
85 std::vector<uint32_t> palettes;
86};
87
90 std::vector<VolumeRecord> records;
91 std::vector<uint32_t> palettes;
92 uint32_t grid_words = 0;
93 uint32_t coarse_words = 0;
94};
95
97struct PatchRun {
98 uint32_t dst = 0;
99 uint32_t count = 0;
100 uint32_t src = 0;
101};
102
104 std::vector<PatchRun> runs;
105
107 std::vector<uint32_t> words;
108};
109
110struct TagDelta {
111 int32_t uniform = 0;
112 int32_t shared = 0;
113 int32_t owned = 0;
114};
115
118 uint32_t pool_slots = 0;
119
121 uint32_t grid_words = 0;
122 uint32_t coarse_words = 0;
123 uint32_t palette_words = 0;
124 uint32_t record_count = 0;
125
126 PatchSection materials;
127 PatchSection occupancy;
128 PatchSection grids;
129 PatchSection coarse;
130 PatchSection palettes;
133
135 std::vector<TagDelta> tags;
136};
137
140 uint32_t volume = 0;
141 std::span<const uint32_t> bricks;
142};
143
144[[nodiscard]]
145constexpr auto gridIndex(glm::uvec3 dims, glm::uvec3 brick) noexcept -> uint32_t {
146 return brick.x + (brick.y * dims.x) + (brick.z * dims.x * dims.y);
147}
148
149[[nodiscard]]
150constexpr auto coarseDims(glm::uvec3 brick_dims) noexcept -> glm::uvec3 {
151 return (brick_dims + (k_coarse_bricks - 1u)) / k_coarse_bricks;
152}
153
155[[nodiscard]]
156TOAST_API auto packPool(const BrickPool& pool) -> PackedPool;
157
160TOAST_API void packOccupancyWords(const BrickOccupancy& occupancy, uint32_t* out);
161
163[[nodiscard]]
164constexpr auto subBrickBit(glm::uvec3 local) noexcept -> uint32_t {
165 return (local.x & 3u) | ((local.y & 3u) << 2u) | ((local.z & 3u) << 4u);
166}
167
169[[nodiscard]]
170constexpr auto subBlockShift(glm::uvec3 local) noexcept -> uint32_t {
171 return (local.x & 2u) | ((local.y & 2u) << 2u) | ((local.z & 2u) << 4u);
172}
173
174inline constexpr uint64_t k_sub_block_mask = 0x0033'0033ull;
175
176[[nodiscard]]
177TOAST_API auto packScene(std::span<const SceneVolume> volumes) -> PackedScene;
178
179[[nodiscard]]
180TOAST_API auto packLayout(std::span<const SceneVolume> volumes) -> SceneLayout;
181
183[[nodiscard]]
184TOAST_API auto layoutMatches(const PackedScene& retained, const SceneLayout& layout) -> bool;
185
189[[nodiscard]]
190TOAST_API auto computePatch(
191 PackedScene& retained, uint32_t retained_pool_slots, const BrickPool& pool, std::span<const SceneVolume> volumes,
192 std::span<const VolumeDirty> dirty, std::span<const uint32_t> appended = {}, uint32_t first_new_palette_word = UINT32_MAX
193) -> ScenePatch;
194
196TOAST_API void applyPatch(PackedPool& pool, PackedScene& scene, const ScenePatch& patch);
197
198[[nodiscard]]
199TOAST_API auto patchWords(const ScenePatch& patch) -> size_t;
200
202[[nodiscard]]
203TOAST_API auto sampleMaterial(const PackedPool& pool, const PackedScene& scene, uint32_t volume, glm::ivec3 voxel) -> uint8_t;
204
205[[nodiscard]]
206TOAST_API auto sampleSolid(const PackedPool& pool, const PackedScene& scene, uint32_t volume, glm::ivec3 voxel) -> bool;
207
209[[nodiscard]]
210TOAST_API auto pooledSubBrick(const PackedPool& pool, uint32_t slot, glm::uvec3 local) -> uint64_t;
211
212[[nodiscard]]
213TOAST_API auto sampleCoarse(const PackedScene& scene, uint32_t volume, glm::ivec3 cell) -> bool;
214
215[[nodiscard]]
216TOAST_API auto samplePaletteEntry(const PackedScene& scene, uint32_t volume, uint8_t index) -> PaletteEntry;
217
218}
Definition brick_pool.hpp:26
Definition voxel_volume.hpp:21
constexpr auto subBrickBit(glm::uvec3 local) noexcept -> uint32_t
Bit of local in its sub-brick.
Definition gpu_layout.hpp:164
constexpr auto subBlockShift(glm::uvec3 local) noexcept -> uint32_t
k_sub_block_mask shifted by this covers the 2x2x2 block holding local
Definition gpu_layout.hpp:170
Entry 0 is the empty voxel and must stay all zero.
Definition palette.hpp:59
Definition gpu_layout.hpp:62
std::vector< uint32_t > occupancy
Eight 4x4x4 sub-bricks per slot in the packOccupancyWords layout.
Definition gpu_layout.hpp:67
std::vector< uint32_t > materials
512 palette bytes per slot little endian
Definition gpu_layout.hpp:64
Definition gpu_layout.hpp:76
std::vector< uint32_t > grids
Concatenated per volume one BrickEntry per brick x fastest.
Definition gpu_layout.hpp:80
std::vector< uint32_t > coarse
Concatenated per volume one bit per 4x4x4 bricks.
Definition gpu_layout.hpp:83
Words replaced in one section of the copy the GPU holds.
Definition gpu_layout.hpp:97
Definition gpu_layout.hpp:103
std::vector< uint32_t > words
The runs back to back.
Definition gpu_layout.hpp:107
A pack minus the per brick arrays.
Definition gpu_layout.hpp:89
Definition gpu_layout.hpp:116
std::vector< TagDelta > tags
Per scene volume.
Definition gpu_layout.hpp:135
uint32_t pool_slots
Slots the pool sections hold afterwards and they only ever grow.
Definition gpu_layout.hpp:118
uint32_t grid_words
Section sizes afterwards in words or records.
Definition gpu_layout.hpp:121
PatchSection records
VolumeRecord words.
Definition gpu_layout.hpp:132
Neither pointer may be null.
Definition gpu_layout.hpp:71
Definition gpu_layout.hpp:110
Grid indices of the bricks of one scene volume that changed since the retained state.
Definition gpu_layout.hpp:139
Mirrored member for member by voxel_dda.slang so only 4-byte scalars.
Definition gpu_layout.hpp:35
uint32_t grid_offset
In entries.
Definition gpu_layout.hpp:41
uint32_t palette_offset
In entries so multiply by four for words.
Definition gpu_layout.hpp:51
uint32_t coarse_offset
In words.
Definition gpu_layout.hpp:48