10 #ifdef KERNEL_LABEL_CONFLUENCES 12 #define CHECK_INFLOWS(here_idx,nbr_vec) { \ 13 nbr_idx = get_array_idx(nbr_vec); \ 14 if ( !mask_array[nbr_idx] && (mapping_array[nbr_idx]&IS_THINCHANNEL) ) { \ 15 if ( link_array[nbr_idx]==here_idx ) { \ 17 inflows_list[n_inflows++] = nbr_idx; \ 22 #define CHECK_E_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]+1.0f, vec[1] )) 23 #define CHECK_NE_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]+1.0f, vec[1]+1.0f )) 24 #define CHECK_N_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0], vec[1]+1.0f )) 25 #define CHECK_NW_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]-1.0f, vec[1]+1.0f )) 26 #define CHECK_W_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]-1.0f, vec[1] )) 27 #define CHECK_SW_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]-1.0f, vec[1]-1.0f )) 28 #define CHECK_S_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0], vec[1]-1.0f )) 29 #define CHECK_SE_INFLOWS(idx,vec) CHECK_INFLOWS(idx,(float2)(vec[0]+1.0f, vec[1]-1.0f )) 50 __global
const float2 *seed_point_array,
51 __global
const bool *mask_array,
52 __global
const float2 *uv_array,
53 __global
const float *slt_array,
54 __global uint *mapping_array,
55 __global
const uint *count_array,
56 __global
const uint *link_array
61 const uint global_id = get_global_id(0u)+get_global_id(1u)*get_global_size(0u);
62 __private uchar n_inflows=0u, n_equal_dominant_inflows=0u;
63 __private uint i, idx, nbr_idx, inflows_list[8], equal_dominant_inflows_list[8],
64 dominant_slt_index=0u;
65 __private
float dominant_slt=-MAXFLOAT;
66 __private float2 vec=seed_point_array[global_id];
81 for (i=0;i<n_inflows;i++) {
82 if ( (count_array[inflows_list[i]]+1)!=count_array[idx] ) {
85 equal_dominant_inflows_list[n_equal_dominant_inflows++]= inflows_list[i];
86 if (slt_array[inflows_list[i]]>dominant_slt) {
87 dominant_slt_index = inflows_list[i];
88 dominant_slt = slt_array[dominant_slt_index];
93 if (n_equal_dominant_inflows==0) {
95 "\nn_equal_dominant_inflows=0 @ %g,%g idx=%d mapping=%d & %d= is_thin=%d mask=%d \n",
100 for (i=0;i<n_inflows;i++) {
101 printf(
"ifidx=%d count=%d => %d @ idx=%d\n",inflows_list[i],
102 count_array[inflows_list[i]], count_array[idx],idx);
104 for (i=0;i<n_inflows;i++) {
105 printf(
"slt=%g : domslt=%g\n",slt_array[inflows_list[i]]+1, dominant_slt);
108 for (i=0;i<n_equal_dominant_inflows;i++) {
109 if (equal_dominant_inflows_list[i]==dominant_slt_index) {
110 atomic_or(&mapping_array[equal_dominant_inflows_list[i]],
IS_MAJORINFLOW);
112 atomic_or(&mapping_array[equal_dominant_inflows_list[i]],
IS_MINORINFLOW);
#define CHECK_SW_INFLOWS(idx, vec)
#define CHECK_NW_INFLOWS(idx, vec)
#define CHECK_W_INFLOWS(idx, vec)
#define CHECK_E_INFLOWS(idx, vec)
#define CHECK_SE_INFLOWS(idx, vec)
#define CHECK_N_INFLOWS(idx, vec)
#define CHECK_NE_INFLOWS(idx, vec)
static uint get_array_idx(float2 vec)
Compute the array index of the padded grid pixel pointed to by a float2 grid position vector (choice ...
__kernel void label_confluences(__global const float2 *seed_point_array, __global const bool *mask_array, __global const float2 *uv_array, __global const float *slt_array, __global uint *mapping_array, __global const uint *count_array, __global const uint *link_array)
Flag if a pixel IS_MAJORCONFLUENCE and if so flag which upstream pixel IS_MAJORINFLOW or IS_MINORINFL...
#define CHECK_S_INFLOWS(idx, vec)
#define IS_MAJORCONFLUENCE