From 1788293a0125e178cf7cbea60113ae7d81749cbe Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 23 Jul 2015 12:08:19 +0200 Subject: [PATCH] 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. --- intern/cycles/blender/addon/engine.py | 7 ++++--- intern/cycles/blender/blender_python.cpp | 13 +++++++++++++ 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;