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:
-rw-r--r--source/blender/gpu/GPU_context.h12
-rw-r--r--source/blender/gpu/intern/gpu_context.cc51
-rw-r--r--source/blender/gpu/tests/gpu_testing.cc2
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c3
4 files changed, 37 insertions, 31 deletions
diff --git a/source/blender/gpu/GPU_context.h b/source/blender/gpu/GPU_context.h
index c81296093a1..9d92ea2cad9 100644
--- a/source/blender/gpu/GPU_context.h
+++ b/source/blender/gpu/GPU_context.h
@@ -17,14 +17,10 @@
extern "C" {
#endif
-/* GPU backends abstract the differences between different APIs. These must be
- * initialized before creating contexts, and deleted after the last context is
- * discarded. GPU_context_create automatically initializes a backend if none
- * exists yet. */
-bool GPU_backend_init_once(void);
-void GPU_backend_exit(void);
-bool GPU_backend_supported(eGPUBackendType type);
-
+/* GPU backends abstract the differences between different APIs. GPU_context_create
+ * automatically initializes the backend, and GPU_context_discard frees it when there
+ * are no more contexts. */
+bool GPU_backend_supported(void);
eGPUBackendType GPU_backend_get_type(void);
/** Opaque type hiding blender::gpu::Context. */
diff --git a/source/blender/gpu/intern/gpu_context.cc b/source/blender/gpu/intern/gpu_context.cc
index 5ae020e45a4..20d9208a199 100644
--- a/source/blender/gpu/intern/gpu_context.cc
+++ b/source/blender/gpu/intern/gpu_context.cc
@@ -44,6 +44,12 @@ using namespace blender::gpu;
static thread_local Context *active_ctx = nullptr;
+static std::mutex backend_users_mutex;
+static int num_backend_users = 0;
+
+static void gpu_backend_create();
+static void gpu_backend_discard();
+
/* -------------------------------------------------------------------- */
/** \name gpu::Context methods
* \{ */
@@ -86,7 +92,14 @@ Context *Context::get()
GPUContext *GPU_context_create(void *ghost_window)
{
- GPU_backend_init_once();
+ {
+ std::scoped_lock lock(backend_users_mutex);
+ if (num_backend_users == 0) {
+ /* Automatically create backend when first context is created. */
+ gpu_backend_create();
+ }
+ num_backend_users++;
+ }
Context *ctx = GPUBackend::get()->context_alloc(ghost_window);
@@ -99,6 +112,16 @@ void GPU_context_discard(GPUContext *ctx_)
Context *ctx = unwrap(ctx_);
delete ctx;
active_ctx = nullptr;
+
+ {
+ std::scoped_lock lock(backend_users_mutex);
+ num_backend_users--;
+ BLI_assert(num_backend_users >= 0);
+ if (num_backend_users == 0) {
+ /* Discard backend when last context is discarded. */
+ gpu_backend_discard();
+ }
+ }
}
void GPU_context_active_set(GPUContext *ctx_)
@@ -189,11 +212,12 @@ void GPU_render_step()
/** \name Backend selection
* \{ */
+static const eGPUBackendType g_backend_type = GPU_BACKEND_OPENGL;
static GPUBackend *g_backend = nullptr;
-bool GPU_backend_supported(eGPUBackendType type)
+bool GPU_backend_supported(void)
{
- switch (type) {
+ switch (g_backend_type) {
case GPU_BACKEND_OPENGL:
#ifdef WITH_OPENGL_BACKEND
return true;
@@ -212,21 +236,12 @@ bool GPU_backend_supported(eGPUBackendType type)
}
}
-bool GPU_backend_init_once()
+static void gpu_backend_create()
{
- if (GPUBackend::get() != nullptr) {
- return true;
- }
-
- const eGPUBackendType backend_type = GPU_BACKEND_OPENGL;
- if (!GPU_backend_supported(backend_type)) {
- return false;
- }
+ BLI_assert(g_backend == nullptr);
+ BLI_assert(GPU_backend_supported(g_backend_type));
- static std::mutex backend_init_mutex;
- std::scoped_lock lock(backend_init_mutex);
-
- switch (backend_type) {
+ switch (g_backend_type) {
#ifdef WITH_OPENGL_BACKEND
case GPU_BACKEND_OPENGL:
g_backend = new GLBackend;
@@ -241,8 +256,6 @@ bool GPU_backend_init_once()
BLI_assert(0);
break;
}
-
- return true;
}
void gpu_backend_delete_resources()
@@ -251,7 +264,7 @@ void gpu_backend_delete_resources()
g_backend->delete_resources();
}
-void GPU_backend_exit()
+void gpu_backend_discard()
{
/* TODO: assert no resource left. */
delete g_backend;
diff --git a/source/blender/gpu/tests/gpu_testing.cc b/source/blender/gpu/tests/gpu_testing.cc
index 5a2ad893360..224a9afcf59 100644
--- a/source/blender/gpu/tests/gpu_testing.cc
+++ b/source/blender/gpu/tests/gpu_testing.cc
@@ -17,7 +17,6 @@ void GPUTest::SetUp()
GHOST_GLSettings glSettings = {0};
CLG_init();
ghost_system = GHOST_CreateSystem();
- GPU_backend_init_once();
ghost_context = GHOST_CreateOpenGLContext(ghost_system, glSettings);
GHOST_ActivateOpenGLContext(ghost_context);
context = GPU_context_create(nullptr);
@@ -29,7 +28,6 @@ void GPUTest::TearDown()
GPU_exit();
GPU_context_discard(context);
GHOST_DisposeOpenGLContext(ghost_system, ghost_context);
- GPU_backend_exit();
GHOST_DisposeSystem(ghost_system);
CLG_exit();
}
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 7324abfd096..7f5ec77e16d 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -169,7 +169,7 @@ void WM_init_opengl(void)
wm_ghost_init(NULL);
}
- if (!GPU_backend_init_once()) {
+ if (!GPU_backend_supported()) {
return;
}
@@ -613,7 +613,6 @@ void WM_exit_ex(bContext *C, const bool do_python)
else {
UI_exit();
}
- GPU_backend_exit();
BKE_blender_userdef_data_free(&U, false);