diff options
-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; |