Skip to content

Commit

Permalink
Merge pull request #38378 from lawnjelly/kessel_ios_particle
Browse files Browse the repository at this point in the history
Fix uninitialized memory in CPUParticles2D
  • Loading branch information
akien-mga authored May 1, 2020
2 parents 01a085d + 9af4c09 commit 8426ed2
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 16 deletions.
34 changes: 18 additions & 16 deletions scene/2d/cpu_particles_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ void CPUParticles2D::set_amount(int p_amount) {
{
PoolVector<Particle>::Write w = particles.write();

for (int i = 0; i < p_amount; i++) {
w[i].active = false;
}
// each particle must be set to false
// zeroing the data also prevents uninitialized memory being sent to GPU
zeromem(static_cast<void *>(&w[0]), p_amount * sizeof(Particle));
// cast to prevent compiler warning .. note this relies on Particle not containing any complex types.
// an alternative is to use some zero method per item but the generated code will be far less efficient.
}

particle_data.resize((8 + 4 + 1) * p_amount);
Expand Down Expand Up @@ -1020,22 +1022,22 @@ void CPUParticles2D::_update_particle_data_buffer() {
ptr[6] = 0;
ptr[7] = t.elements[2][1];

Color c = r[idx].color;
uint8_t *data8 = (uint8_t *)&ptr[8];
data8[0] = CLAMP(c.r * 255.0, 0, 255);
data8[1] = CLAMP(c.g * 255.0, 0, 255);
data8[2] = CLAMP(c.b * 255.0, 0, 255);
data8[3] = CLAMP(c.a * 255.0, 0, 255);

ptr[9] = r[idx].custom[0];
ptr[10] = r[idx].custom[1];
ptr[11] = r[idx].custom[2];
ptr[12] = r[idx].custom[3];

} else {
zeromem(ptr, sizeof(float) * 8);
zeromem(ptr, sizeof(float) * 13);
}

Color c = r[idx].color;
uint8_t *data8 = (uint8_t *)&ptr[8];
data8[0] = CLAMP(c.r * 255.0, 0, 255);
data8[1] = CLAMP(c.g * 255.0, 0, 255);
data8[2] = CLAMP(c.b * 255.0, 0, 255);
data8[3] = CLAMP(c.a * 255.0, 0, 255);

ptr[9] = r[idx].custom[0];
ptr[10] = r[idx].custom[1];
ptr[11] = r[idx].custom[2];
ptr[12] = r[idx].custom[3];

ptr += 13;
}
}
Expand Down
2 changes: 2 additions & 0 deletions scene/2d/cpu_particles_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ class CPUParticles2D : public Node2D {
private:
bool emitting;

// warning - beware of adding non-trivial types
// to this structure as it is zeroed to initialize in set_amount()
struct Particle {
Transform2D transform;
Color color;
Expand Down

0 comments on commit 8426ed2

Please sign in to comment.