Przeglądaj źródła

Merge pull request #106694 from stuartcarnie/metal_fix_clear_crash

Metal: Fix crash when clearing render buffers
Thaddeus Crews 3 miesięcy temu
rodzic
commit
d19b34c5be
1 zmienionych plików z 11 dodań i 7 usunięć
  1. 11 7
      drivers/metal/metal_objects.mm

+ 11 - 7
drivers/metal/metal_objects.mm

@@ -602,18 +602,18 @@ void MDCommandBuffer::_render_clear_render_area() {
 	bool clear_stencil = (ds_index != RDD::AttachmentReference::UNUSED && pass.attachments[ds_index].shouldClear(subpass, true));
 
 	uint32_t color_count = subpass.color_references.size();
-	uint32_t clear_count = color_count + (clear_depth || clear_stencil ? 1 : 0);
-	if (clear_count == 0) {
+	uint32_t clears_size = color_count + (clear_depth || clear_stencil ? 1 : 0);
+	if (clears_size == 0) {
 		return;
 	}
 
-	RDD::AttachmentClear *clears = ALLOCA_ARRAY(RDD::AttachmentClear, clear_count);
-	uint32_t clears_idx = 0;
+	RDD::AttachmentClear *clears = ALLOCA_ARRAY(RDD::AttachmentClear, clears_size);
+	uint32_t clears_count = 0;
 
 	for (uint32_t i = 0; i < color_count; i++) {
 		uint32_t idx = subpass.color_references[i].attachment;
 		if (idx != RDD::AttachmentReference::UNUSED && pass.attachments[idx].shouldClear(subpass, false)) {
-			clears[clears_idx++] = { .aspect = RDD::TEXTURE_ASPECT_COLOR_BIT, .color_attachment = idx, .value = render.clear_values[idx] };
+			clears[clears_count++] = { .aspect = RDD::TEXTURE_ASPECT_COLOR_BIT, .color_attachment = idx, .value = render.clear_values[idx] };
 		}
 	}
 
@@ -627,10 +627,14 @@ void MDCommandBuffer::_render_clear_render_area() {
 			bits.set_flag(RDD::TEXTURE_ASPECT_STENCIL_BIT);
 		}
 
-		clears[clears_idx++] = { .aspect = bits, .color_attachment = ds_index, .value = render.clear_values[ds_index] };
+		clears[clears_count++] = { .aspect = bits, .color_attachment = ds_index, .value = render.clear_values[ds_index] };
 	}
 
-	render_clear_attachments(VectorView(clears, clear_count), { render.render_area });
+	if (clears_count == 0) {
+		return;
+	}
+
+	render_clear_attachments(VectorView(clears, clears_count), { render.render_area });
 }
 
 void MDCommandBuffer::render_next_subpass() {