[Bf-blender-cvs] [87d733f] cycles_split_kernel: Cycles: Ensure we get a compiler error if data_init parameters fall out of sync

Mai Lavelle noreply at git.blender.org
Wed Dec 7 04:27:05 CET 2016


Commit: 87d733f64bc716dee138d5a5171cb74bd92584c8
Author: Mai Lavelle
Date:   Tue Dec 6 21:40:48 2016 -0500
Branches: cycles_split_kernel
https://developer.blender.org/rB87d733f64bc716dee138d5a5171cb74bd92584c8

Cycles: Ensure we get a compiler error if data_init parameters fall out of sync

Code isn't so pretty and the errors that we get if this does happen are kind
of cryptic, but it's better than nothing.

===================================================================

M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/kernel/kernel.h
M	intern/cycles/kernel/kernels/cpu/kernel_cpu.h
M	intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
M	intern/cycles/kernel/split/kernel_data_init.h

===================================================================

diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 5bc8287..fac0296 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -727,9 +727,40 @@ protected:
                                    int buffer_stride,
                                    ccl_global float *buffer);
 
-		data_init_t data_init = get_kernel_function<data_init_t>("data_init");
-		if(!data_init) {
-			return false;
+		data_init_t data_init;
+
+#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX2
+		if(system_cpu_support_avx2()) {
+			data_init = kernel_cpu_avx2_data_init;
+		}
+		else
+#endif
+#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX
+		if(system_cpu_support_avx()) {
+			data_init = kernel_cpu_avx_data_init;
+		}
+		else
+#endif
+#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE41
+		if(system_cpu_support_sse41()) {
+			data_init = kernel_cpu_sse41_data_init;
+		}
+		else
+#endif
+#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
+		if(system_cpu_support_sse3()) {
+			data_init = kernel_cpu_sse3_data_init;
+		}
+		else
+#endif
+#ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
+		if(system_cpu_support_sse2()) {
+			data_init = kernel_cpu_sse2_data_init;
+		}
+		else
+#endif
+		{
+			data_init = kernel_cpu_data_init;
 		}
 
 		KernelGlobals *kg = (KernelGlobals*)kernel_globals.device_pointer;
diff --git a/intern/cycles/kernel/kernel.h b/intern/cycles/kernel/kernel.h
index bf0016a..cd339e6 100644
--- a/intern/cycles/kernel/kernel.h
+++ b/intern/cycles/kernel/kernel.h
@@ -20,6 +20,7 @@
 /* CPU Kernel Interface */
 
 #include "util_types.h"
+#include "kernel_types.h"
 
 CCL_NAMESPACE_BEGIN
 
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu.h
index 0271399..a503b8f 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu.h
@@ -49,6 +49,34 @@ void KERNEL_FUNCTION_FULL_NAME(shader)(KernelGlobals *kg,
                                        int offset,
                                        int sample);
 
+/* Split kernels */
+
+void KERNEL_FUNCTION_FULL_NAME(data_init)(
+        KernelGlobals *kg,
+        ccl_constant KernelData *data,
+        ccl_global void *split_data_buffer,
+        int num_elements,
+        ccl_global char *ray_state,
+        ccl_global uint *rng_state,
+        int start_sample,
+        int end_sample,
+        int sx, int sy, int sw, int sh, int offset, int stride,
+        int rng_state_offset_x,
+        int rng_state_offset_y,
+        int rng_state_stride,
+        ccl_global int *Queue_index,
+        int queuesize,
+        ccl_global char *use_queues_flag,
+#ifdef __WORK_STEALING__
+        ccl_global unsigned int *work_pool_wgs,
+        unsigned int num_samples,
+#endif
+        int parallel_samples,
+        int buffer_offset_x,
+        int buffer_offset_y,
+        int buffer_stride,
+        ccl_global float *buffer);
+
 #define DECLARE_SPLIT_KERNEL_FUNCTION(name) \
 	void KERNEL_FUNCTION_FULL_NAME(name)(KernelGlobals *kg, KernelData *data);
 
diff --git a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
index 8f5e329..c59f489 100644
--- a/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
+++ b/intern/cycles/kernel/kernels/cpu/kernel_cpu_impl.h
@@ -185,8 +185,7 @@ void KERNEL_FUNCTION_FULL_NAME(register_functions)(void(*reg)(const char* name,
 	REGISTER(convert_to_half_float);
 	REGISTER(shader);
 
-	reg(REGISTER_EVAL_NAME(KERNEL_FUNCTION_FULL_NAME(data_init)), (void*)kernel_data_init);
-
+	REGISTER(data_init);
 	REGISTER(scene_intersect);
 	REGISTER(lamp_emission);
 	REGISTER(queue_enqueue);
diff --git a/intern/cycles/kernel/split/kernel_data_init.h b/intern/cycles/kernel/split/kernel_data_init.h
index 81ec4d6..4ad172b 100644
--- a/intern/cycles/kernel/split/kernel_data_init.h
+++ b/intern/cycles/kernel/split/kernel_data_init.h
@@ -51,7 +51,11 @@ CCL_NAMESPACE_BEGIN
  * The number of elements in the queues is initialized to 0;
  */
 
+#ifndef __KERNEL_CPU__
 ccl_device void kernel_data_init(
+#else
+void KERNEL_FUNCTION_FULL_NAME(data_init)(
+#endif
         KernelGlobals *kg,
         ccl_constant KernelData *data,
         ccl_global void *split_data_buffer,




More information about the Bf-blender-cvs mailing list