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:
authorClément Foucault <foucault.clem@gmail.com>2019-12-03 17:22:02 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-12-05 13:16:29 +0300
commitcf77b67c459d481f6d8d34d13e14d22a6cad0842 (patch)
tree47475c5b16a0f3a2ffc1d22766e48acdc91f22eb /source/blender/gpu
parent6ba09f8515bd7968d8f1ef13ff19b5c05898660e (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.h1
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c15
-rw-r--r--source/blender/gpu/intern/gpu_shader.c5
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");