11 #ifndef __CE_SnippetKernelBind__
12 #define __CE_SnippetKernelBind__
22 template <CE_Precision PREC,
typename OP>
38 template <
typename OP>
50 for (
auto && binding : bindings)
58 UT_ASSERT(!
"This should have been handled");
61 ok &= setKernelArgument<CE_16, OP>(binding, p, kernel, argidx,
buffers, timestep, error, missingseverity, op);
64 ok &= setKernelArgument<CE_32, OP>(binding, p, kernel, argidx,
buffers, timestep, error, missingseverity, op);
67 ok &= setKernelArgument<CE_64, OP>(binding, p, kernel, argidx,
buffers, timestep, error, missingseverity, op);
80 int pidx,
const char *
type,
83 template <
typename TYPE>
86 const char *
name,
const char *
type,
int pidx,
88 const char *extra = 0)
92 kernel.
setArg( argidx, tuplesize *
sizeof(TYPE), val);
106 const char *extra = 0)
107 {
bindKernelArgRaw(&val, 1, kernel, argidx, name,
"int", pidx, error, extra); }
110 const char *extra = 0)
111 {
bindKernelArgRaw(val, 2, kernel, argidx, name,
"int2", pidx, error, extra); }
114 const char *extra = 0)
115 {
bindKernelArgRaw(&val, 1, kernel, argidx, name,
"float", pidx, error, extra); }
119 const char *extra = 0)
120 {
bindKernelArgRaw(val, 4, kernel, argidx, name,
"float3", pidx, error, extra); }
123 const char *extra = 0)
124 {
bindKernelArgRaw(val, 4, kernel, argidx, name,
"float4", pidx, error, extra); }
127 const char *extra = 0)
128 {
bindKernelArgRaw(val, 16, kernel, argidx, name,
"float16", pidx, error, extra); }
130 const char *
name,
int pidx,
const char *
type,
132 const char *extra = 0)
136 kernel.
setArg( argidx, val);
147 template <CE_Precision PREC,
typename OP>
172 paramtype = binding.
type;
179 param_int = binding.
intval;
181 kernel, argidx, binding.
name,
"int", p, error);
188 param_float = binding.
fval;
196 param_float *= timestep;
199 param_float /= timestep;
202 param_float = SYSexp( param_float * timestep );
209 kernel, argidx, binding.
name,
"float", p, error);
215 param_float2 = binding.
v2val;
216 param_fpreal_array[0] = param_float2(0);
217 param_fpreal_array[1] = param_float2(1);
220 kernel, argidx, binding.
name,
"float2", p, error);
225 param_float3 = binding.
v3val;
226 param_fpreal_array[0] = param_float3(0);
227 param_fpreal_array[1] = param_float3(1);
228 param_fpreal_array[2] = param_float3(2);
229 param_fpreal_array[3] = 0;
232 kernel, argidx, binding.
name,
"float3", p, error);
237 param_float4 = binding.
v4val;
238 param_fpreal_array[0] = param_float4(0);
239 param_fpreal_array[1] = param_float4(1);
240 param_fpreal_array[2] = param_float4(2);
241 param_fpreal_array[3] = param_float4(3);
243 kernel, argidx, binding.
name,
"float4", p, error);
248 param_float4 = binding.
v4val;
249 param_fpreal_array[0] = param_float4(0);
250 param_fpreal_array[1] = param_float4(1);
251 param_fpreal_array[2] = param_float4(2);
252 param_fpreal_array[3] = param_float4(3);
253 param_float4 = binding.
v4bval;
254 param_fpreal_array[4+0] = param_float4(0);
255 param_fpreal_array[4+1] = param_float4(1);
256 param_fpreal_array[4+2] = param_float4(2);
257 param_fpreal_array[4+3] = param_float4(3);
259 kernel, argidx, binding.
name,
"float8", p, error);
265 for (
int r = 0;
r < 4;
r++)
266 for (
int c = 0; c < 4; c++)
267 param_fpreal_array[
r*4+c] = binding.
m4val(
r, c);
269 kernel, argidx, binding.
name,
"float8", p, error);
282 ramp_array.
entries(ramp_size * tuplesize);
287 for (
int i = 0; i < ramp_size; i++)
291 binding.
ramp->rampLookup( pos, values );
292 for (
int j = 0;
j < tuplesize;
j++)
293 ramp_array(writepos++) = values[
j];
298 for (
int i = 0; i < ramp_array.
entries(); i++)
299 ramp_array[i] = binding.
rampdata[i];
309 const size_t ramp_data_size = ramp_size * tuplesize *
sizeof(
CEfloatH<PREC> );
313 buffers.
append(ramp_buffer);
325 if (!op(binding, p, kernel, argidx, error, PREC))
344 if (!op(binding, p, kernel, argidx, error, PREC))
357 if (!isarray && binding.
defval)
362 param_int = binding.
intval;
364 kernel, argidx, binding.
name,
"int", p, error);
366 else if (tuplesize == 3)
369 param_float3 = binding.
v3val;
370 param_fpreal_array[0] = param_float3(0);
371 param_fpreal_array[1] = param_float3(1);
372 param_fpreal_array[2] = param_float3(2);
373 param_fpreal_array[3] = 0;
376 kernel, argidx, binding.
name,
"float3", p, error);
378 else if (tuplesize == 4)
381 param_float4 = binding.
v4val;
382 param_fpreal_array[0] = param_float4(0);
383 param_fpreal_array[1] = param_float4(1);
384 param_fpreal_array[2] = param_float4(2);
385 param_fpreal_array[3] = param_float4(3);
387 kernel, argidx, binding.
name,
"float", p, error);
392 param_float = binding.
fval;
394 kernel, argidx, binding.
name,
"float", p, error);
410 if (!op(binding, p, kernel, argidx, error, PREC))
417 param_float = binding.
fval;
419 kernel, argidx, binding.
name,
"float", p, error);
426 msg.
sprintf(
"Invalid volume '%s'", (
const char *) binding.
volume);
441 if (!op(binding, p, kernel, argidx, error, PREC))
446 msg.
sprintf(
"Invalid vdb '%s'", (
const char *) binding.
volume);
456 param_float = binding.
fval;
458 kernel, argidx, binding.
name,
"float", p, error);
469 bool defval = binding.
defval;
474 if (!op(binding, p, kernel, argidx, error, PREC))
492 param_int = binding.
intval;
494 kernel, argidx, binding.
name,
"int", p, error);
496 else if (tuplesize == 3)
499 param_float3 = binding.
v3val;
500 param_fpreal_array[0] = param_float3(0);
501 param_fpreal_array[1] = param_float3(1);
502 param_fpreal_array[2] = param_float3(2);
503 param_fpreal_array[3] = 0;
506 kernel, argidx, binding.
name,
"float3", p, error);
508 else if (tuplesize == 4)
511 param_float4 = binding.
v4val;
512 param_fpreal_array[0] = param_float4(0);
513 param_fpreal_array[1] = param_float4(1);
514 param_fpreal_array[2] = param_float4(2);
515 param_fpreal_array[3] = param_float4(3);
517 kernel, argidx, binding.
name,
"float", p, error);
522 param_float = binding.
fval;
524 kernel, argidx, binding.
name,
"float", p, error);
536 bool defval = binding.
defval;
539 if (!op(binding, p, kernel, argidx, error, PREC))
544 msg.
sprintf(
"Invalid image '%s'", (
const char *) binding.
name);
556 param_float4 = binding.
v4val;
557 param_fpreal_array[0] = binding.
v4val.
x();
558 param_fpreal_array[1] = binding.
v4val.
y();
559 param_fpreal_array[2] = binding.
v4val.
z();
560 param_fpreal_array[3] = binding.
v4val.
w();
562 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
constexpr SYS_FORCE_INLINE T & y() noexcept
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.
constexpr SYS_FORCE_INLINE T & x() noexcept
UT_StringHolder optionname
bool setKernelArguments(const UT_Array< Binding > &bindings, BindingPrecision nodeprecision, cl::Kernel &kernel, int &argidx, UT_Array< cl::Buffer > &buffers, fpreal timestep, UT_ErrorManager *error, UT_ErrorSeverity missingseverity, const OP &op)
UT_Vector2D UT_Vector3D v3val
bool setKernelArgument(const Binding &binding, int p, cl::Kernel &kernel, int &argidx, UT_Array< cl::Buffer > &buffers, fpreal timestep, UT_ErrorManager *error, UT_ErrorSeverity missingseverity, const OP &op)
}
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
constexpr SYS_FORCE_INLINE T & z() noexcept
const fpreal32 * rampdata
GLuint const GLchar * name
UT_SharedPtr< UT_Ramp > ramp
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
constexpr SYS_FORCE_INLINE T & w() noexcept
void bindKernelArgV4(cl_float *val, cl::Kernel &kernel, int &argidx, const char *name, int pidx, UT_ErrorManager *error, const char *extra=0)
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)
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)
cl::Buffer allocBuffer(int64 size, bool usePool=true, bool read=true, bool write=true, uint32 ogl_bind=SYS_UINT32_MAX)
UT_ErrorSeverity addGeneric(const char *type, int code, const char *msg, UT_ErrorSeverity sev, const UT_SourceLocation *loc=0)
BindingTimescale timescale