diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-10-08 17:19:42 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-10-08 17:36:17 +0300 |
commit | f12b0373f322b710b9fa5cebb67bdf363ff90e9f (patch) | |
tree | ccb30a6d7cd12cac94a3a7ebefa72b162f4df1b2 /source/blender/gpu | |
parent | 5f364216acd5bf0f8098b1da1cdb2e75d42d59b3 (diff) |
BGL: Workaround broken bgl usage caused by GPU refactor
This directly adress the issues caused by rB536c2e0ec916.
Since the state tracking is done at a lower level, using the bgl
functions needs to be safegarded by the state manager.
The current workaround is to bypass `apply_state` when inside a
callback that used a `bgl` function.
Related to T80730.
This fix T81003.
Also this fix the default blend equation for callbacks.
Fixes T80169 T81289.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_state.h | 5 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_state.cc | 35 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_state_private.hh | 1 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_debug.cc | 2 | ||||
-rw-r--r-- | source/blender/gpu/opengl/gl_state.cc | 12 |
5 files changed, 46 insertions, 9 deletions
diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h index 04cf7bc54ba..471edfb7b8f 100644 --- a/source/blender/gpu/GPU_state.h +++ b/source/blender/gpu/GPU_state.h @@ -161,7 +161,10 @@ float GPU_line_width_get(void); void GPU_flush(void); void GPU_finish(void); void GPU_apply_state(void); -void GPU_force_state(void); + +void GPU_bgl_start(void); +void GPU_bgl_end(void); +bool GPU_bgl_get(void); void GPU_memory_barrier(eGPUBarrier barrier); diff --git a/source/blender/gpu/intern/gpu_state.cc b/source/blender/gpu/intern/gpu_state.cc index 44ad9cc9a84..44cc11155bb 100644 --- a/source/blender/gpu/intern/gpu_state.cc +++ b/source/blender/gpu/intern/gpu_state.cc @@ -317,10 +317,39 @@ void GPU_apply_state(void) Context::get()->state_manager->apply_state(); } -/* Will set all the states regardless of the current ones. */ -void GPU_force_state(void) +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name BGL workaround + * + * bgl makes direct GL calls that makes our state tracking out of date. + * This flag make it so that the pyGPU calls will not override the state set by + * bgl functions. + * \{ */ + +void GPU_bgl_start(void) +{ + StateManager &state_manager = *(Context::get()->state_manager); + if (state_manager.use_bgl == false) { + /* Expected by many addons (see T80169, T81289). + * This will reset the blend function. */ + GPU_blend(GPU_BLEND_NONE); + state_manager.apply_state(); + state_manager.use_bgl = true; + } +} + +void GPU_bgl_end(void) +{ + StateManager &state_manager = *(Context::get()->state_manager); + state_manager.use_bgl = false; + /* Resync state tracking. */ + state_manager.force_state(); +} + +bool GPU_bgl_get(void) { - Context::get()->state_manager->force_state(); + return Context::get()->state_manager->use_bgl; } /** \} */ diff --git a/source/blender/gpu/intern/gpu_state_private.hh b/source/blender/gpu/intern/gpu_state_private.hh index d93556a1058..db1747127d4 100644 --- a/source/blender/gpu/intern/gpu_state_private.hh +++ b/source/blender/gpu/intern/gpu_state_private.hh @@ -153,6 +153,7 @@ class StateManager { public: GPUState state; GPUStateMutable mutable_state; + bool use_bgl = false; public: StateManager(); diff --git a/source/blender/gpu/opengl/gl_debug.cc b/source/blender/gpu/opengl/gl_debug.cc index 797f9ff404c..b2b05124463 100644 --- a/source/blender/gpu/opengl/gl_debug.cc +++ b/source/blender/gpu/opengl/gl_debug.cc @@ -200,7 +200,7 @@ void check_gl_error(const char *info) void check_gl_resources(const char *info) { - if (!(G.debug & G_DEBUG_GPU)) { + if (!(G.debug & G_DEBUG_GPU) || GPU_bgl_get()) { return; } diff --git a/source/blender/gpu/opengl/gl_state.cc b/source/blender/gpu/opengl/gl_state.cc index cd24fa0e0e4..27c9b501add 100644 --- a/source/blender/gpu/opengl/gl_state.cc +++ b/source/blender/gpu/opengl/gl_state.cc @@ -73,13 +73,17 @@ GLStateManager::GLStateManager(void) : StateManager() void GLStateManager::apply_state(void) { - this->set_state(this->state); - this->set_mutable_state(this->mutable_state); - this->texture_bind_apply(); - this->image_bind_apply(); + if (!this->use_bgl) { + this->set_state(this->state); + this->set_mutable_state(this->mutable_state); + this->texture_bind_apply(); + this->image_bind_apply(); + } + /* This is needed by gpu_py_offscreen. */ active_fb->apply_state(); }; +/* Will set all the states regardless of the current ones. */ void GLStateManager::force_state(void) { /* Little exception for clip distances since they need to keep the old count correct. */ |