Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/blender/blender_python.cpp
| Show All 31 Lines | |||||
| #include "osl.h" | #include "osl.h" | ||||
| #include <OSL/oslquery.h> | #include <OSL/oslquery.h> | ||||
| #include <OSL/oslconfig.h> | #include <OSL/oslconfig.h> | ||||
| #endif | #endif | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| static void *pylong_as_voidptr_typesafe(PyObject *object) | namespace { | ||||
| /* Flag describing whether debug flags were synchronized from scene. */ | |||||
| bool debug_flags_set = false; | |||||
| void *pylong_as_voidptr_typesafe(PyObject *object) | |||||
| { | { | ||||
| if(object == Py_None) | if(object == Py_None) | ||||
| return NULL; | return NULL; | ||||
| return PyLong_AsVoidPtr(object); | return PyLong_AsVoidPtr(object); | ||||
| } | } | ||||
| /* Synchronize debug flags from a given Blender scene. | |||||
| * Return truth when device list needs invalidation. | |||||
| */ | |||||
| bool debug_flags_sync_from_scene(BL::Scene b_scene) | |||||
| { | |||||
| DebugFlagsRef flags = DebugFlags(); | |||||
| PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); | |||||
| /* Backup some settings for comparison. */ | |||||
| DebugFlags::OpenCL::DeviceType opencl_device_type = flags.opencl.device_type; | |||||
| /* Synchronize CPU flags. */ | |||||
| flags.cpu.avx2 = get_boolean(cscene, "debug_use_cpu_avx2"); | |||||
| flags.cpu.avx = get_boolean(cscene, "debug_use_cpu_avx"); | |||||
| flags.cpu.sse41 = get_boolean(cscene, "debug_use_cpu_sse41"); | |||||
| flags.cpu.sse3 = get_boolean(cscene, "debug_use_cpu_sse3"); | |||||
| flags.cpu.sse2 = get_boolean(cscene, "debug_use_cpu_sse2"); | |||||
| /* Synchronize OpenCL kernel type. */ | |||||
| switch(get_enum(cscene, "debug_opencl_kernel_type")) { | |||||
| case 0: | |||||
| flags.opencl.kernel_type = DebugFlags::OpenCL::KERNEL_DEFAULT; | |||||
| break; | |||||
| case 1: | |||||
| flags.opencl.kernel_type = DebugFlags::OpenCL::KERNEL_MEGA; | |||||
| break; | |||||
| case 2: | |||||
| flags.opencl.kernel_type = DebugFlags::OpenCL::KERNEL_SPLIT; | |||||
| break; | |||||
| } | |||||
| /* Synchronize OpenCL device type. */ | |||||
| switch(get_enum(cscene, "debug_opencl_device_type")) { | |||||
| case 0: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_NONE; | |||||
| break; | |||||
| case 1: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_ALL; | |||||
| break; | |||||
| case 2: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_DEFAULT; | |||||
| break; | |||||
| case 3: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_CPU; | |||||
| break; | |||||
| case 4: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_GPU; | |||||
| break; | |||||
| case 5: | |||||
| flags.opencl.device_type = DebugFlags::OpenCL::DEVICE_ACCELERATOR; | |||||
| break; | |||||
| } | |||||
| /* Synchronize other OpenCL flags. */ | |||||
| flags.opencl.debug = get_boolean(cscene, "debug_use_opencl_debug"); | |||||
| return flags.opencl.device_type != opencl_device_type; | |||||
| } | |||||
| /* Reset debug flags to default values. | |||||
| * Return truth when device list needs invalidation. | |||||
| */ | |||||
| bool debug_flags_reset() | |||||
| { | |||||
| DebugFlagsRef flags = DebugFlags(); | |||||
| /* Backup some settings for comparison. */ | |||||
| DebugFlags::OpenCL::DeviceType opencl_device_type = flags.opencl.device_type; | |||||
| flags.reset(); | |||||
| return flags.opencl.device_type != opencl_device_type; | |||||
| } | |||||
| } /* namespace */ | |||||
| void python_thread_state_save(void **python_thread_state) | void python_thread_state_save(void **python_thread_state) | ||||
| { | { | ||||
| *python_thread_state = (void*)PyEval_SaveThread(); | *python_thread_state = (void*)PyEval_SaveThread(); | ||||
| } | } | ||||
| void python_thread_state_restore(void **python_thread_state) | void python_thread_state_restore(void **python_thread_state) | ||||
| { | { | ||||
| PyEval_RestoreThread((PyThreadState*)*python_thread_state); | PyEval_RestoreThread((PyThreadState*)*python_thread_state); | ||||
| Show All 29 Lines | static PyObject *init_func(PyObject * /*self*/, PyObject *args) | ||||
| PyObject *path_coerce = NULL, *user_path_coerce = NULL; | PyObject *path_coerce = NULL, *user_path_coerce = NULL; | ||||
| path_init(PyC_UnicodeAsByte(path, &path_coerce), | path_init(PyC_UnicodeAsByte(path, &path_coerce), | ||||
| PyC_UnicodeAsByte(user_path, &user_path_coerce)); | PyC_UnicodeAsByte(user_path, &user_path_coerce)); | ||||
| Py_XDECREF(path_coerce); | Py_XDECREF(path_coerce); | ||||
| Py_XDECREF(user_path_coerce); | Py_XDECREF(user_path_coerce); | ||||
| BlenderSession::headless = headless; | BlenderSession::headless = headless; | ||||
| VLOG(2) << "Debug flags initialized to:\n" | |||||
| << DebugFlags(); | |||||
| Py_RETURN_NONE; | Py_RETURN_NONE; | ||||
| } | } | ||||
| static PyObject *create_func(PyObject * /*self*/, PyObject *args) | static PyObject *create_func(PyObject * /*self*/, PyObject *args) | ||||
| { | { | ||||
| PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d; | PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d; | ||||
| int preview_osl; | int preview_osl; | ||||
| ▲ Show 20 Lines • Show All 386 Lines • ▼ Show 20 Lines | static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/) | ||||
| string system_info = Device::device_capabilities(); | string system_info = Device::device_capabilities(); | ||||
| return PyUnicode_FromString(system_info.c_str()); | return PyUnicode_FromString(system_info.c_str()); | ||||
| } | } | ||||
| #ifdef WITH_OPENCL | #ifdef WITH_OPENCL | ||||
| static PyObject *opencl_disable_func(PyObject * /*self*/, PyObject * /*value*/) | static PyObject *opencl_disable_func(PyObject * /*self*/, PyObject * /*value*/) | ||||
| { | { | ||||
| VLOG(2) << "Disabling OpenCL platform."; | VLOG(2) << "Disabling OpenCL platform."; | ||||
| #ifdef WIN32 | DebugFlags().opencl.device_type = DebugFlags::OpenCL::DEVICE_NONE; | ||||
| putenv("CYCLES_OPENCL_TEST=NONE"); | |||||
| #else | |||||
| setenv("CYCLES_OPENCL_TEST", "NONE", 1); | |||||
| #endif | |||||
| Py_RETURN_NONE; | Py_RETURN_NONE; | ||||
| } | } | ||||
| #endif | #endif | ||||
| static PyObject *debug_flags_update_func(PyObject * /*self*/, PyObject *args) | |||||
| { | |||||
| PyObject *pyscene; | |||||
| if(!PyArg_ParseTuple(args, "O", &pyscene)) { | |||||
| return NULL; | |||||
| } | |||||
| PointerRNA sceneptr; | |||||
| RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr); | |||||
| BL::Scene b_scene(sceneptr); | |||||
| if(debug_flags_sync_from_scene(b_scene)) { | |||||
| VLOG(2) << "Tagging device list for update."; | |||||
| Device::tag_update(); | |||||
| } | |||||
| VLOG(2) << "Debug flags set to:\n" | |||||
| << DebugFlags(); | |||||
| debug_flags_set = true; | |||||
| Py_RETURN_NONE; | |||||
| } | |||||
| static PyObject *debug_flags_reset_func(PyObject * /*self*/, PyObject * /*args*/) | |||||
| { | |||||
| if(debug_flags_reset()) { | |||||
| VLOG(2) << "Tagging device list for update."; | |||||
| Device::tag_update(); | |||||
| } | |||||
| if(debug_flags_set) { | |||||
| VLOG(2) << "Debug flags reset to:\n" | |||||
| << DebugFlags(); | |||||
| debug_flags_set = false; | |||||
| } | |||||
| Py_RETURN_NONE; | |||||
| } | |||||
| static PyMethodDef methods[] = { | static PyMethodDef methods[] = { | ||||
| {"init", init_func, METH_VARARGS, ""}, | {"init", init_func, METH_VARARGS, ""}, | ||||
| {"create", create_func, METH_VARARGS, ""}, | {"create", create_func, METH_VARARGS, ""}, | ||||
| {"free", free_func, METH_O, ""}, | {"free", free_func, METH_O, ""}, | ||||
| {"render", render_func, METH_O, ""}, | {"render", render_func, METH_O, ""}, | ||||
| {"bake", bake_func, METH_VARARGS, ""}, | {"bake", bake_func, METH_VARARGS, ""}, | ||||
| {"draw", draw_func, METH_VARARGS, ""}, | {"draw", draw_func, METH_VARARGS, ""}, | ||||
| {"sync", sync_func, METH_O, ""}, | {"sync", sync_func, METH_O, ""}, | ||||
| {"reset", reset_func, METH_VARARGS, ""}, | {"reset", reset_func, METH_VARARGS, ""}, | ||||
| #ifdef WITH_OSL | #ifdef WITH_OSL | ||||
| {"osl_update_node", osl_update_node_func, METH_VARARGS, ""}, | {"osl_update_node", osl_update_node_func, METH_VARARGS, ""}, | ||||
| {"osl_compile", osl_compile_func, METH_VARARGS, ""}, | {"osl_compile", osl_compile_func, METH_VARARGS, ""}, | ||||
| #endif | #endif | ||||
| {"available_devices", available_devices_func, METH_NOARGS, ""}, | {"available_devices", available_devices_func, METH_NOARGS, ""}, | ||||
| {"system_info", system_info_func, METH_NOARGS, ""}, | {"system_info", system_info_func, METH_NOARGS, ""}, | ||||
| #ifdef WITH_OPENCL | #ifdef WITH_OPENCL | ||||
| {"opencl_disable", opencl_disable_func, METH_NOARGS, ""}, | {"opencl_disable", opencl_disable_func, METH_NOARGS, ""}, | ||||
| #endif | #endif | ||||
| {"debug_flags_update", debug_flags_update_func, METH_VARARGS, ""}, | |||||
| {"debug_flags_reset", debug_flags_reset_func, METH_NOARGS, ""}, | |||||
| {NULL, NULL, 0, NULL}, | {NULL, NULL, 0, NULL}, | ||||
| }; | }; | ||||
| static struct PyModuleDef module = { | static struct PyModuleDef module = { | ||||
| PyModuleDef_HEAD_INIT, | PyModuleDef_HEAD_INIT, | ||||
| "_cycles", | "_cycles", | ||||
| "Blender cycles render integration", | "Blender cycles render integration", | ||||
| -1, | -1, | ||||
| ▲ Show 20 Lines • Show All 108 Lines • Show Last 20 Lines | |||||