Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-07-23 13:08:19 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-07-23 13:10:38 +0300
commit1788293a0125e178cf7cbea60113ae7d81749cbe (patch)
tree67ad443a304257fa8959b61eaa9efb6811925e6f
parentcc5d48e8dd9b96c151e0f1dd1e71e6de7231a95f (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.
-rw-r--r--intern/cycles/blender/addon/engine.py7
-rw-r--r--intern/cycles/blender/blender_python.cpp13
-rw-r--r--intern/cycles/device/device_opencl.cpp22
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;