Fix T45381: Crash Blender 2.75 in Win7 x64 AMD card
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 23 Jul 2015 10:08:19 +0000 (12:08 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 23 Jul 2015 10:10:38 +0000 (12:10 +0200)
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
intern/cycles/blender/blender_python.cpp
intern/cycles/device/device_opencl.cpp

index db81cbbcd9b24b576c02d9bc9f3be94c23bb03e5..c936b900d75963e1942f2b724993f02b8ceb1889 100644 (file)
@@ -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
index 200003fbf7076ff625a781a71ab85fd263b7f5e3..5da018ea36eb0163da89058f0e21a4292b4fa190 100644 (file)
@@ -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},
 };
 
index 2a596a288bf78e46c02ed7c36e1f76abab0032a7..0cc49e846cc7b5f7b589b3b3b6bae5cc804ddd56 100644 (file)
@@ -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;