22 #include <boost/mpl/at.hpp> 23 #include <boost/mpl/vector.hpp> 24 #include <boost/mpl/back.hpp> 25 #include <boost/mpl/bool.hpp> 26 #include <boost/mpl/push_back.hpp> 27 #include <boost/fusion/include/push_back.hpp> 28 #include <boost/mpl/size.hpp> 32 #pragma GCC diagnostic push 33 #pragma GCC diagnostic ignored "-Wstrict-aliasing" 34 #pragma GCC diagnostic ignored "-Wsign-compare" 39 namespace fus = boost::fusion;
40 namespace mpl = boost::mpl;
56 typename TFunctorVector,
64 #define ISAAC_SUB_CALL(Z, I, U) \ 65 if (bytecode[ISAAC_MAX_FUNCTORS-NR] == I) \ 66 return FillFunctorChainPointerKernelStruct \ 68 typename mpl::push_back< TFunctorVector, typename boost::mpl::at_c<IsaacFunctorPool,I>::type >::type, \ 80 typename TFunctorVector,
84 isaac_float_dim < TFeatureDim >
const value,
88 #define ISAAC_LEFT_DEF(Z,I,U) mpl::at_c< TFunctorVector, ISAAC_MAX_FUNCTORS - I - 1 >::type::call( 89 #define ISAAC_RIGHT_DEF(Z,I,U) , isaac_parameter_d[ src_id * ISAAC_MAX_FUNCTORS + I ] ) 90 #define ISAAC_LEFT BOOST_PP_REPEAT( ISAAC_MAX_FUNCTORS, ISAAC_LEFT_DEF, ~) 91 #define ISAAC_RIGHT BOOST_PP_REPEAT( ISAAC_MAX_FUNCTORS, ISAAC_RIGHT_DEF, ~) 96 #undef ISAAC_RIGHT_DEF 103 typename TFunctorVector,
120 #if ISAAC_ALPAKA == 1 123 template <
typename TAcc__>
124 ALPAKA_FN_ACC
void operator()(
130 #
if ISAAC_ALPAKA == 1
143 for (
int j = ISAAC_MAX_FUNCTORS - 1; j >= 0; j--)
153 #if ISAAC_ALPAKA == 1 162 typename TPointerArray,
167 const TSource& source,
169 const TPointerArray& pointerArray,
170 const TLocalSize& local_size,
174 isaac_float_dim < TSource::feature_dim > data;
175 isaac_float_dim < TSource::feature_dim >* ptr = (isaac_float_dim < TSource::feature_dim >*)(pointerArray.pointer[ NR::value ] );
176 if (TInterpolation == 0)
184 if (TSource::persistent)
185 data = source[coord];
192 isaac_float_dim < TSource::feature_dim > data8[2][2][2];
193 for (
int x = 0; x < 2; x++)
194 for (
int y = 0; y < 2; y++)
195 for (
int z = 0; z < 2; z++)
197 coord.x =
isaac_int(x?ceil(pos.x):floor(pos.x));
198 coord.y =
isaac_int(y?ceil(pos.y):floor(pos.y));
199 coord.z =
isaac_int(z?ceil(pos.z):floor(pos.z));
200 if (!TSource::has_guard && TSource::persistent)
202 if (
isaac_uint(coord.x) >= local_size.value.x )
203 coord.x =
isaac_int(x?floor(pos.x):ceil(pos.x));
204 if (
isaac_uint(coord.y) >= local_size.value.y )
205 coord.y =
isaac_int(y?floor(pos.y):ceil(pos.y));
206 if (
isaac_uint(coord.z) >= local_size.value.z )
207 coord.z =
isaac_int(z?floor(pos.z):ceil(pos.z));
209 if (TSource::persistent)
210 data8[x][y][z] = source[coord];
215 #pragma GCC diagnostic push 216 #pragma GCC diagnostic ignored "-Wnarrowing" 217 isaac_float_dim < 3 > pos_in_cube =
219 pos.x - floor(pos.x),
220 pos.y - floor(pos.y),
223 #pragma GCC diagnostic pop 224 isaac_float_dim < TSource::feature_dim > data4[2][2];
225 for (
int x = 0; x < 2; x++)
226 for (
int y = 0; y < 2; y++)
228 data8[x][y][0].value * (
isaac_float(1) - pos_in_cube.value.z) +
229 data8[x][y][1].value * ( pos_in_cube.value.z);
230 isaac_float_dim < TSource::feature_dim > data2[2];
231 for (
int x = 0; x < 2; x++)
233 data4[x][0].value * (
isaac_float(1) - pos_in_cube.value.y) +
234 data4[x][1].value * ( pos_in_cube.value.y);
236 data2[0].value * (
isaac_float(1) - pos_in_cube.value.x) +
237 data2[1].value * ( pos_in_cube.value.x);
241 #if ISAAC_ALPAKA == 1 || defined(__CUDA_ARCH__) 242 if (TSource::feature_dim == 1)
243 result =
reinterpret_cast<isaac_functor_chain_pointer_1>(isaac_function_chain_d[ NR::value ])( *(
reinterpret_cast< isaac_float_dim<1>*
>(&data)), NR::value );
244 if (TSource::feature_dim == 2)
245 result =
reinterpret_cast<isaac_functor_chain_pointer_2>(isaac_function_chain_d[ NR::value ])( *(
reinterpret_cast< isaac_float_dim<2>*
>(&data)), NR::value );
246 if (TSource::feature_dim == 3)
247 result =
reinterpret_cast<isaac_functor_chain_pointer_3>(isaac_function_chain_d[ NR::value ])( *(
reinterpret_cast< isaac_float_dim<3>*
>(&data)), NR::value );
248 if (TSource::feature_dim == 4)
249 result =
reinterpret_cast<isaac_functor_chain_pointer_4>(isaac_function_chain_d[ NR::value ])( *(
reinterpret_cast< isaac_float_dim<4>*
>(&data)), NR::value );
254 template <
typename TLocalSize >
272 size_t Ttransfer_size,
286 typename TTransferArray,
287 typename TSourceWeight,
288 typename TPointerArray,
291 typename TStepLength,
296 const TSource& source,
299 const TLocalSize& local_size,
300 const TTransferArray& transferArray,
301 const TSourceWeight& sourceWeight,
302 const TPointerArray& pointerArray,
305 const TStepLength& stepLength,
309 if ( mpl::at_c< TFilter, NR::value >::type::value )
311 isaac_float result = get_value< TInterpolation, NR >( source, pos, pointerArray, local_size, scale );
313 if (lookup_value < 0 )
315 if (lookup_value >= Ttransfer_size )
316 lookup_value = Ttransfer_size - 1;
317 isaac_float4 value = transferArray.pointer[ NR::value ][ lookup_value ];
322 isaac_float3 left = {-1, 0, 0};
324 if (!TSource::has_guard && TSource::persistent)
326 isaac_float3 right = { 1, 0, 0};
328 if (!TSource::has_guard && TSource::persistent)
332 d1 = right.x - left.x;
336 isaac_float3 up = { 0,-1, 0};
338 if (!TSource::has_guard && TSource::persistent)
340 isaac_float3 down = { 0, 1, 0};
342 if (!TSource::has_guard && TSource::persistent)
350 isaac_float3 front = { 0, 0,-1};
352 if (!TSource::has_guard && TSource::persistent)
354 isaac_float3 back = { 0, 0, 1};
356 if (!TSource::has_guard && TSource::persistent)
360 d3 = back.z - front.z;
364 isaac_float3 gradient=
366 (get_value< TInterpolation, NR >( source, right, pointerArray, local_size, scale ) -
367 get_value< TInterpolation, NR >( source, left, pointerArray, local_size, scale )) / d1,
368 (get_value< TInterpolation, NR >( source, down, pointerArray, local_size, scale ) -
369 get_value< TInterpolation, NR >( source, up, pointerArray, local_size, scale )) / d2,
370 (get_value< TInterpolation, NR >( source, back, pointerArray, local_size, scale ) -
371 get_value< TInterpolation, NR >( source, front, pointerArray, local_size, scale )) / d3
374 gradient.x * gradient.x +
375 gradient.y * gradient.y +
376 gradient.z * gradient.z
382 gradient = gradient / l;
383 isaac_float3 light = step / stepLength;
385 gradient.x * light.x +
386 gradient.y * light.y +
387 gradient.z * light.z );
388 #if ISAAC_SPECULAR == 1 389 color.x = value.x * ac + ac * ac * ac * ac;
390 color.y = value.y * ac + ac * ac * ac * ac;
391 color.z = value.z * ac + ac * ac * ac * ac;
393 color.x = value.x * ac;
394 color.y = value.y * ac;
395 color.z = value.z * ac;
404 value.w *= sourceWeight.value[ NR::value ];
405 color.x = color.x + value.x * value.w;
406 color.y = color.y + value.y * value.w;
407 color.z = color.z + value.z * value.w;
408 color.w = color.w + value.w;
427 const TSource& source,
431 result |= mpl::at_c< TFilter, NR::value >::type::value;
438 typename TSourceList,
439 typename TTransferArray,
440 typename TSourceWeight,
441 typename TPointerArray,
443 size_t Ttransfer_size,
448 #if ISAAC_ALPAKA == 1 451 template <
typename TAcc__>
452 ALPAKA_FN_ACC
void operator()(
457 uint32_t *
const pixels,
458 const isaac_size2 framebuffer_size,
459 const isaac_uint2 framebuffer_start,
460 const TSourceList sources,
462 const isaac_float4 background_color,
463 const TTransferArray transferArray,
464 const TSourceWeight sourceWeight,
465 const TPointerArray pointerArray,
468 #
if ISAAC_ALPAKA == 1
474 #if ISAAC_ALPAKA == 1 475 auto threadIdx = alpaka::idx::getIdx<alpaka::Grid, alpaka::Threads>(acc);
484 pixel[e].y =
isaac_uint(threadIdx.y + blockIdx.y * blockDim.y);
487 pixel[e] = pixel[e] + framebuffer_start;
498 color[e] = background_color;
499 at_least_one[e] =
true;
501 if (!at_least_one[e])
504 ISAAC_SET_COLOR( pixels[pixel[e].x + pixel[e].y * framebuffer_size.x], color[e] )
541 start[e].x = isaac_inverse_d[ 0] * start_p[e].x + isaac_inverse_d[ 4] * start_p[e].y + isaac_inverse_d[ 8] * start_p[e].z + isaac_inverse_d[12] * start_p[e].w;
542 start[e].y = isaac_inverse_d[ 1] * start_p[e].x + isaac_inverse_d[ 5] * start_p[e].y + isaac_inverse_d[ 9] * start_p[e].z + isaac_inverse_d[13] * start_p[e].w;
543 start[e].z = isaac_inverse_d[ 2] * start_p[e].x + isaac_inverse_d[ 6] * start_p[e].y + isaac_inverse_d[10] * start_p[e].z + isaac_inverse_d[14] * start_p[e].w;
545 end[e].x = isaac_inverse_d[ 0] * end_p[e].x + isaac_inverse_d[ 4] * end_p[e].y + isaac_inverse_d[ 8] * end_p[e].z + isaac_inverse_d[12] * end_p[e].w;
546 end[e].y = isaac_inverse_d[ 1] * end_p[e].x + isaac_inverse_d[ 5] * end_p[e].y + isaac_inverse_d[ 9] * end_p[e].z + isaac_inverse_d[13] * end_p[e].w;
547 end[e].z = isaac_inverse_d[ 2] * end_p[e].x + isaac_inverse_d[ 6] * end_p[e].y + isaac_inverse_d[10] * end_p[e].z + isaac_inverse_d[14] * end_p[e].w;
548 isaac_float max_size = isaac_size_d[0].max_global_size_scaled / 2.0f;
551 start[e] = start[e] * max_size;
552 end[e] = end[e] * max_size;
561 move[e].x =
isaac_int(isaac_size_d[0].global_size_scaled.value.x) /
isaac_int(2) -
isaac_int(isaac_size_d[0].position_scaled.value.x);
562 move[e].y =
isaac_int(isaac_size_d[0].global_size_scaled.value.y) /
isaac_int(2) -
isaac_int(isaac_size_d[0].position_scaled.value.y);
563 move[e].z =
isaac_int(isaac_size_d[0].global_size_scaled.value.z) /
isaac_int(2) -
isaac_int(isaac_size_d[0].position_scaled.value.z);
569 start[e] = start[e] + move_f[e];
570 end[e] = end[e] + move_f[e];
572 clipping[e].elem[i].position = clipping[e].elem[i].position + move_f[e];
574 vec[e] = end[e] - start[e];
575 l_scaled[e] = sqrt( vec[e].x * vec[e].x + vec[e].y * vec[e].y + vec[e].z * vec[e].z );
577 start[e].x = start[e].x / scale.x;
578 start[e].y = start[e].y / scale.y;
579 start[e].z = start[e].z / scale.z;
580 end[e].x = end[e].x / scale.x;
581 end[e].y = end[e].y / scale.y;
582 end[e].z = end[e].z / scale.z;
590 vec[e] = end[e] - start[e];
591 l[e] = sqrt( vec[e].x * vec[e].x + vec[e].y * vec[e].y + vec[e].z * vec[e].z );
593 step_vec[e] = vec[e] / l[e] * step;
594 count_start[e] = - start[e] / step_vec[e];
595 local_size_f[e].x =
isaac_float(isaac_size_d[0].local_size.value.x);
596 local_size_f[e].y =
isaac_float(isaac_size_d[0].local_size.value.y);
597 local_size_f[e].z =
isaac_float(isaac_size_d[0].local_size.value.z);
599 count_end[e] = ( local_size_f[e] - start[e] ) / step_vec[e];
607 count_start[e].x =
ISAAC_MAX(
ISAAC_MAX( count_start[e].x, count_start[e].y ), count_start[e].z );
608 count_end[e].x =
ISAAC_MIN(
ISAAC_MIN( count_end[e].x, count_end[e].y ), count_end[e].z );
609 if ( count_start[e].x > count_end[e].x)
612 ISAAC_SET_COLOR( pixels[pixel[e].x + pixel[e].y * framebuffer_size.x], color[e] )
627 first[e] =
isaac_int( floor(count_start[e].x) );
628 last[e] =
isaac_int( ceil(count_end[e].x) );
631 pos[e] = start[e] + step_vec[e] *
isaac_float(last[e]);
639 pos[e] = start[e] + step_vec[e] *
isaac_float(last[e]);
644 pos[e] = start[e] + step_vec[e] *
isaac_float(first[e]);
652 pos[e] = start[e] + step_vec[e] *
isaac_float(first[e]);
661 d[e] = step_vec[e].x * clipping[e].
elem[i].
normal.x
662 + step_vec[e].y * clipping[e].
elem[i].
normal.y
663 + step_vec[e].z * clipping[e].
elem[i].
normal.z;
669 - start[e].z * clipping[e].
elem[i].
normal.z ) / d[e];
672 if ( last[e] < intersection_step[e] )
675 ISAAC_SET_COLOR( pixels[pixel[e].x + pixel[e].y * framebuffer_size.x], color[e] )
678 if ( first[e] < intersection_step[e] )
679 first[e] = ceil( intersection_step[e] );
683 if ( first[e] > intersection_step[e] )
686 ISAAC_SET_COLOR( pixels[pixel[e].x + pixel[e].y * framebuffer_size.x], color[e] )
689 if ( last[e] > intersection_step[e] )
690 last[e] = floor( intersection_step[e] );
707 int(isaac_size_d[0].global_size.value.x),
ISAAC_MIN (
708 int(isaac_size_d[0].global_size.value.y),
709 int(isaac_size_d[0].global_size.value.z) ) );
710 factor[e] = step / min_size[e] *
isaac_float(2) * l[e]/l_scaled[e];
711 for (
isaac_int i = first[e]; i <= last[e]; i++)
731 isaac_size_d[0].local_size,
753 value[e] = value[e] * factor[e];
754 color_add[e].x = oma[e] * value[e].x;
755 color_add[e].y = oma[e] * value[e].y;
756 color_add[e].z = oma[e] * value[e].z;
757 color_add[e].w = oma[e] * value[e].w;
758 color[e] = color[e] + color_add[e];
763 #if ISAAC_SHOWBORDER == 1 770 color_add[e].w = oma[e] * factor[e] *
isaac_float(10);
772 color[e] = color[e] + color_add[e];
776 ISAAC_SET_COLOR( pixels[pixel[e].x + pixel[e].y * framebuffer_size.x], color[e] )
779 #if ISAAC_ALPAKA == 1 785 typename TSourceList,
786 typename TTransferArray,
787 typename TSourceWeight,
788 typename TPointerArray,
790 typename TFramebuffer,
791 size_t TTransfer_size,
793 #if ISAAC_ALPAKA == 1 797 typename TFunctionChain,
804 #
if ISAAC_ALPAKA == 1
807 TFramebuffer framebuffer,
808 const isaac_size2& framebuffer_size,
809 const isaac_uint2& framebuffer_start,
810 const TSourceList& sources,
812 const isaac_float4& background_color,
813 const TTransferArray& transferArray,
814 const TSourceWeight& sourceWeight,
815 const TPointerArray& pointerArray,
816 IceTInt
const *
const readback_viewport,
823 if (sourceWeight.value[ mpl::size< TSourceList >::type::value - N] ==
isaac_float(0) )
831 typename mpl::push_back< TFilter, mpl::false_ >::type,
835 #if ISAAC_ALPAKA == 1 844 #
if ISAAC_ALPAKA == 1
870 typename mpl::push_back< TFilter, mpl::true_ >::type,
874 #if ISAAC_ALPAKA == 1 883 #
if ISAAC_ALPAKA == 1
906 typename TSourceList,
907 typename TTransferArray,
908 typename TSourceWeight,
909 typename TPointerArray,
911 typename TFramebuffer,
912 size_t TTransfer_size,
914 #if ISAAC_ALPAKA == 1 918 ,
typename TFunctionChain
932 #if ISAAC_ALPAKA == 1
942 #
if ISAAC_ALPAKA == 1
945 TFramebuffer framebuffer,
946 const isaac_size2& framebuffer_size,
947 const isaac_uint2& framebuffer_start,
948 const TSourceList& sources,
950 const isaac_float4& background_color,
951 const TTransferArray& transferArray,
952 const TSourceWeight& sourceWeight,
953 const TPointerArray& pointerArray,
954 IceTInt
const *
const readback_viewport,
961 isaac_size2 block_size=
966 isaac_size2 grid_size=
969 size_t((readback_viewport[3]+block_size.y-1)/block_size.y)
971 #if ISAAC_ALPAKA == 1 972 #if ALPAKA_ACC_GPU_CUDA_ENABLED == 1 973 if ( mpl::not_<boost::is_same<TAcc, alpaka::acc::AccGpuCudaRt<TAccDim, size_t> > >::value )
977 grid_size.y = size_t(readback_viewport[3]);
978 block_size.x = size_t(1);
979 block_size.y = size_t(1);
981 const alpaka::vec::Vec<TAccDim, size_t> threads (
size_t(1),
size_t(1),
size_t(
ISAAC_VECTOR_ELEM));
982 const alpaka::vec::Vec<TAccDim, size_t> blocks (
size_t(1), block_size.y, block_size.x);
983 const alpaka::vec::Vec<TAccDim, size_t> grid (
size_t(1), grid_size.y, grid_size.x);
984 auto const workdiv(alpaka::workdiv::WorkDivMembers<TAccDim, size_t>(grid,blocks,threads));
985 #define ISAAC_KERNEL_START \ 996 #define ISAAC_KERNEL_END \ 1000 auto const instance \ 1002 alpaka::exec::create<TAcc> \ 1006 alpaka::mem::view::getPtrNative(framebuffer), \ 1008 framebuffer_start, \ 1019 alpaka::stream::enqueue(stream, instance); \ 1022 dim3 block (block_size.x, block_size.y);
1023 dim3 grid (grid_size.x, grid_size.y);
1024 #define ISAAC_KERNEL_START \ 1034 #define ISAAC_KERNEL_END \ 1040 framebuffer_start, \ 1078 #undef ISAAC_KERNEL_START 1079 #undef ISAAC_KERNEL_END 1094 #if ISAAC_ALPAKA == 1 1097 template <
typename TAcc__>
1098 ALPAKA_FN_ACC
void operator()(
1106 #
if ISAAC_ALPAKA == 1
1110 for (
int i = 0; i < count; i++)
1111 functor_chain_choose_d[i] = functor_chain_d[dest.nr[i]];
1113 #if ISAAC_ALPAKA == 1 1121 #if ISAAC_ALPAKA == 1 1124 template <
typename TAcc__>
1125 ALPAKA_FN_ACC
void operator()(
1130 const TSource source,
1131 void *
const pointer,
1132 const isaac_int3 local_size)
1133 #
if ISAAC_ALPAKA == 1
1137 #if ISAAC_ALPAKA == 1 1138 auto threadIdx = alpaka::idx::getIdx<alpaka::Grid, alpaka::Threads>(acc);
1148 isaac_int(threadIdx.x + blockIdx.x * blockDim.x),
1149 isaac_int(threadIdx.y + blockIdx.y * blockDim.y),
1153 isaac_int3 coord = dest;
1158 isaac_float_dim < TSource::feature_dim >* ptr = (isaac_float_dim < TSource::feature_dim >*)(pointer);
1159 if (TSource::has_guard)
1172 if (coord.x >= local_size.x)
1173 coord.x = local_size.x-1;
1176 if (coord.y >= local_size.y)
1177 coord.y = local_size.y-1;
1190 #if ISAAC_ALPAKA == 1 1198 #if ISAAC_ALPAKA == 1 1201 template <
typename TAcc__>
1202 ALPAKA_FN_ACC
void operator()(
1207 const TSource source,
1210 const isaac_int3 local_size,
1211 void const *
const pointer)
1212 #
if ISAAC_ALPAKA == 1
1216 #if ISAAC_ALPAKA == 1 1217 auto threadIdx = alpaka::idx::getIdx<alpaka::Grid, alpaka::Threads>(acc);
1227 isaac_int(threadIdx.x + blockIdx.x * blockDim.x),
1228 isaac_int(threadIdx.y + blockIdx.y * blockDim.y),
1236 for (;coord.z < local_size.z; coord.z++)
1238 isaac_float_dim < TSource::feature_dim > data;
1239 if (TSource::persistent)
1240 data = source[coord];
1243 isaac_float_dim < TSource::feature_dim >* ptr = (isaac_float_dim < TSource::feature_dim >*)(pointer);
1247 #if ISAAC_ALPAKA == 1 || defined(__CUDA_ARCH__) 1248 if (TSource::feature_dim == 1)
1249 value =
reinterpret_cast<isaac_functor_chain_pointer_1>(isaac_function_chain_d[ nr ])( *(
reinterpret_cast< isaac_float_dim<1>*
>(&data)), nr );
1250 if (TSource::feature_dim == 2)
1251 value =
reinterpret_cast<isaac_functor_chain_pointer_2>(isaac_function_chain_d[ nr ])( *(
reinterpret_cast< isaac_float_dim<2>*
>(&data)), nr );
1252 if (TSource::feature_dim == 3)
1253 value =
reinterpret_cast<isaac_functor_chain_pointer_3>(isaac_function_chain_d[ nr ])( *(
reinterpret_cast< isaac_float_dim<3>*
>(&data)), nr );
1254 if (TSource::feature_dim == 4)
1255 value =
reinterpret_cast<isaac_functor_chain_pointer_4>(isaac_function_chain_d[ nr ])( *(
reinterpret_cast< isaac_float_dim<4>*
>(&data)), nr );
1262 result[coord.x + coord.y * local_size.x].
min = min;
1263 result[coord.x + coord.y * local_size.x].
max = max;
1265 #if ISAAC_ALPAKA == 1 1271 #pragma GCC diagnostic pop
ISAAC_DEVICE isaac_float applyFunctorChain(isaac_float_dim< TFeatureDim > const value, isaac_int const src_id)
ISAAC_CONSTANT isaac_functor_chain_pointer_N isaac_function_chain_d[ISAAC_MAX_SOURCES]
ISAAC_HOST_DEVICE_INLINE isaac_float get_value(const TSource &source, const TPos &pos, const TPointerArray &pointerArray, const TLocalSize &local_size, const TScale &scale)
isaac_float(* isaac_functor_chain_pointer_2)(isaac_float_dim< 2 >, isaac_int)
#define ISAAC_SWITCH_IF_SMALLER(left, right)
ISAAC_NO_HOST_DEVICE_WARNING ISAAC_HOST_DEVICE_INLINE void isaac_for_each_with_mpl_params(Sequence &seq, F const &f, P &... p)
ISAAC_HOST_DEVICE_INLINE void check_coord(isaac_float3 &coord, const TLocalSize local_size)
#define ISAAC_MAX_SOURCES
static void call(TFramebuffer framebuffer, const isaac_size2 &framebuffer_size, const isaac_uint2 &framebuffer_start, const TSourceList &sources, const isaac_float &step, const isaac_float4 &background_color, const TTransferArray &transferArray, const TSourceWeight &sourceWeight, const TPointerArray &pointerArray, IceTInt const *const readback_viewport, const isaac_int interpolation, const isaac_int iso_surface, const TScale &scale, const clipping_struct &clipping)
#define ISAAC_ELEM_ALL_TRUE_RETURN(NAME)
ISAAC_HOST_DEVICE_INLINE void operator()(const NR &nr, const TSource &source, TColor &color, const TPos &pos, const TLocalSize &local_size, const TTransferArray &transferArray, const TSourceWeight &sourceWeight, const TPointerArray &pointerArray, TFeedback &feedback, const TStep &step, const TStepLength &stepLength, const TScale &scale) const
#define ISAAC_KERNEL_START
#define ISAAC_ELEM_ITERATE(NAME)
#define ISAAC_FUNCTOR_COUNT
#define ISAAC_FUNCTOR_COMPLEX
isaac_float(* isaac_functor_chain_pointer_3)(isaac_float_dim< 3 >, isaac_int)
ISAAC_CONSTANT isaac_float4 isaac_parameter_d[ISAAC_MAX_SOURCES *ISAAC_MAX_FUNCTORS]
struct isaac::clipping_struct::@0 elem[ISAAC_MAX_CLIPPING]
#define ISAAC_MAX_FUNCTORS
#define ISAAC_FOR_EACH_DIM_TWICE(dim, start, middle, end)
isaac_float(* isaac_functor_chain_pointer_4)(isaac_float_dim< 4 >, isaac_int)
#define ISAAC_FOR_EACH_DIM(dim, start, end)
__global__ void fillFunctorChainPointerKernel(isaac_functor_chain_pointer_N *const functor_chain_d)
isaac_float(* isaac_functor_chain_pointer_1)(isaac_float_dim< 1 >, isaac_int)
#define ISAAC_HOST_DEVICE_INLINE
static void call(TFramebuffer framebuffer, const isaac_size2 &framebuffer_size, const isaac_uint2 &framebuffer_start, const TSourceList &sources, const isaac_float &step, const isaac_float4 &background_color, const TTransferArray &transferArray, const TSourceWeight &sourceWeight, const TPointerArray &pointerArray, IceTInt const *const readback_viewport, const isaac_int interpolation, const isaac_int iso_surface, const TScale &scale, const clipping_struct &clipping)
__global__ void updateBufferKernel(const TSource source, void *const pointer, const isaac_int3 local_size)
__global__ void isaacRenderKernel(uint32_t *const pixels, const isaac_size2 framebuffer_size, const isaac_uint2 framebuffer_start, const TSourceList sources, isaac_float step, const isaac_float4 background_color, const TTransferArray transferArray, const TSourceWeight sourceWeight, const TPointerArray pointerArray, const TScale scale, const clipping_struct input_clipping)
static ISAAC_DEVICE isaac_functor_chain_pointer_N call(isaac_int const *const bytecode)
__global__ void minMaxKernel(const TSource source, const int nr, minmax_struct *const result, const isaac_int3 local_size, void const *const pointer)
#define ISAAC_SET_COLOR(dest, color)
isaac_float(* isaac_functor_chain_pointer_N)(void *, isaac_int)
ISAAC_CONSTANT isaac_size_struct< 3 > isaac_size_d[1]
ISAAC_CONSTANT isaac_float isaac_inverse_d[16]
ISAAC_HOST_DEVICE_INLINE void operator()(const NR &nr, const TSource &source, TResult &result) const
#define ISAAC_SUB_CALL(Z, I, U)
__global__ void updateFunctorChainPointerKernel(isaac_functor_chain_pointer_N *const functor_chain_choose_d, isaac_functor_chain_pointer_N const *const functor_chain_d, TDest dest)
static ISAAC_DEVICE isaac_functor_chain_pointer_N call(isaac_int const *const bytecode)
#define ISAAC_VECTOR_ELEM