BGL: fix issues with addons using BGL at startup

This was an issue for Cycles.

This also makes the `GPU_bgl*` functions less fragile by checking for
null pointers.
This commit is contained in:
2020-10-09 16:33:24 +02:00
parent d39043b5ae
commit 14c53c5018
2 changed files with 22 additions and 11 deletions

View File

@@ -329,22 +329,28 @@ void GPU_apply_state(void)
void GPU_bgl_start(void) void GPU_bgl_start(void)
{ {
StateManager &state_manager = *(Context::get()->state_manager); Context *ctx = Context::get();
if (state_manager.use_bgl == false) { if (ctx && ctx->state_manager) {
/* Expected by many addons (see T80169, T81289). StateManager &state_manager = *(Context::get()->state_manager);
* This will reset the blend function. */ if (state_manager.use_bgl == false) {
GPU_blend(GPU_BLEND_NONE); /* Expected by many addons (see T80169, T81289).
state_manager.apply_state(); * This will reset the blend function. */
state_manager.use_bgl = true; GPU_blend(GPU_BLEND_NONE);
state_manager.apply_state();
state_manager.use_bgl = true;
}
} }
} }
void GPU_bgl_end(void) void GPU_bgl_end(void)
{ {
StateManager &state_manager = *(Context::get()->state_manager); Context *ctx = Context::get();
state_manager.use_bgl = false; if (ctx && ctx->state_manager) {
/* Resync state tracking. */ StateManager &state_manager = *ctx->state_manager;
state_manager.force_state(); state_manager.use_bgl = false;
/* Resync state tracking. */
state_manager.force_state();
}
} }
bool GPU_bgl_get(void) bool GPU_bgl_get(void)

View File

@@ -35,6 +35,8 @@
#include "RNA_access.h" #include "RNA_access.h"
#include "RNA_types.h" #include "RNA_types.h"
#include "GPU_state.h"
#include "bpy.h" #include "bpy.h"
#include "bpy_app.h" #include "bpy_app.h"
#include "bpy_capi_utils.h" #include "bpy_capi_utils.h"
@@ -330,6 +332,9 @@ static PyMethodDef meth_bpy_escape_identifier = {
static PyObject *bpy_import_test(const char *modname) static PyObject *bpy_import_test(const char *modname)
{ {
PyObject *mod = PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0); PyObject *mod = PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
GPU_bgl_end();
if (mod) { if (mod) {
Py_DECREF(mod); Py_DECREF(mod);
} }