slm: OpenCL code base  0.1
label.cl
Go to the documentation of this file.
1 
10 #ifdef KERNEL_LABEL_CONFLUENCES
11 
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 ) { \
16  /* The nbr pixel flows into here */ \
17  inflows_list[n_inflows++] = nbr_idx; \
18  } \
19  } \
20 }
21 // Check in all 8 pixel-nbr directions
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 ))
30 
49 __kernel void label_confluences(
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
57  )
58 {
59  // For every (redesignated) thin channel pixel...
60 
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];
67 
68  // Remember here
69  idx = get_array_idx(vec);
70  // Check upstream neighbors
71  CHECK_N_INFLOWS(idx,vec);
72  CHECK_S_INFLOWS(idx,vec);
73  CHECK_E_INFLOWS(idx,vec);
74  CHECK_W_INFLOWS(idx,vec);
75  CHECK_NE_INFLOWS(idx,vec);
76  CHECK_SE_INFLOWS(idx,vec);
77  CHECK_NW_INFLOWS(idx,vec);
78  CHECK_SW_INFLOWS(idx,vec);
79  if (n_inflows>1) {
80  atomic_or(&mapping_array[idx],IS_MAJORCONFLUENCE);
81  for (i=0;i<n_inflows;i++) {
82  if ( (count_array[inflows_list[i]]+1)!=count_array[idx] ) {
83  atomic_or(&mapping_array[inflows_list[i]],IS_MINORINFLOW);
84  } else {
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];
89 // printf("di=%d\n",dominant_slt_index);
90  }
91  }
92  }
93  if (n_equal_dominant_inflows==0) {
94  printf(
95  "\nn_equal_dominant_inflows=0 @ %g,%g idx=%d mapping=%d & %d= is_thin=%d mask=%d \n",
96  vec[0],vec[1],
97  idx,
98  mapping_array[idx],IS_THINCHANNEL,(mapping_array[idx]&IS_THINCHANNEL),
99  mask_array[idx]);
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);
103  }
104  for (i=0;i<n_inflows;i++) {
105  printf("slt=%g : domslt=%g\n",slt_array[inflows_list[i]]+1, dominant_slt);
106  }
107  }
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);
111  } else {
112  atomic_or(&mapping_array[equal_dominant_inflows_list[i]],IS_MINORINFLOW);
113  }
114  }
115  }
116  return;
117 }
118 #endif
#define CHECK_SW_INFLOWS(idx, vec)
Definition: label.cl:27
#define IS_MINORINFLOW
Definition: info.h:104
#define CHECK_NW_INFLOWS(idx, vec)
Definition: label.cl:25
#define CHECK_W_INFLOWS(idx, vec)
Definition: label.cl:26
#define CHECK_E_INFLOWS(idx, vec)
Definition: label.cl:22
#define CHECK_SE_INFLOWS(idx, vec)
Definition: label.cl:29
#define CHECK_N_INFLOWS(idx, vec)
Definition: label.cl:24
#define CHECK_NE_INFLOWS(idx, vec)
Definition: label.cl:23
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 ...
Definition: essentials.cl:62
__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...
Definition: label.cl:49
#define CHECK_S_INFLOWS(idx, vec)
Definition: label.cl:28
#define IS_THINCHANNEL
Definition: info.h:97
#define IS_MAJORINFLOW
Definition: info.h:103
#define IS_MAJORCONFLUENCE
Definition: info.h:101