OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
drawclusters.h
Go to the documentation of this file.
1#pragma once
2
3#include <Tempest/StorageBuffer>
4#include <Tempest/Vec>
5#include <cstdint>
6
9
11 public:
14
16
17 struct Cluster final {
18 Tempest::Vec3 pos;
19 float r = 0;
20 uint16_t commandId = 0;
21 uint16_t bucketId = 0;
22 uint32_t firstMeshlet = 0;
23 uint32_t meshletCount = 0;
24 uint32_t instanceId = 0;
25 };
26
27 Cluster& operator[](size_t i) { return clusters[i]; }
28 size_t size() const { return clusters.size(); }
29 void markClusters(size_t id, size_t count = 1);
30
31 uint32_t alloc(const PackedMesh::Cluster* cluster, size_t firstMeshlet, size_t meshletCount, uint16_t bucketId, uint16_t commandId);
32 uint32_t alloc(const Bucket& bucket, size_t firstMeshlet, size_t meshletCount, uint16_t bucketId, uint16_t commandId);
33 void free(uint32_t id, uint32_t numCluster);
34
35 bool commit(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId);
36
37 auto ssbo() -> Tempest::StorageBuffer& { return clustersGpu; }
38 auto ssbo() const -> const Tempest::StorageBuffer& { return clustersGpu; }
39
40 private:
41 struct Range {
42 size_t begin = 0;
43 size_t end = 0;
44 };
45
46 struct ScratchPatch {
47 std::vector<uint32_t> header;
48 std::vector<Cluster> patch;
49 };
50
51 struct Patch {
52 Tempest::StorageBuffer indices;
53 Tempest::StorageBuffer data;
54 };
55
56 void patchClusters(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId);
57 size_t implAlloc(size_t count);
58
59 std::vector<Cluster> clusters;
60 std::vector<Range> freeList;
61 Tempest::StorageBuffer clustersGpu;
62 std::vector<uint32_t> clustersDurty;
63 std::atomic_bool clustersDurtyBit {false};
64
65 ScratchPatch scratch;
66
68 };
auto ssbo() -> Tempest::StorageBuffer &
DrawBuckets::Bucket Bucket
bool commit(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
size_t size() const
uint32_t alloc(const PackedMesh::Cluster *cluster, size_t firstMeshlet, size_t meshletCount, uint16_t bucketId, uint16_t commandId)
auto ssbo() const -> const Tempest::StorageBuffer &
void free(uint32_t id, uint32_t numCluster)
Cluster & operator[](size_t i)
void markClusters(size_t id, size_t count=1)
@ MaxFramesInFlight
Definition resources.h:48