11 #ifndef __CE_SnippetKernelBind__
12 #define __CE_SnippetKernelBind__
24 template <CE_Precision PREC,
typename OP>
41 template <
typename OP>
54 for (
auto && binding : bindings)
62 UT_ASSERT(!
"This should have been handled");
65 ok &= setKernelArgument<CE_16, OP>(binding, p, kernel, argidx, owned_buffers, referenced_buffers, timestep, error, missingseverity,
op);
68 ok &= setKernelArgument<CE_32, OP>(binding, p, kernel, argidx, owned_buffers, referenced_buffers, timestep, error, missingseverity,
op);
71 ok &= setKernelArgument<CE_64, OP>(binding, p, kernel, argidx, owned_buffers, referenced_buffers, timestep, error, missingseverity,
op);
84 int pidx,
const char *
type,
87 template <
typename TYPE>
90 const char *
name,
const char *
type,
int pidx,
92 const char *extra = 0)
96 kernel.
setArg( argidx, tuplesize *
sizeof(TYPE), val);
110 const char *extra = 0)
111 {
bindKernelArgRaw(&val, 1, kernel, argidx, name,
"int", pidx, error, extra); }
114 const char *extra = 0)
115 {
bindKernelArgRaw(val, 2, kernel, argidx, name,
"int2", pidx, error, extra); }
118 const char *extra = 0)
119 {
bindKernelArgRaw(val, 4, kernel, argidx, name,
"int4", pidx, error, extra); }
122 const char *extra = 0)
123 {
bindKernelArgRaw(&val, 1, kernel, argidx, name,
"float", pidx, error, extra); }
126 const char *extra = 0)
127 {
bindKernelArgRaw(val, 2, kernel, argidx, name,
"float2", pidx, error, extra); }
131 const char *extra = 0)
132 {
bindKernelArgRaw(val, 4, kernel, argidx, name,
"float3", pidx, error, extra); }
135 const char *extra = 0)
136 {
bindKernelArgRaw(val, 4, kernel, argidx, name,
"float4", pidx, error, extra); }
139 const char *extra = 0)
140 {
bindKernelArgRaw(val, 16, kernel, argidx, name,
"float16", pidx, error, extra); }
142 const char *
name,
int pidx,
const char *
type,
144 const char *extra = 0)
148 kernel.
setArg( argidx, val);
159 template <CE_Precision PREC,
typename OP>
185 paramtype = binding.
type;
192 param_int = binding.
intval;
194 kernel, argidx, binding.
name,
"int", p, error);
200 const int tuplesize = 1;
203 array.
entries(array_size * tuplesize);
206 for (
int i = 0; i <
n; i++)
209 const size_t array_data_size = array_size * tuplesize *
sizeof(
CEintH<PREC> );
213 array_buffer = clcontext->
allocBuffer(array_data_size);
217 owned_buffers.
append(array_buffer);
228 param_float = binding.
fval;
236 param_float *= timestep;
239 param_float /= timestep;
242 param_float = SYSexp( param_float * timestep );
249 kernel, argidx, binding.
name,
"float", p, error);
255 param_float2 = binding.
v2val;
256 param_fpreal_array[0] = param_float2(0);
257 param_fpreal_array[1] = param_float2(1);
260 kernel, argidx, binding.
name,
"float2", p, error);
265 param_float3 = binding.
v3val;
266 param_fpreal_array[0] = param_float3(0);
267 param_fpreal_array[1] = param_float3(1);
268 param_fpreal_array[2] = param_float3(2);
269 param_fpreal_array[3] = 0;
272 kernel, argidx, binding.
name,
"float3", p, error);
277 param_float4 = binding.
v4val;
278 param_fpreal_array[0] = param_float4(0);
279 param_fpreal_array[1] = param_float4(1);
280 param_fpreal_array[2] = param_float4(2);
281 param_fpreal_array[3] = param_float4(3);
283 kernel, argidx, binding.
name,
"float4", p, error);
288 param_float4 = binding.
v4val;
289 param_fpreal_array[0] = param_float4(0);
290 param_fpreal_array[1] = param_float4(1);
291 param_fpreal_array[2] = param_float4(2);
292 param_fpreal_array[3] = param_float4(3);
293 param_float4 = binding.
v4bval;
294 param_fpreal_array[4+0] = param_float4(0);
295 param_fpreal_array[4+1] = param_float4(1);
296 param_fpreal_array[4+2] = param_float4(2);
297 param_fpreal_array[4+3] = param_float4(3);
299 kernel, argidx, binding.
name,
"float8", p, error);
305 for (
int r = 0;
r < 4;
r++)
306 for (
int c = 0;
c < 4;
c++)
307 param_fpreal_array[
r*4+
c] = binding.
m4val(
r,
c);
309 kernel, argidx, binding.
name,
"float8", p, error);
318 const size_t ramp_data_size = ramp_size * tuplesize *
sizeof(
CEfloatH<PREC> );
330 if (ramp_buffer() != 0)
332 referenced_buffers.
append(ramp_buffer);
336 if (ramp_buffer() == 0)
339 ramp_array.
entries(ramp_size * tuplesize);
344 for (
int i = 0; i < ramp_size; i++)
348 binding.
ramp->rampLookup( pos, values );
349 for (
int j = 0;
j < tuplesize;
j++)
350 ramp_array(writepos++) = values[
j];
357 for (
int i = 0; i <
n; i++)
358 ramp_array(i) = binding.
rampdata(i);
359 for (
int i = n; i < ramp_array.
entries(); i++)
367 ramp_buffer = clcontext->
allocBuffer(ramp_data_size);
377 referenced_buffers.
append(ramp_buffer);
384 owned_buffers.
append(ramp_buffer);
399 if (!
op(binding, p, kernel, argidx, error, PREC))
418 if (!
op(binding, p, kernel, argidx, error, PREC))
431 if (!isarray && binding.
defval)
436 param_int = binding.
intval;
438 kernel, argidx, binding.
name,
"int", p, error);
440 else if (tuplesize == 2)
442 param_float2 = binding.
v2val;
443 param_fpreal_array[0] = param_float2(0);
444 param_fpreal_array[1] = param_float2(1);
447 kernel, argidx, binding.
name,
"float2", p, error);
449 else if (tuplesize == 3)
452 param_float3 = binding.
v3val;
453 param_fpreal_array[0] = param_float3(0);
454 param_fpreal_array[1] = param_float3(1);
455 param_fpreal_array[2] = param_float3(2);
456 param_fpreal_array[3] = 0;
459 kernel, argidx, binding.
name,
"float3", p, error);
461 else if (tuplesize == 4)
464 param_float4 = binding.
v4val;
465 param_fpreal_array[0] = param_float4(0);
466 param_fpreal_array[1] = param_float4(1);
467 param_fpreal_array[2] = param_float4(2);
468 param_fpreal_array[3] = param_float4(3);
470 kernel, argidx, binding.
name,
"float4", p, error);
475 param_float = binding.
fval;
477 kernel, argidx, binding.
name,
"float", p, error);
493 if (!
op(binding, p, kernel, argidx, error, PREC))
500 param_float = binding.
fval;
502 kernel, argidx, binding.
name,
"float", p, error);
509 msg.
sprintf(
"Invalid volume '%s'", (
const char *) binding.
volume);
524 if (!
op(binding, p, kernel, argidx, error, PREC))
529 msg.
sprintf(
"Invalid vdb '%s'", (
const char *) binding.
volume);
539 param_float = binding.
fval;
541 kernel, argidx, binding.
name,
"float", p, error);
552 bool defval = binding.
defval;
557 if (!
op(binding, p, kernel, argidx, error, PREC))
575 param_int = binding.
intval;
577 kernel, argidx, binding.
name,
"int", p, error);
579 else if (tuplesize == 2)
581 param_float2 = binding.
v2val;
582 param_fpreal_array[0] = param_float2(0);
583 param_fpreal_array[1] = param_float2(1);
586 kernel, argidx, binding.
name,
"float2", p, error);
588 else if (tuplesize == 3)
591 param_float3 = binding.
v3val;
592 param_fpreal_array[0] = param_float3(0);
593 param_fpreal_array[1] = param_float3(1);
594 param_fpreal_array[2] = param_float3(2);
595 param_fpreal_array[3] = 0;
598 kernel, argidx, binding.
name,
"float3", p, error);
600 else if (tuplesize == 4)
603 param_float4 = binding.
v4val;
604 param_fpreal_array[0] = param_float4(0);
605 param_fpreal_array[1] = param_float4(1);
606 param_fpreal_array[2] = param_float4(2);
607 param_fpreal_array[3] = param_float4(3);
609 kernel, argidx, binding.
name,
"float4", p, error);
614 param_float = binding.
fval;
616 kernel, argidx, binding.
name,
"float", p, error);
628 bool defval = binding.
defval;
631 if (!
op(binding, p, kernel, argidx, error, PREC))
636 msg.
sprintf(
"Invalid image '%s'", (
const char *) binding.
name);
648 param_int = binding.
intval;
650 kernel, argidx, binding.
name,
"int", p, error);
653 param_float = binding.
fval;
655 kernel, argidx, binding.
name,
"float", p, error);
658 param_fpreal_array[0] = binding.
v2val(0);
659 param_fpreal_array[1] = binding.
v2val(1);
661 kernel, argidx, binding.
name,
"float2", p, error);
664 param_fpreal_array[0] = binding.
v3val(0);
665 param_fpreal_array[1] = binding.
v3val(1);
666 param_fpreal_array[2] = binding.
v3val(2);
667 param_fpreal_array[3] = 0;
669 kernel, argidx, binding.
name,
"float3", p, error);
672 param_fpreal_array[0] = binding.
v4val(0);
673 param_fpreal_array[1] = binding.
v4val(1);
674 param_fpreal_array[2] = binding.
v4val(2);
675 param_fpreal_array[3] = binding.
v4val(3);
677 kernel, argidx, binding.
name,
"float4", p, error);
UT_StringHolder attribute
UT_StringHolder fieldname
void bindKernelArgB(cl::Buffer val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, const char *type, UT_ErrorManager *error, const char *extra=0)
typename CE_PrecisionResolver< P >::host_int_type CEintH
SYS_FORCE_INLINE const char * buffer() const
CE_API void reportSetArgError(const char *name, int argidx, int pidx, const char *type, const char *extra, UT_ErrorManager *error)
Adds an error to the error manager for mis-binding an argument.
void bindKernelArgF(cl_float val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
typename CE_PrecisionResolver< P >::host_float_type CEfloatH
void writeBuffer(const cl::Buffer &buf, size_t size, const void *p, bool blocking=true, size_t offset=0)
Write the specified number of bytes to the buffer.
UT_StringHolder optionname
void bindKernelArgV2(cl_float *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
UT_Vector2D UT_Vector3D v3val
GLint GLint GLsizei GLint GLenum GLenum type
void bindKernelArgV3(cl_float *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
NOTE: This binds float4 due to vagaries of cl!
static CE_Context * getContext(bool gl_shared=true, bool shared_fallback=true)
BindingOptionType optiontype
void bindKernelArgI4(cl_int *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
BindingLayerType layertype
CE_API CE_RampCache * CEgetRampCache()
bool setKernelArgument(const Binding &binding, int p, cl::Kernel &kernel, int &argidx, UT_Array< cl::Buffer > &owned_buffers, UT_Array< cl::Buffer > &referenced_buffers, fpreal timestep, UT_ErrorManager *error, UT_ErrorSeverity missingseverity, const OP &op)
}
cl::Buffer lookupRamp(UT_SharedPtr< UT_Ramp > ramp, int tuplesize, int rampsize)
GLuint const GLchar * name
UT_SharedPtr< UT_Ramp > ramp
cl::Buffer allocBuffer(int64 size, bool use_pool=true, bool read=true, bool write=true, uint32 ogl_bind=SYS_UINT32_MAX)
int sprintf(const char *fmt,...) SYS_PRINTF_CHECK_ATTRIBUTE(2
GLenum GLint GLint * precision
exint entries() const
Alias of size(). size() is preferred.
void bindKernelArgI(cl_int val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
void bindKernelArgI2(cl_int *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
BindingAttribType attribtype
GLenum GLsizei GLsizei GLint * values
bool setKernelArguments(const UT_Array< Binding > &bindings, BindingPrecision nodeprecision, cl::Kernel &kernel, int &argidx, UT_Array< cl::Buffer > &owned_buffers, UT_Array< cl::Buffer > &referenced_buffers, fpreal timestep, UT_ErrorManager *error, UT_ErrorSeverity missingseverity, const OP &op)
void bindKernelArgV4(cl_float *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
void cacheRamp(cl::Buffer buffer, UT_SharedPtr< UT_Ramp > ramp, int tuplesize, int rampsize)
Adds to the cache.
A global error manager scope.
void constant(const T &v)
Quickly set the array to a single value.
void bindKernelArgV16(cl_float *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
cl_int setArg(cl_uint index, T value)
UT_Array< float > rampdata
Kernel interface that implements cl_kernel.
void bindKernelArgRaw(TYPE *val, int tuplesize, cl::Kernel &kernel, int &argidx, const char *name, const char *type, int pidx, UT_ErrorManager *error, const char *extra=0)
UT_ErrorSeverity addGeneric(const char *type, int code, const char *msg, UT_ErrorSeverity sev, const UT_SourceLocation *loc=0)
BindingTimescale timescale