[Bf-blender-cvs] [d7ecd44fb19] cycles-x: Fix missing mutex lock for viewport OpenGL context

Sergey Sharybin noreply at git.blender.org
Wed Sep 15 20:04:38 CEST 2021


Commit: d7ecd44fb1979d70ee9376ce709b53767c500814
Author: Sergey Sharybin
Date:   Wed Sep 15 19:46:39 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBd7ecd44fb1979d70ee9376ce709b53767c500814

Fix missing mutex lock for viewport OpenGL context

A mistake in D12468: the viewport uses GHOST to operate on contexts,
bypassing draw manager state,

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

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

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

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

diff --git a/intern/cycles/blender/blender_gpu_display.cpp b/intern/cycles/blender/blender_gpu_display.cpp
index eca11c061ca..d3637de8bc5 100644
--- a/intern/cycles/blender/blender_gpu_display.cpp
+++ b/intern/cycles/blender/blender_gpu_display.cpp
@@ -461,6 +461,10 @@ void BlenderGPUDisplay::do_draw(const GPUDisplayParams &params)
     return;
   }
 
+  if (use_gl_context_) {
+    gl_context_mutex_.lock();
+  }
+
   glWaitSync((GLsync)gl_upload_sync_, 0, GL_TIMEOUT_IGNORED);
 
   if (transparent) {
@@ -513,6 +517,10 @@ void BlenderGPUDisplay::do_draw(const GPUDisplayParams &params)
 
   gl_render_sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
   glFlush();
+
+  if (use_gl_context_) {
+    gl_context_mutex_.unlock();
+  }
 }
 
 void BlenderGPUDisplay::gl_context_create()
@@ -550,6 +558,7 @@ bool BlenderGPUDisplay::gl_context_enable()
     if (!gl_context_) {
       return false;
     }
+    gl_context_mutex_.lock();
     WM_opengl_context_activate(gl_context_);
     return true;
   }
@@ -563,6 +572,7 @@ void BlenderGPUDisplay::gl_context_disable()
   if (use_gl_context_) {
     if (gl_context_) {
       WM_opengl_context_release(gl_context_);
+      gl_context_mutex_.unlock();
     }
     return;
   }
diff --git a/intern/cycles/blender/blender_gpu_display.h b/intern/cycles/blender/blender_gpu_display.h
index 0fc985c7dd9..87fd2196394 100644
--- a/intern/cycles/blender/blender_gpu_display.h
+++ b/intern/cycles/blender/blender_gpu_display.h
@@ -155,6 +155,8 @@ class BlenderGPUDisplay : public GPUDisplay {
   /* The when Blender RenderEngine side context is not available and the GPUDisplay is to create
    * its own context. */
   bool use_gl_context_ = false;
+  /* Mutex used to guard the `gl_context_`. */
+  thread_mutex gl_context_mutex_;
 
   /* Texture which contains pixels of the render result. */
   struct {



More information about the Bf-blender-cvs mailing list