[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