Commit: a4e08e7187a15a732dabe07cdeea1c83f1e17dbd
Author: Sergey Sharybin
Date:   Sat May 9 00:54:33 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rBa4e08e7187a15a732dabe07cdeea1c83f1e17dbd

Cycles kernel split: Use more friendly way of setting kernel args

It is now possible to do CUDA-like kernel argument set using utility
kernel_set_args() function which accepts quite reasonable amount of
arguments. It's possible to pass fewer arguments tho.

For now only used in split kernel code, but it is to be used more.

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

M       intern/cycles/device/device_opencl.cpp

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

diff --git a/intern/cycles/device/device_opencl.cpp 
b/intern/cycles/device/device_opencl.cpp
index 88c2fbc..3113086 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1084,6 +1084,104 @@ public:
                        task.update_progress(NULL);
                }
        }
+
+protected:
+       class ArgumentWrapper {
+       public:
+               ArgumentWrapper() : size(0), pointer(NULL) {}
+               template <typename T>
+               ArgumentWrapper(T& argument) : size(sizeof(argument)),
+                                              pointer(&argument) { }
+               size_t size;
+               void *pointer;
+       };
+
+       int kernel_set_args(cl_kernel kernel,
+                           int start_argument_index,
+                           const ArgumentWrapper& arg1 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg2 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg3 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg4 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg5 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg6 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg7 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg8 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg9 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg10 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg11 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg12 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg13 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg14 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg15 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg16 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg17 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg18 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg19 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg20 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg21 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg22 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg23 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg24 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg25 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg26 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg27 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg28 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg29 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg30 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg31 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg32 = ArgumentWrapper(),
+                           const ArgumentWrapper& arg33 = ArgumentWrapper())
+       {
+               int current_arg_index = 0;
+#define FAKE_VARARG_HANDLE_ARG(arg) \
+               do { \
+                       if(arg.pointer != NULL) { \
+                               opencl_assert(clSetKernelArg( \
+                                       kernel, \
+                                       start_argument_index + 
current_arg_index, \
+                                       arg.size, arg.pointer)); \
+                               ++current_arg_index; \
+                       } \
+                       else { \
+                               return current_arg_index; \
+                       } \
+               } while(false)
+               FAKE_VARARG_HANDLE_ARG(arg1);
+               FAKE_VARARG_HANDLE_ARG(arg2);
+               FAKE_VARARG_HANDLE_ARG(arg3);
+               FAKE_VARARG_HANDLE_ARG(arg4);
+               FAKE_VARARG_HANDLE_ARG(arg5);
+               FAKE_VARARG_HANDLE_ARG(arg6);
+               FAKE_VARARG_HANDLE_ARG(arg7);
+               FAKE_VARARG_HANDLE_ARG(arg8);
+               FAKE_VARARG_HANDLE_ARG(arg9);
+               FAKE_VARARG_HANDLE_ARG(arg10);
+               FAKE_VARARG_HANDLE_ARG(arg11);
+               FAKE_VARARG_HANDLE_ARG(arg12);
+               FAKE_VARARG_HANDLE_ARG(arg13);
+               FAKE_VARARG_HANDLE_ARG(arg14);
+               FAKE_VARARG_HANDLE_ARG(arg15);
+               FAKE_VARARG_HANDLE_ARG(arg16);
+               FAKE_VARARG_HANDLE_ARG(arg17);
+               FAKE_VARARG_HANDLE_ARG(arg18);
+               FAKE_VARARG_HANDLE_ARG(arg19);
+               FAKE_VARARG_HANDLE_ARG(arg20);
+               FAKE_VARARG_HANDLE_ARG(arg21);
+               FAKE_VARARG_HANDLE_ARG(arg22);
+               FAKE_VARARG_HANDLE_ARG(arg23);
+               FAKE_VARARG_HANDLE_ARG(arg24);
+               FAKE_VARARG_HANDLE_ARG(arg25);
+               FAKE_VARARG_HANDLE_ARG(arg26);
+               FAKE_VARARG_HANDLE_ARG(arg27);
+               FAKE_VARARG_HANDLE_ARG(arg28);
+               FAKE_VARARG_HANDLE_ARG(arg29);
+               FAKE_VARARG_HANDLE_ARG(arg30);
+               FAKE_VARARG_HANDLE_ARG(arg31);
+               FAKE_VARARG_HANDLE_ARG(arg32);
+               FAKE_VARARG_HANDLE_ARG(arg33);
+#undef FAKE_VARARG_HANDLE_ARG
+               return current_arg_index;
+       }
 };
 
 class OpenCLDeviceMegaKernel : public OpenCLDeviceBase
@@ -2335,301 +2433,310 @@ public:
                cl_int total_num_rays = global_size[0] * global_size[1];
 
                /* Set arguments for ckPathTraceKernel_DataInit kernel */
-               cl_uint narg = 0;
-
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, kgbuffer);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, P_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, P_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, N_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, N_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, Ng_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, Ng_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, I_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, I_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, shader_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
shader_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, flag_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
flag_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, prim_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
prim_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, type_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
type_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, u_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, u_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, v_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, v_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, object_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
object_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, time_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
time_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, ray_length_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
ray_length_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, ray_depth_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
ray_depth_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
transparent_depth_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
transparent_depth_sd_DL_shadow);
+               cl_uint start_arg_index =
+                       kernel_set_args(ckPathTraceKernel_DataInit,
+                                       0,
+                                       kgbuffer,
+                                       sd,
+                                       sd_DL_shadow,
+                                       P_sd,
+                                       P_sd_DL_shadow,
+                                       N_sd,
+                                       N_sd_DL_shadow,
+                                       Ng_sd,
+                                       Ng_sd_DL_shadow,
+                                       I_sd,
+                                       I_sd_DL_shadow,
+                                       shader_sd,
+                                       shader_sd_DL_shadow,
+                                       flag_sd,
+                                       flag_sd_DL_shadow,
+                                       prim_sd,
+                                       prim_sd_DL_shadow,
+                                       type_sd,
+                                       type_sd_DL_shadow,
+                                       u_sd,
+                                       u_sd_DL_shadow,
+                                       v_sd,
+                                       v_sd_DL_shadow,
+                                       object_sd,
+                                       object_sd_DL_shadow,
+                                       time_sd,
+                                       time_sd_DL_shadow,
+                                       ray_length_sd,
+                                       ray_length_sd_DL_shadow,
+                                       ray_depth_sd,
+                                       ray_depth_sd_DL_shadow,
+                                       transparent_depth_sd,
+                                       transparent_depth_sd_DL_shadow);
+
+               start_arg_index +=
+                       kernel_set_args(ckPathTraceKernel_DataInit,
 #ifdef __RAY_DIFFERENTIALS__
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dP_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dP_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dI_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dI_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, du_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, du_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dv_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dv_sd_DL_shadow);
+                                       start_arg_index,
+                                       dP_sd,
+                                       dP_sd_DL_shadow,
+                                       dI_sd,
+                                       dI_sd_DL_shadow,
+                                       du_sd,
+                                       du_sd_DL_shadow,
+                                       dv_sd,
+                                       dv_sd_DL_shadow,
 #endif
 #ifdef __DPDU__
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dPdu_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
dPdu_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, dPdv_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
dPdv_sd_DL_shadow);
+                                       dPdu_sd,
+                                       dPdu_sd_DL_shadow,
+                                       dPdv_sd,
+                                       dPdv_sd_DL_shadow,
 #endif
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, closure_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
closure_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, num_closure_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
num_closure_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, randb_closure_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
randb_closure_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, ray_P_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
ray_P_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, ray_dP_sd);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, 
ray_dP_sd_DL_shadow);
-               KERNEL_APPEND_ARG(ckPathTraceKernel_DataInit, d_data);
-               KERNEL_APPEND_ARG(ckPathTrace

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to