diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-12-03 17:22:02 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-12-05 13:16:29 +0300 |
commit | cf77b67c459d481f6d8d34d13e14d22a6cad0842 (patch) | |
tree | 47475c5b16a0f3a2ffc1d22766e48acdc91f22eb /source/blender/gpu | |
parent | 6ba09f8515bd7968d8f1ef13ff19b5c05898660e (diff) |
Fix T71576 Mesh error on mutimaterial Meshes on legacy nvidia drivers
Differential Revision: https://developer.blender.org/D6351
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_extensions.h | 1 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_extensions.c | 15 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 5 |
3 files changed, 20 insertions, 1 deletions
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index 245f7f47510..692cd159fbf 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -48,6 +48,7 @@ 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_legacy_nvidia_driver(void); bool GPU_crappy_amd_driver(void); bool GPU_mem_stats_supported(void); diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 33f918559f7..7eb2cd61fda 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -93,6 +93,8 @@ static struct GPUGlobal { /* Some crappy Intel drivers don't work well with shaders created in different * rendering contexts. */ bool context_local_shaders_workaround; + /* Unmaintained NVIDIA drivers contain certain bugs we need to workaround. */ + bool legacy_nvidia_driver; } GG = {1, 0}; static void gpu_detect_mip_render_workaround(void) @@ -216,6 +218,11 @@ bool GPU_context_local_shaders_workaround(void) return GG.context_local_shaders_workaround; } +bool GPU_legacy_nvidia_driver(void) +{ + return GG.legacy_nvidia_driver; +} + bool GPU_crappy_amd_driver(void) { /* Currently are the same drivers with the `unused_fb_slot` problem. */ @@ -281,6 +288,14 @@ void gpu_extensions_init(void) GG.glew_arb_base_instance_is_supported = GLEW_ARB_base_instance; gpu_detect_mip_render_workaround(); + if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_OFFICIAL)) { + char *driver_version_str = strstr(version, "NVIDIA ") + 7; + int driver_major_version = (int)strtol(driver_version_str, NULL, 10); + if (driver_major_version > 0 && driver_major_version < 400) { + GG.legacy_nvidia_driver = true; + } + } + if (G.debug & G_DEBUG_GPU_FORCE_WORKAROUNDS) { printf("\n"); printf("GPU: Bypassing workaround detection.\n"); diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index ae2c7864e36..adbb978dded 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -243,11 +243,14 @@ static void gpu_shader_standard_defines(char defines[MAX_DEFINE_LENGTH]) if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_ANY, GPU_DRIVER_ANY)) { strcat(defines, "#define GPU_ATI\n"); if (GPU_crappy_amd_driver()) { - strcat(defines, "#define GPU_DEPRECATED_AMD_DRIVER\n"); + strcat(defines, "#define GPU_DEPRECATED_AMD\n"); } } else if (GPU_type_matches(GPU_DEVICE_NVIDIA, GPU_OS_ANY, GPU_DRIVER_ANY)) { strcat(defines, "#define GPU_NVIDIA\n"); + if (GPU_legacy_nvidia_driver()) { + strcat(defines, "#define GPU_DEPRECATED_NVIDIA\n"); + } } else if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) { strcat(defines, "#define GPU_INTEL\n"); |