[Bf-blender-cvs] [3021babf38f] master: Fix: Stops assert when baking in debug mode.

William Leeson noreply at git.blender.org
Wed Oct 13 11:09:40 CEST 2021


Commit: 3021babf38f88a7e8099189ffa84addf84430dfe
Author: William Leeson
Date:   Wed Oct 13 11:08:11 2021 +0200
Branches: master
https://developer.blender.org/rB3021babf38f88a7e8099189ffa84addf84430dfe

Fix: Stops assert when baking in debug mode.

When baking in a debug build running gdb it kept asserting because a GL context was being created outside the main thread.

To fix this the patch only creates the GL context is only created for rendering (when it is actually used).

Reviewed By: sergey

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

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

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h

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

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 0bee265557f..38dbb6ab8b1 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -158,15 +158,6 @@ void BlenderSession::create_session()
       b_v3d, b_rv3d, scene->camera, width, height);
   session->reset(session_params, buffer_params);
 
-  /* Create GPU display.
-   * TODO(sergey): Investigate whether DisplayDriver can be used for the preview as well. */
-  if (!b_engine.is_preview() && !headless) {
-    unique_ptr<BlenderDisplayDriver> display_driver = make_unique<BlenderDisplayDriver>(b_engine,
-                                                                                        b_scene);
-    display_driver_ = display_driver.get();
-    session->set_display_driver(move(display_driver));
-  }
-
   /* Viewport and preview (as in, material preview) does not do tiled rendering, so can inform
    * engine that no tracking of the tiles state is needed.
    * The offline rendering will make a decision when tile is being written. The penalty of asking
@@ -355,6 +346,7 @@ void BlenderSession::render(BL::Depsgraph &b_depsgraph_)
   }
 
   /* Create driver to write out render results. */
+  ensure_display_driver_if_needed();
   session->set_output_driver(make_unique<BlenderOutputDriver>(b_engine));
 
   session->full_buffer_written_cb = [&](string_view filename) { full_buffer_written(filename); };
@@ -727,6 +719,8 @@ void BlenderSession::synchronize(BL::Depsgraph &b_depsgraph_)
   /* unlock */
   session->scene->mutex.unlock();
 
+  ensure_display_driver_if_needed();
+
   /* Start rendering thread, if it's not running already. Do this
    * after all scene data has been synced at least once. */
   session->start();
@@ -763,8 +757,10 @@ void BlenderSession::draw(BL::SpaceImageEditor &space_image)
     draw_state_.last_pass_index = pass_index;
   }
 
-  BL::Array<float, 2> zoom = space_image.zoom();
-  display_driver_->set_zoom(zoom[0], zoom[1]);
+  if (display_driver_) {
+    BL::Array<float, 2> zoom = space_image.zoom();
+    display_driver_->set_zoom(zoom[0], zoom[1]);
+  }
 
   session->draw();
 }
@@ -979,4 +975,27 @@ void BlenderSession::free_blender_memory_if_possible()
   b_engine.free_blender_memory();
 }
 
+void BlenderSession::ensure_display_driver_if_needed()
+{
+  if (display_driver_) {
+    /* Driver is already created. */
+    return;
+  }
+
+  if (headless) {
+    /* No display needed for headless. */
+    return;
+  }
+
+  if (b_engine.is_preview()) {
+    /* TODO(sergey): Investigate whether DisplayDriver can be used for the preview as well. */
+    return;
+  }
+
+  unique_ptr<BlenderDisplayDriver> display_driver = make_unique<BlenderDisplayDriver>(b_engine,
+                                                                                      b_scene);
+  display_driver_ = display_driver.get();
+  session->set_display_driver(move(display_driver));
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index fef6ad1adfc..7d3be5f8054 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -146,6 +146,8 @@ class BlenderSession {
    */
   void free_blender_memory_if_possible();
 
+  void ensure_display_driver_if_needed();
+
   struct {
     thread_mutex mutex;
     int last_pass_index = -1;



More information about the Bf-blender-cvs mailing list