diff options
Diffstat (limited to 'intern/cycles/device/opencl')
-rw-r--r-- | intern/cycles/device/opencl/opencl.h | 1 | ||||
-rw-r--r-- | intern/cycles/device/opencl/opencl_split.cpp | 21 | ||||
-rw-r--r-- | intern/cycles/device/opencl/opencl_util.cpp | 5 |
3 files changed, 19 insertions, 8 deletions
diff --git a/intern/cycles/device/opencl/opencl.h b/intern/cycles/device/opencl/opencl.h index 14e1db7a7aa..1c47dd18c2d 100644 --- a/intern/cycles/device/opencl/opencl.h +++ b/intern/cycles/device/opencl/opencl.h @@ -90,6 +90,7 @@ public: cl_device_id device_id); static void get_usable_devices(vector<OpenCLPlatformDevice> *usable_devices, bool force_all = false); + static bool use_single_program(); }; /* Thread safe cache for contexts and programs. diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp index be931599e39..4c6c9387864 100644 --- a/intern/cycles/device/opencl/opencl_split.cpp +++ b/intern/cycles/device/opencl/opencl_split.cpp @@ -77,16 +77,18 @@ public: virtual bool load_kernels(const DeviceRequestedFeatures& requested_features, vector<OpenCLDeviceBase::OpenCLProgram*> &programs) { + bool single_program = OpenCLInfo::use_single_program(); program_data_init = OpenCLDeviceBase::OpenCLProgram(this, - "split_data_init", - "kernel_data_init.cl", + single_program ? "split" : "split_data_init", + single_program ? "kernel_split.cl" : "kernel_data_init.cl", get_build_options(this, requested_features)); + program_data_init.add_kernel(ustring("path_trace_data_init")); programs.push_back(&program_data_init); program_state_buffer_size = OpenCLDeviceBase::OpenCLProgram(this, - "split_state_buffer_size", - "kernel_state_buffer_size.cl", + single_program ? "split" : "split_state_buffer_size", + single_program ? "kernel_split.cl" : "kernel_state_buffer_size.cl", get_build_options(this, requested_features)); program_state_buffer_size.add_kernel(ustring("path_trace_state_buffer_size")); programs.push_back(&program_state_buffer_size); @@ -209,10 +211,13 @@ public: { OpenCLSplitKernelFunction* kernel = new OpenCLSplitKernelFunction(device); - kernel->program = OpenCLDeviceBase::OpenCLProgram(device, - "split_" + kernel_name, - "kernel_" + kernel_name + ".cl", - get_build_options(device, requested_features)); + bool single_program = OpenCLInfo::use_single_program(); + kernel->program = + OpenCLDeviceBase::OpenCLProgram(device, + single_program ? "split" : "split_" + kernel_name, + single_program ? "kernel_split.cl" : "kernel_" + kernel_name + ".cl", + get_build_options(device, requested_features)); + kernel->program.add_kernel(ustring("path_trace_" + kernel_name)); kernel->program.load(); diff --git a/intern/cycles/device/opencl/opencl_util.cpp b/intern/cycles/device/opencl/opencl_util.cpp index d5c19bf5386..e2d0ff71786 100644 --- a/intern/cycles/device/opencl/opencl_util.cpp +++ b/intern/cycles/device/opencl/opencl_util.cpp @@ -552,6 +552,11 @@ bool OpenCLInfo::use_debug() return DebugFlags().opencl.debug; } +bool OpenCLInfo::use_single_program() +{ + return DebugFlags().opencl.single_program; +} + bool OpenCLInfo::kernel_use_advanced_shading(const string& platform) { /* keep this in sync with kernel_types.h! */ |