Skip to content

Commit 13992bb

Browse files
committed
Merge pull request godotengine#100766 from stuartcarnie/metal_crash
Metal: Fix crash when uniform set is empty for slot binding mode
2 parents d8b1a5a + b643599 commit 13992bb

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

drivers/metal/metal_objects.mm

+6-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@
5656

5757
#import <os/signpost.h>
5858

59+
// We have to undefine these macros because they are defined in NSObjCRuntime.h.
60+
#undef MIN
61+
#undef MAX
62+
5963
void MDCommandBuffer::begin() {
6064
DEV_ASSERT(commandBuffer == nil);
6165
commandBuffer = queue.commandBufferWithUnretainedReferences;
@@ -764,6 +768,7 @@
764768
[render.encoder setVertexBuffers:render.vertex_buffers.ptr()
765769
offsets:render.vertex_offsets.ptr()
766770
withRange:NSMakeRange(first, p_binding_count)];
771+
render.dirty.clear_flag(RenderState::DIRTY_VERTEX);
767772
} else {
768773
render.dirty.set_flag(RenderState::DIRTY_VERTEX);
769774
}
@@ -1082,7 +1087,7 @@
10821087

10831088
UniformSet const &set = p_shader->sets[index];
10841089

1085-
for (uint32_t i = 0; i < uniforms.size(); i++) {
1090+
for (uint32_t i = 0; i < MIN(uniforms.size(), set.uniforms.size()); i++) {
10861091
RDD::BoundUniform const &uniform = uniforms[i];
10871092
UniformInfo ui = set.uniforms[i];
10881093

servers/rendering/renderer_rd/storage_rd/particles_storage.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -541,13 +541,15 @@ void ParticlesStorage::_particles_allocate_emission_buffer(Particles *particles)
541541

542542
void ParticlesStorage::_particles_ensure_unused_emission_buffer(Particles *particles) {
543543
if (particles->unused_emission_storage_buffer.is_null()) {
544-
particles->unused_emission_storage_buffer = RD::get_singleton()->storage_buffer_create(sizeof(uint32_t) * 4);
544+
// For rendering devices that do not support empty arrays (like C++),
545+
// we need to size the buffer with at least 1 element.
546+
particles->unused_emission_storage_buffer = RD::get_singleton()->storage_buffer_create(sizeof(ParticleEmissionBuffer));
545547
}
546548
}
547549

548550
void ParticlesStorage::_particles_ensure_unused_trail_buffer(Particles *particles) {
549551
if (particles->unused_trail_storage_buffer.is_null()) {
550-
particles->unused_trail_storage_buffer = RD::get_singleton()->storage_buffer_create(sizeof(uint32_t) * 4);
552+
particles->unused_trail_storage_buffer = RD::get_singleton()->storage_buffer_create(16 * sizeof(float)); // Size of mat4.
551553
}
552554
}
553555

0 commit comments

Comments
 (0)