From cf77b67c459d481f6d8d34d13e14d22a6cad0842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 3 Dec 2019 15:22:02 +0100 Subject: Fix T71576 Mesh error on mutimaterial Meshes on legacy nvidia drivers Differential Revision: https://developer.blender.org/D6351 --- source/blender/draw/intern/shaders/common_view_lib.glsl | 9 ++++++--- source/blender/gpu/GPU_extensions.h | 1 + source/blender/gpu/intern/gpu_extensions.c | 15 +++++++++++++++ source/blender/gpu/intern/gpu_shader.c | 5 ++++- 4 files changed, 26 insertions(+), 4 deletions(-) (limited to 'source') diff --git a/source/blender/draw/intern/shaders/common_view_lib.glsl b/source/blender/draw/intern/shaders/common_view_lib.glsl index 1a28a307163..182a4c72fe5 100644 --- a/source/blender/draw/intern/shaders/common_view_lib.glsl +++ b/source/blender/draw/intern/shaders/common_view_lib.glsl @@ -80,7 +80,7 @@ uniform int baseInstance; # if defined(IN_PLACE_INSTANCES) || defined(INSTANCED_ATTRIB) /* When drawing instances of an object at the same position. */ # define instanceId 0 -# elif defined(GPU_DEPRECATED_AMD_DRIVER) +# elif defined(GPU_DEPRECATED_AMD) /* A driver bug make it so that when using an attribute with GL_INT_2_10_10_10_REV as format, * the gl_InstanceID is incremented by the 2 bit component of the attrib. * Ignore gl_InstanceID then. */ @@ -115,8 +115,11 @@ flat in int resourceIDFrag; # define resource_id resourceIDFrag #endif -#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC) && \ - !defined(INSTANCED_ATTRIB) +#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD) && !defined(GPU_DEPRECATED_NVIDIA) +# define USE_INDEXED_MODELMAT +#endif + +#if defined(USE_INDEXED_MODELMAT) && !defined(OS_MAC) && !defined(INSTANCED_ATTRIB) struct ObjectMatrices { mat4 drw_modelMatrix; mat4 drw_modelMatrixInverse; 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"); -- cgit v1.2.3