[Bf-blender-cvs] [17cab47ed10] master: Cycles: Fix T94736: Crash when modifying strength of world environment texture

Michael Jones noreply at git.blender.org
Wed Jan 19 19:17:38 CET 2022


Commit: 17cab47ed10a99818f9cdd15657c1231e312da25
Author: Michael Jones
Date:   Wed Jan 19 17:57:24 2022 +0000
Branches: master
https://developer.blender.org/rB17cab47ed10a99818f9cdd15657c1231e312da25

Cycles: Fix T94736: Crash when modifying strength of world environment texture

This patch fixes crash T94736 on Metal in which the launch_params were not being updated to reflect destruction of MetalMem objects.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D13875

===================================================================

M	intern/cycles/device/metal/device_impl.h
M	intern/cycles/device/metal/device_impl.mm

===================================================================

diff --git a/intern/cycles/device/metal/device_impl.h b/intern/cycles/device/metal/device_impl.h
index a420a3ba704..8d289beda13 100644
--- a/intern/cycles/device/metal/device_impl.h
+++ b/intern/cycles/device/metal/device_impl.h
@@ -115,6 +115,8 @@ class MetalDevice : public Device {
 
   void load_texture_info();
 
+  void erase_allocation(device_memory &mem);
+
   virtual bool should_use_graphics_interop() override;
 
   virtual unique_ptr<DeviceQueue> gpu_queue_create() override;
diff --git a/intern/cycles/device/metal/device_impl.mm b/intern/cycles/device/metal/device_impl.mm
index 4ad5a3caebc..1105fb20360 100644
--- a/intern/cycles/device/metal/device_impl.mm
+++ b/intern/cycles/device/metal/device_impl.mm
@@ -432,6 +432,25 @@ void MetalDevice::load_texture_info()
   }
 }
 
+void MetalDevice::erase_allocation(device_memory &mem)
+{
+  stats.mem_free(mem.device_size);
+  mem.device_pointer = 0;
+  mem.device_size = 0;
+
+  auto it = metal_mem_map.find(&mem);
+  if (it != metal_mem_map.end()) {
+    MetalMem *mmem = it->second.get();
+
+    /* blank out reference to MetalMem* in the launch params (fixes crash T94736) */
+    if (mmem->pointer_index >= 0) {
+      device_ptr *pointers = (device_ptr*)&launch_params;
+      pointers[mmem->pointer_index] = 0;
+    }
+    metal_mem_map.erase(it);
+  }
+}
+
 MetalDevice::MetalMem *MetalDevice::generic_alloc(device_memory &mem)
 {
   size_t size = mem.memory_size();
@@ -561,11 +580,7 @@ void MetalDevice::generic_free(device_memory &mem)
       mmem.mtlBuffer = nil;
     }
 
-    stats.mem_free(mem.device_size);
-    mem.device_pointer = 0;
-    mem.device_size = 0;
-
-    metal_mem_map.erase(&mem);
+    erase_allocation(mem);
   }
 }
 
@@ -954,10 +969,7 @@ void MetalDevice::tex_free(device_texture &mem)
       delayed_free_list.push_back(mmem.mtlTexture);
       mmem.mtlTexture = nil;
     }
-    stats.mem_free(mem.device_size);
-    mem.device_pointer = 0;
-    mem.device_size = 0;
-    metal_mem_map.erase(&mem);
+    erase_allocation(mem);
   }
 }



More information about the Bf-blender-cvs mailing list