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:
authorJeroen Bakker <jeroen@blender.org>2020-08-05 16:59:04 +0300
committerJeroen Bakker <jeroen@blender.org>2020-08-05 16:59:04 +0300
commit2ca006f6c179b77ad954d883d0a92d05011640f4 (patch)
treedbbc45bacfdcb099ea8a168cd5a078b0a09e3c8d /source/blender
parent43d41675a4e5f2621285c9eeac6737c83bf44923 (diff)
parent87062d4d670c01c9c0835057aaf4164aea971e00 (diff)
Merge branch 'blender-v2.90-release'
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/engines/eevee/eevee_lightcache.c16
-rw-r--r--source/blender/draw/intern/draw_manager.c12
-rw-r--r--source/blender/draw/intern/draw_manager_shader.c25
-rw-r--r--source/blender/gpu/GPU_context.h8
-rw-r--r--source/blender/gpu/GPU_extensions.h2
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c15
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h5
-rw-r--r--source/blender/gpu/intern/gpu_context.cc11
-rw-r--r--source/blender/gpu/intern/gpu_extensions.cc10
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c4
10 files changed, 76 insertions, 32 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index d3a47c2641c..e4922bd85ed 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -531,6 +531,12 @@ void EEVEE_lightcache_free(LightCache *lcache)
static void eevee_lightbake_context_enable(EEVEE_LightBake *lbake)
{
+ if (GPU_use_main_context_workaround() && !BLI_thread_is_main()) {
+ GPU_context_main_lock();
+ DRW_opengl_context_enable();
+ return;
+ }
+
if (lbake->gl_context) {
DRW_opengl_render_context_enable(lbake->gl_context);
if (lbake->gpu_context == NULL) {
@@ -545,6 +551,12 @@ static void eevee_lightbake_context_enable(EEVEE_LightBake *lbake)
static void eevee_lightbake_context_disable(EEVEE_LightBake *lbake)
{
+ if (GPU_use_main_context_workaround() && !BLI_thread_is_main()) {
+ DRW_opengl_context_disable();
+ GPU_context_main_unlock();
+ return;
+ }
+
if (lbake->gl_context) {
DRW_gpu_render_context_disable(lbake->gpu_context);
DRW_opengl_render_context_disable(lbake->gl_context);
@@ -697,7 +709,7 @@ wmJob *EEVEE_lightbake_job_create(struct wmWindowManager *wm,
lbake->delay = delay;
lbake->frame = frame;
- if (lbake->gl_context == NULL) {
+ if (lbake->gl_context == NULL && !GPU_use_main_context_workaround()) {
lbake->gl_context = WM_opengl_context_create();
wm_window_reset_drawable();
}
@@ -742,7 +754,7 @@ void *EEVEE_lightbake_job_data_alloc(struct Main *bmain,
lbake->mutex = BLI_mutex_alloc();
lbake->frame = frame;
- if (run_as_job) {
+ if (run_as_job && !GPU_use_main_context_workaround()) {
lbake->gl_context = WM_opengl_context_create();
wm_window_reset_drawable();
}
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 61c9bf65507..ede589f5bba 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2719,6 +2719,12 @@ void DRW_render_context_enable(Render *render)
WM_init_opengl();
}
+ if (GPU_use_main_context_workaround()) {
+ GPU_context_main_lock();
+ DRW_opengl_context_enable();
+ return;
+ }
+
void *re_gl_context = RE_gl_context_get(render);
/* Changing Context */
@@ -2736,6 +2742,12 @@ void DRW_render_context_enable(Render *render)
void DRW_render_context_disable(Render *render)
{
+ if (GPU_use_main_context_workaround()) {
+ DRW_opengl_context_disable();
+ GPU_context_main_unlock();
+ return;
+ }
+
void *re_gl_context = RE_gl_context_get(render);
if (re_gl_context != NULL) {
diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c
index fec234c5015..1c260721efb 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -34,6 +34,7 @@
#include "DEG_depsgraph_query.h"
+#include "GPU_extensions.h"
#include "GPU_material.h"
#include "GPU_shader.h"
@@ -106,6 +107,12 @@ static void drw_deferred_shader_compilation_exec(
BLI_assert(gl_context != NULL);
#endif
+ const bool use_main_context_workaround = GPU_use_main_context_workaround();
+ if (use_main_context_workaround) {
+ BLI_assert(gl_context == DST.gl_context);
+ GPU_context_main_lock();
+ }
+
WM_opengl_context_activate(gl_context);
while (true) {
@@ -154,6 +161,9 @@ static void drw_deferred_shader_compilation_exec(
}
WM_opengl_context_release(gl_context);
+ if (use_main_context_workaround) {
+ GPU_context_main_unlock();
+ }
}
static void drw_deferred_shader_compilation_free(void *custom_data)
@@ -196,6 +206,8 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
GPU_material_compile(mat);
return;
}
+ const bool use_main_context = GPU_use_main_context_workaround();
+ const bool job_own_context = !use_main_context;
DRWDeferredShader *dsh = MEM_callocN(sizeof(DRWDeferredShader), "Deferred Shader");
@@ -227,7 +239,7 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
if (old_comp->gl_context) {
comp->gl_context = old_comp->gl_context;
old_comp->own_context = false;
- comp->own_context = true;
+ comp->own_context = job_own_context;
}
}
@@ -235,9 +247,14 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
/* Create only one context. */
if (comp->gl_context == NULL) {
- comp->gl_context = WM_opengl_context_create();
- WM_opengl_context_activate(DST.gl_context);
- comp->own_context = true;
+ if (use_main_context) {
+ comp->gl_context = DST.gl_context;
+ }
+ else {
+ comp->gl_context = WM_opengl_context_create();
+ WM_opengl_context_activate(DST.gl_context);
+ }
+ comp->own_context = job_own_context;
}
WM_jobs_customdata_set(wm_job, comp, drw_deferred_shader_compilation_free);
diff --git a/source/blender/gpu/GPU_context.h b/source/blender/gpu/GPU_context.h
index 9876aa6998c..6af150b4660 100644
--- a/source/blender/gpu/GPU_context.h
+++ b/source/blender/gpu/GPU_context.h
@@ -42,6 +42,14 @@ void GPU_context_discard(GPUContext *);
void GPU_context_active_set(GPUContext *);
GPUContext *GPU_context_active_get(void);
+/* Legacy GPU (Intel HD4000 series) do not support sharing GPU objects between GPU
+ * contexts. EEVEE/Workbench can create different contexts for image/preview rendering, baking or
+ * compiling. When a legacy GPU is detected (`GPU_use_main_context_workaround()`) any worker
+ * threads should use the draw manager opengl context and make sure that they are the only one
+ * using it by locking the main context using these two functions. */
+void GPU_context_main_lock(void);
+void GPU_context_main_unlock(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index 0d8954dc16c..0518108edf6 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -48,7 +48,7 @@ bool GPU_arb_texture_cube_map_array_is_supported(void);
bool GPU_mip_render_workaround(void);
bool GPU_depth_blitting_workaround(void);
bool GPU_unused_fb_slot_workaround(void);
-bool GPU_context_local_shaders_workaround(void);
+bool GPU_use_main_context_workaround(void);
bool GPU_texture_copy_workaround(void);
bool GPU_crappy_amd_driver(void);
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index e15e4e08159..8947365d666 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -992,21 +992,9 @@ bool GPU_pass_compile(GPUPass *pass, const char *shname)
shader = NULL;
}
}
- else if (!BLI_thread_is_main() && GPU_context_local_shaders_workaround()) {
- pass->binary.content = GPU_shader_get_binary(
- shader, &pass->binary.format, &pass->binary.len);
- GPU_shader_free(shader);
- shader = NULL;
- }
-
pass->shader = shader;
pass->compiled = true;
}
- else if (pass->binary.content && BLI_thread_is_main()) {
- pass->shader = GPU_shader_load_from_binary(
- pass->binary.content, pass->binary.format, pass->binary.len, shname);
- MEM_SAFE_FREE(pass->binary.content);
- }
return success;
}
@@ -1027,9 +1015,6 @@ static void gpu_pass_free(GPUPass *pass)
MEM_SAFE_FREE(pass->geometrycode);
MEM_SAFE_FREE(pass->vertexcode);
MEM_SAFE_FREE(pass->defines);
- if (pass->binary.content) {
- MEM_freeN(pass->binary.content);
- }
MEM_freeN(pass);
}
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 18ff4c3241d..c08ac663cef 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -47,11 +47,6 @@ typedef struct GPUPass {
char *defines;
uint refcount; /* Orphaned GPUPasses gets freed by the garbage collector. */
uint32_t hash; /* Identity hash generated from all GLSL code. */
- struct {
- char *content;
- uint format;
- int len;
- } binary;
bool compiled; /* Did we already tried to compile the attached GPUShader. */
} GPUPass;
diff --git a/source/blender/gpu/intern/gpu_context.cc b/source/blender/gpu/intern/gpu_context.cc
index 0b9104e5349..e6356580ea3 100644
--- a/source/blender/gpu/intern/gpu_context.cc
+++ b/source/blender/gpu/intern/gpu_context.cc
@@ -62,6 +62,7 @@ static std::vector<GLuint> orphaned_buffer_ids;
static std::vector<GLuint> orphaned_texture_ids;
static std::mutex orphans_mutex;
+static std::mutex main_context_mutex;
struct GPUContext {
GLuint default_vao;
@@ -345,3 +346,13 @@ struct GPUMatrixState *gpu_context_active_matrix_state_get()
BLI_assert(active_ctx);
return active_ctx->matrix_state;
}
+
+void GPU_context_main_lock(void)
+{
+ main_context_mutex.lock();
+}
+
+void GPU_context_main_unlock(void)
+{
+ main_context_mutex.unlock();
+}
diff --git a/source/blender/gpu/intern/gpu_extensions.cc b/source/blender/gpu/intern/gpu_extensions.cc
index 32c1bf6e2d3..35b70a18363 100644
--- a/source/blender/gpu/intern/gpu_extensions.cc
+++ b/source/blender/gpu/intern/gpu_extensions.cc
@@ -97,7 +97,7 @@ static struct GPUGlobal {
bool broken_amd_driver;
/* Some crappy Intel drivers don't work well with shaders created in different
* rendering contexts. */
- bool context_local_shaders_workaround;
+ bool use_main_context_workaround;
/* Intel drivers exhibit artifacts when using #glCopyImageSubData & workbench anti-aliasing.
* (see T76273) */
bool texture_copy_workaround;
@@ -225,9 +225,9 @@ bool GPU_unused_fb_slot_workaround(void)
return GG.unused_fb_slot_workaround;
}
-bool GPU_context_local_shaders_workaround(void)
+bool GPU_use_main_context_workaround(void)
{
- return GG.context_local_shaders_workaround;
+ return GG.use_main_context_workaround;
}
bool GPU_texture_copy_workaround(void)
@@ -391,12 +391,12 @@ void gpu_extensions_init(void)
/* Maybe not all of these drivers have problems with `GLEW_ARB_base_instance`.
* But it's hard to test each case. */
GG.glew_arb_base_instance_is_supported = false;
- GG.context_local_shaders_workaround = true;
+ GG.use_main_context_workaround = true;
}
if (strstr(version, "Build 20.19.15.4285")) {
/* Somehow fixes armature display issues (see T69743). */
- GG.context_local_shaders_workaround = true;
+ GG.use_main_context_workaround = true;
}
}
else if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE) &&
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 4db6eb6af91..190db919b41 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -51,6 +51,7 @@
#include "ED_screen.h"
#include "ED_view3d.h"
+#include "GPU_context.h"
#include "GPU_framebuffer.h"
#include "GPU_immediate.h"
#include "GPU_state.h"
@@ -998,6 +999,7 @@ void wm_draw_update(bContext *C)
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win;
+ GPU_context_main_lock();
BKE_image_free_unused_gpu_textures();
for (win = wm->windows.first; win; win = win->next) {
@@ -1035,6 +1037,8 @@ void wm_draw_update(bContext *C)
/* Draw non-windows (surfaces) */
wm_surfaces_iter(C, wm_draw_surface);
+
+ GPU_context_main_unlock();
}
void wm_draw_region_clear(wmWindow *win, ARegion *UNUSED(region))