Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-10-08 17:19:42 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-10-08 17:36:17 +0300
commitf12b0373f322b710b9fa5cebb67bdf363ff90e9f (patch)
treeccb30a6d7cd12cac94a3a7ebefa72b162f4df1b2 /source/blender/gpu/intern/gpu_state.cc
parent5f364216acd5bf0f8098b1da1cdb2e75d42d59b3 (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/intern/gpu_state.cc')
-rw-r--r--source/blender/gpu/intern/gpu_state.cc35
1 files changed, 32 insertions, 3 deletions
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;
}
/** \} */