Skip to content

Commit b137180

Browse files
authored
Merge pull request #82431 from bitsawer/fix_gpuparticles_free
Fix errors when freeing GPUParticles
2 parents f2f6f99 + 898d1a2 commit b137180

File tree

4 files changed

+30
-23
lines changed

4 files changed

+30
-23
lines changed

drivers/gles3/storage/particles_storage.cpp

+11-8
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,15 @@ RID ParticlesStorage::particles_allocate() {
9494
}
9595

9696
void ParticlesStorage::particles_initialize(RID p_rid) {
97-
particles_owner.initialize_rid(p_rid, Particles());
97+
particles_owner.initialize_rid(p_rid);
9898
}
9999

100100
void ParticlesStorage::particles_free(RID p_rid) {
101-
update_particles();
102101
Particles *particles = particles_owner.get_or_null(p_rid);
102+
103103
particles->dependency.deleted_notify(p_rid);
104+
particles->update_list.remove_from_list();
105+
104106
_particles_free_data(particles);
105107
particles_owner.free(p_rid);
106108
}
@@ -362,8 +364,10 @@ void ParticlesStorage::particles_request_process(RID p_particles) {
362364

363365
if (!particles->dirty) {
364366
particles->dirty = true;
365-
particles->update_list = particle_update_list;
366-
particle_update_list = particles;
367+
368+
if (!particles->update_list.in_list()) {
369+
particle_update_list.add(&particles->update_list);
370+
}
367371
}
368372
}
369373

@@ -1003,13 +1007,12 @@ void ParticlesStorage::update_particles() {
10031007
glBindBufferBase(GL_UNIFORM_BUFFER, PARTICLES_GLOBALS_UNIFORM_LOCATION, global_buffer);
10041008
glBindBuffer(GL_UNIFORM_BUFFER, 0);
10051009

1006-
while (particle_update_list) {
1010+
while (particle_update_list.first()) {
10071011
// Use transform feedback to process particles.
10081012

1009-
Particles *particles = particle_update_list;
1013+
Particles *particles = particle_update_list.first()->self();
10101014

1011-
particle_update_list = particles->update_list;
1012-
particles->update_list = nullptr;
1015+
particles->update_list.remove_from_list();
10131016
particles->dirty = false;
10141017

10151018
_particles_update_buffers(particles);

drivers/gles3/storage/particles_storage.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ class ParticlesStorage : public RendererParticlesStorage {
212212
uint32_t userdata_count = 0;
213213

214214
bool dirty = false;
215-
Particles *update_list = nullptr;
215+
SelfList<Particles> update_list;
216216

217217
double phase = 0.0;
218218
double prev_phase = 0.0;
@@ -242,7 +242,8 @@ class ParticlesStorage : public RendererParticlesStorage {
242242
double trail_length = 1.0;
243243
bool trails_enabled = false;
244244

245-
Particles() {
245+
Particles() :
246+
update_list(this) {
246247
}
247248
};
248249

@@ -264,7 +265,7 @@ class ParticlesStorage : public RendererParticlesStorage {
264265
RID copy_shader_version;
265266
} particles_shader;
266267

267-
Particles *particle_update_list = nullptr;
268+
SelfList<Particles>::List particle_update_list;
268269

269270
mutable RID_Owner<Particles, true> particles_owner;
270271

servers/rendering/renderer_rd/storage_rd/particles_storage.cpp

+11-9
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,15 @@ RID ParticlesStorage::particles_allocate() {
224224
}
225225

226226
void ParticlesStorage::particles_initialize(RID p_rid) {
227-
particles_owner.initialize_rid(p_rid, Particles());
227+
particles_owner.initialize_rid(p_rid);
228228
}
229229

230230
void ParticlesStorage::particles_free(RID p_rid) {
231-
update_particles();
232231
Particles *particles = particles_owner.get_or_null(p_rid);
232+
233233
particles->dependency.deleted_notify(p_rid);
234+
particles->update_list.remove_from_list();
235+
234236
_particles_free_data(particles);
235237
particles_owner.free(p_rid);
236238
}
@@ -587,8 +589,10 @@ void ParticlesStorage::particles_request_process(RID p_particles) {
587589

588590
if (!particles->dirty) {
589591
particles->dirty = true;
590-
particles->update_list = particle_update_list;
591-
particle_update_list = particles;
592+
593+
if (!particles->update_list.in_list()) {
594+
particle_update_list.add(&particles->update_list);
595+
}
592596
}
593597
}
594598

@@ -1373,14 +1377,12 @@ void ParticlesStorage::_particles_update_buffers(Particles *particles) {
13731377
void ParticlesStorage::update_particles() {
13741378
uint32_t frame = RSG::rasterizer->get_frame_number();
13751379
bool uses_motion_vectors = RSG::viewport->get_num_viewports_with_motion_vectors() > 0;
1376-
while (particle_update_list) {
1380+
while (particle_update_list.first()) {
13771381
//use transform feedback to process particles
13781382

1379-
Particles *particles = particle_update_list;
1383+
Particles *particles = particle_update_list.first()->self();
13801384

1381-
//take and remove
1382-
particle_update_list = particles->update_list;
1383-
particles->update_list = nullptr;
1385+
particles->update_list.remove_from_list();
13841386
particles->dirty = false;
13851387

13861388
_particles_update_buffers(particles);

servers/rendering/renderer_rd/storage_rd/particles_storage.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class ParticlesStorage : public RendererParticlesStorage {
209209
RID particles_sort_uniform_set;
210210

211211
bool dirty = false;
212-
Particles *update_list = nullptr;
212+
SelfList<Particles> update_list;
213213

214214
RID sub_emitter;
215215

@@ -256,7 +256,8 @@ class ParticlesStorage : public RendererParticlesStorage {
256256
LocalVector<ParticlesFrameParams> frame_history;
257257
LocalVector<ParticlesFrameParams> trail_params;
258258

259-
Particles() {
259+
Particles() :
260+
update_list(this) {
260261
}
261262
};
262263

@@ -328,7 +329,7 @@ class ParticlesStorage : public RendererParticlesStorage {
328329

329330
} particles_shader;
330331

331-
Particles *particle_update_list = nullptr;
332+
SelfList<Particles>::List particle_update_list;
332333

333334
mutable RID_Owner<Particles, true> particles_owner;
334335

0 commit comments

Comments
 (0)