Skip to content

Commit 0c3dd68

Browse files
committed
have managed buffers remove themselves from registry on destruction
1 parent e674729 commit 0c3dd68

File tree

3 files changed

+32
-4
lines changed

3 files changed

+32
-4
lines changed

include/polyscope/render/managed_buffer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ template <typename T>
247247
struct ManagedBufferMap {
248248
public:
249249
void addManagedBuffer(ManagedBuffer<T>* buffer);
250+
void removeManagedBuffer(ManagedBuffer<T>* buffer);
250251

251252
ManagedBuffer<T>& getManagedBuffer(std::string name);
252253
bool hasManagedBuffer(std::string name);
@@ -281,6 +282,9 @@ class ManagedBufferRegistry {
281282
template <typename T>
282283
void addManagedBuffer(ManagedBuffer<T>* buffer);
283284

285+
template <typename T>
286+
void removeManagedBuffer(ManagedBuffer<T>* buffer);
287+
284288
// clang-format off
285289
ManagedBufferMap<float> managedBufferMap_float;
286290
ManagedBufferMap<double> managedBufferMap_double;

include/polyscope/render/managed_buffer.ipp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,23 @@ void ManagedBufferMap<T>::addManagedBuffer(ManagedBuffer<T>* buffer) {
3131
}
3232

3333

34+
template <typename T>
35+
void ManagedBufferRegistry::removeManagedBuffer(ManagedBuffer<T>* buffer) {
36+
ManagedBufferMap<T>::getManagedBufferMapRef(this).removeManagedBuffer(buffer);
37+
}
38+
39+
template <typename T>
40+
void ManagedBufferMap<T>::removeManagedBuffer(ManagedBuffer<T>* buffer) {
41+
for (auto it = allBuffers.begin(); it != allBuffers.end(); ++it) {
42+
if ((*it)->name == buffer->name) {
43+
allBuffers.erase(it);
44+
return;
45+
}
46+
}
47+
48+
// if it is not present, this will silently do nothing
49+
}
50+
3451
template <typename T>
3552
ManagedBuffer<T>& ManagedBufferMap<T>::getManagedBuffer(std::string name) {
3653

src/render/managed_buffer.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ ManagedBuffer<T>::ManagedBuffer(ManagedBufferRegistry* registry_, const std::str
3838
}
3939

4040
template <typename T>
41-
ManagedBuffer<T>::~ManagedBuffer() {}
41+
ManagedBuffer<T>::~ManagedBuffer() {
42+
if (registry) {
43+
registry->removeManagedBuffer<T>(this);
44+
}
45+
}
4246

4347
template <typename T>
4448
void ManagedBuffer<T>::checkInvalidValues() {
@@ -47,15 +51,17 @@ void ManagedBuffer<T>::checkInvalidValues() {
4751

4852
template <typename T>
4953
void ManagedBuffer<T>::setTextureSize(uint32_t sizeX_) {
50-
if (deviceBufferType != DeviceBufferType::Attribute) exception("managed buffer can only be set as texture once");
54+
if (deviceBufferType != DeviceBufferType::Attribute)
55+
exception("managed buffer cannot be resized, texture size can only be set once");
5156

5257
deviceBufferType = DeviceBufferType::Texture1d;
5358
sizeX = sizeX_;
5459
}
5560

5661
template <typename T>
5762
void ManagedBuffer<T>::setTextureSize(uint32_t sizeX_, uint32_t sizeY_) {
58-
if (deviceBufferType != DeviceBufferType::Attribute) exception("managed buffer can only be set as texture once");
63+
if (deviceBufferType != DeviceBufferType::Attribute)
64+
exception("managed buffer cannot be resized, texture size can only be set once");
5965

6066
deviceBufferType = DeviceBufferType::Texture2d;
6167
sizeX = sizeX_;
@@ -64,7 +70,8 @@ void ManagedBuffer<T>::setTextureSize(uint32_t sizeX_, uint32_t sizeY_) {
6470

6571
template <typename T>
6672
void ManagedBuffer<T>::setTextureSize(uint32_t sizeX_, uint32_t sizeY_, uint32_t sizeZ_) {
67-
if (deviceBufferType != DeviceBufferType::Attribute) exception("managed buffer can only be set as texture once");
73+
if (deviceBufferType != DeviceBufferType::Attribute)
74+
exception("managed buffer cannot be resized, texture size can only be set once");
6875

6976
deviceBufferType = DeviceBufferType::Texture3d;
7077
sizeX = sizeX_;

0 commit comments

Comments
 (0)