diff options
-rw-r--r-- | intern/cycles/blender/addon/engine.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 4187e2381ac..db81cbbcd9b 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -17,11 +17,55 @@ # <pep8 compliant> +def _is_using_buggy_driver(): + import bgl + # We need to be conservative here because in multi-GPU systems display card + # might be quite old, but others one might be just good. + # + # So We shouldn't disable possible good dedicated cards just because display + # card seems weak. And instead we only blacklist configurations which are + # proven to cause problems. + if bgl.glGetString(bgl.GL_VENDOR) == "ATI Technologies Inc.": + import re + version = bgl.glGetString(bgl.GL_VERSION) + if version.endswith("Compatibility Profile Context"): + # Old HD 4xxx and 5xxx series drivers did not have driver version + # in the version string, but thsoe cards do not quite work and + # cusing crashes. + return True + regex = re.compile(".*Compatibility Profile Context ([0-9]+(\.[0-9]+)+)$") + if not regex.match(version): + # Skip cards like FireGL + return False + version = regex.sub("\\1", version).split('.') + return int(version[0]) == 8 + return False + + +def _workaround_buggy_drivers(): + if _is_using_buggy_driver(): + import os + print("Cycles: OpenGL driver known to be buggy, disabling OpenCL platform.") + os.environ["CYCLES_OPENCL_TEST"] = "NONE" + def init(): import bpy import _cycles import os.path + # Workaroud posibly buggy legacy drivers which crashes on the OpenCL + # device enumeration. + # + # This checks are not really correct because they might still fail + # in the case of multiple GPUs. However, currently buggy drivers + # are really old and likely to be used in single GPU systems only + # anyway. + # + # Can't do it in the background mode, so we hope OpenCL is no enabled + # in the user preferences. + if not bpy.app.background: + _workaround_buggy_drivers() + path = os.path.dirname(__file__) user_path = os.path.dirname(os.path.abspath(bpy.utils.user_resource('CONFIG', ''))) |