[Bf-blender-cvs] [786aad68b2c] xr-dev: Fix virtual camera-related crashes due to failed assert

Peter Kim noreply at git.blender.org
Mon Dec 12 13:34:12 CET 2022


Commit: 786aad68b2c210bcb2f56e2ae2bf5daa92b669eb
Author: Peter Kim
Date:   Mon Dec 12 21:25:43 2022 +0900
Branches: xr-dev
https://developer.blender.org/rB786aad68b2c210bcb2f56e2ae2bf5daa92b669eb

Fix virtual camera-related crashes due to failed assert

See comment on https://developer.blender.org/D16366.

When browsing materials, showing material properties, or changing
camera settings for the virtual camera, Blender would crash due to a
failed assert in gpu_offscreen_fb_get() (gpu_framebuffer.cc L602),
where the framebuffer list for the virtual camera offscreen would
appear to contain corrupted data.

This was likely caused by the pointer to the virtual camera offscreen
(stored as camera->runtime.virtual_monitor_offscreen) being shared
among src and dst camera data-blocks in camera_copy_data(), which is
called from depsgraph copy-on-write (when showing material properties,
changing camera settings, etc.). This should probably not be the case,
as if one data-block is freed (freeing the runtime data), then the
other will have a dangling pointer to the offscreen.

As a tentative solution, free the runtime data for the dst camera in
camera_copy_data() to prevent sharing virtual monitor offscreens across
cameras. In this way, no two virtual camera data-blocks should share
the same offscreen pointer and a new offscreen will be created for the
dst camera if necessary in view3d_virtual_camera_update().

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

M	source/blender/blenkernel/intern/camera.c

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

diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index e3a72c5d69e..b475d49d8e7 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -59,6 +59,20 @@ static void camera_init_data(ID *id)
   MEMCPY_STRUCT_AFTER(cam, DNA_struct_default_get(Camera), id);
 }
 
+/** Free (or release) any data used by this camera (does not free the camera itself). */
+static void camera_free_runtime_data(Camera *cam, const Camera *cam_src)
+{
+  if (cam->runtime.virtual_monitor_offscreen) {
+    if (!cam_src ||
+        (cam_src->runtime.virtual_monitor_offscreen != cam->runtime.virtual_monitor_offscreen)) {
+      GPU_offscreen_free(cam->runtime.virtual_monitor_offscreen);
+    }
+    cam->runtime.virtual_monitor_offscreen = NULL;
+  }
+  /* GPU texture is owned by the GPUOffscreen instance. */
+  cam->runtime.offscreen_color_texture = NULL;
+}
+
 /**
  * Only copy internal data of Camera ID from source
  * to already allocated/initialized destination.
@@ -82,24 +96,17 @@ static void camera_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src,
     CameraBGImage *bgpic_dst = BKE_camera_background_image_copy(bgpic_src, flag_subdata);
     BLI_addtail(&cam_dst->bg_images, bgpic_dst);
   }
-}
 
-/** Free (or release) any data used by this camera (does not free the camera itself). */
-static void camera_free_runtime_data(Camera *camera)
-{
-  if (camera->runtime.virtual_monitor_offscreen) {
-    GPU_offscreen_free(camera->runtime.virtual_monitor_offscreen);
-    camera->runtime.virtual_monitor_offscreen = NULL;
-  }
-  /* GPU texture is owned by the GPUOffscreen instance. */
-  camera->runtime.offscreen_color_texture = NULL;
+  /* Free runtime data to prevent virtual monitor offscreen from being shared across data-blocks.
+   */
+  camera_free_runtime_data(cam_dst, cam_src);
 }
 
 static void camera_free_data(ID *id)
 {
   Camera *cam = (Camera *)id;
   BLI_freelistN(&cam->bg_images);
-  camera_free_runtime_data(cam);
+  camera_free_runtime_data(cam, NULL);
 }
 
 static void camera_foreach_id(ID *id, LibraryForeachIDData *data)



More information about the Bf-blender-cvs mailing list