diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-07-23 13:08:19 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2015-07-23 13:10:38 +0300 |
commit | 1788293a0125e178cf7cbea60113ae7d81749cbe (patch) | |
tree | 67ad443a304257fa8959b61eaa9efb6811925e6f /intern | |
parent | cc5d48e8dd9b96c151e0f1dd1e71e6de7231a95f (diff) |
Fix T45381: Crash Blender 2.75 in Win7 x64 AMD card
Previous fix didn't work well enough because on Windows Python has different
environment than Blender ans setting variables in there made no effect from
Blender point of view.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/addon/engine.py | 7 | ||||
-rw-r--r-- | intern/cycles/blender/blender_python.cpp | 13 | ||||
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 22 |
3 files changed, 31 insertions, 11 deletions
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index db81cbbcd9b..c936b900d75 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -44,9 +44,10 @@ def _is_using_buggy_driver(): 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" + import _cycles + if hasattr(_cycles, "opencl_disable"): + print("Cycles: OpenGL driver known to be buggy, disabling OpenCL platform.") + _cycles.opencl_disable() def init(): import bpy diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 200003fbf70..5da018ea36e 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -22,6 +22,7 @@ #include "blender_session.h" #include "util_foreach.h" +#include "util_logging.h" #include "util_md5.h" #include "util_opengl.h" #include "util_path.h" @@ -486,6 +487,15 @@ static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/) return PyUnicode_FromString(system_info.c_str()); } +#ifdef WITH_OPENCL +static PyObject *opencl_disable_func(PyObject * /*self*/, PyObject * /*value*/) +{ + VLOG(2) << "Disabling OpenCL platform."; + setenv("CYCLES_OPENCL_TEST", "NONE", 1); + Py_RETURN_NONE; +} +#endif + static PyMethodDef methods[] = { {"init", init_func, METH_VARARGS, ""}, {"create", create_func, METH_VARARGS, ""}, @@ -501,6 +511,9 @@ static PyMethodDef methods[] = { #endif {"available_devices", available_devices_func, METH_NOARGS, ""}, {"system_info", system_info_func, METH_NOARGS, ""}, +#ifdef WITH_OPENCL + {"opencl_disable", opencl_disable_func, METH_NOARGS, ""}, +#endif {NULL, NULL, 0, NULL}, }; diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp index 2a596a288bf..0cc49e846cc 100644 --- a/intern/cycles/device/device_opencl.cpp +++ b/intern/cycles/device/device_opencl.cpp @@ -3610,16 +3610,22 @@ bool device_opencl_init(void) initialized = true; - int clew_result = clewInit(); - if(clew_result == CLEW_SUCCESS) { - VLOG(1) << "CLEW initialization succeeded."; - result = true; + if(opencl_device_type() != 0) { + int clew_result = clewInit(); + if(clew_result == CLEW_SUCCESS) { + VLOG(1) << "CLEW initialization succeeded."; + result = true; + } + else { + VLOG(1) << "CLEW initialization failed: " + << ((clew_result == CLEW_ERROR_ATEXIT_FAILED) + ? "Error setting up atexit() handler" + : "Error opening the library"); + } } else { - VLOG(1) << "CLEW initialization failed: " - << ((clew_result == CLEW_ERROR_ATEXIT_FAILED) - ? "Error setting up atexit() handler" - : "Error opening the library"); + VLOG(1) << "Skip initializing CLEW, platform is force disabled."; + result = false; } return result; |