diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-06-05 19:06:11 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-06-05 19:50:58 +0300 |
commit | ce66b22c427defa3db498d2d69ee615b3c913c5f (patch) | |
tree | 5b0b947f7c0cd22d100af33c23d3ad60eee2133c /source/blender/gpu/intern/gpu_extensions.c | |
parent | dd81efa4a343ecbb7a208e06ea854ce673e20504 (diff) |
Fix crash when editing shaders on Intel HD 4000.
In the Intel HD 4000 driver a shader has to be deleted in the same context in which it is created.
However, because you can't use a rendering context on different threads, to maintain the multithreaded compilation, the solution was to use the `GL_ARB_get_program_binary` and copy the binary generated for the shader and generate a shader on the main context using that binary.
This solution is limited only to Intel HD 4000 and windows.
Reviewers: fclem
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D5019
Diffstat (limited to 'source/blender/gpu/intern/gpu_extensions.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_extensions.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 8cd554cc9d5..58efe3dc5c4 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -89,6 +89,9 @@ static struct GPUGlobal { /* Crappy driver don't know how to map framebuffer slot to output vars... * We need to have no "holes" in the output buffer slots. */ bool unused_fb_slot_workaround; + /* Some crappy Intel drivers don't work well with shaders created in different + * rendering contexts. */ + bool context_local_shaders_workaround; } GG = {1, 0}; static void gpu_detect_mip_render_workaround(void) @@ -209,6 +212,11 @@ bool GPU_unused_fb_slot_workaround(void) return GG.unused_fb_slot_workaround; } +bool GPU_context_local_shaders_workaround(void) +{ + return GG.context_local_shaders_workaround; +} + bool GPU_crappy_amd_driver(void) { /* Currently are the same drivers with the `unused_fb_slot` problem. */ @@ -347,6 +355,7 @@ void gpu_extensions_init(void) GG.mip_render_workaround = true; GG.depth_blitting_workaround = true; GG.unused_fb_slot_workaround = true; + GG.context_local_shaders_workaround = true; } /* df/dy calculation factors, those are dependent on driver */ @@ -354,19 +363,24 @@ void gpu_extensions_init(void) GG.dfdyfactors[0] = 1.0; GG.dfdyfactors[1] = -1.0; } - else if ((GG.device == GPU_DEVICE_INTEL) && (GG.os == GPU_OS_WIN) && - (strstr(version, "4.0.0 - Build 10.18.10.3308") || - strstr(version, "4.0.0 - Build 9.18.10.3186") || - strstr(version, "4.0.0 - Build 9.18.10.3165") || - strstr(version, "3.1.0 - Build 9.17.10.3347") || - strstr(version, "3.1.0 - Build 9.17.10.4101") || - strstr(version, "3.3.0 - Build 8.15.10.2618"))) { - GG.dfdyfactors[0] = -1.0; - GG.dfdyfactors[1] = 1.0; - } - else { - GG.dfdyfactors[0] = 1.0; - GG.dfdyfactors[1] = 1.0; + else if ((GG.device == GPU_DEVICE_INTEL) && (GG.os == GPU_OS_WIN)) { + if (strstr(version, "4.0.0 - Build 10.18.10.3308") || + strstr(version, "4.0.0 - Build 9.18.10.3186") || + strstr(version, "4.0.0 - Build 9.18.10.3165") || + strstr(version, "3.1.0 - Build 9.17.10.3347") || + strstr(version, "3.1.0 - Build 9.17.10.4101") || + strstr(version, "3.3.0 - Build 8.15.10.2618")) { + GG.dfdyfactors[0] = -1.0; + GG.dfdyfactors[1] = 1.0; + } + else { + GG.dfdyfactors[0] = 1.0; + GG.dfdyfactors[1] = 1.0; + } + + if (strstr(renderer, "HD Graphics 4000")) { + GG.context_local_shaders_workaround = true; + } } GPU_invalid_tex_init(); |