Compute Library  17.09
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fill_border.cl
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, 2017 ARM Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #include "helpers.h"
25 
26 #if defined(FIXED_POINT_POSITION)
27 #include "fixed_point.h"
28 #endif /* FIXED_POINT_POSITION */
29 
52  uint width,
53  uint height,
54  int2 start_pos)
55 {
57 
58  // Update pointer to point to the starting point of the valid region
59  buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x;
60 
61  const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT;
62  const int gid0 = get_global_id(0);
63  const int gidH = gid0 - total_width;
64  const int gidW = gid0 - BORDER_SIZE_LEFT;
65 
66  if(gidH >= 0)
67  {
68  // Handle left border
69  DATA_TYPE left_val = *(__global DATA_TYPE *)offset(&buf, 0, gidH);
70  for(int i = -BORDER_SIZE_LEFT; i < 0; ++i)
71  {
72  *(__global DATA_TYPE *)offset(&buf, i, gidH) = left_val;
73  }
74  // Handle right border
75  DATA_TYPE right_val = *(__global DATA_TYPE *)offset(&buf, width - 1, gidH);
76  for(int i = 0; i < BORDER_SIZE_RIGHT; ++i)
77  {
78  *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = right_val;
79  }
80  }
81  else
82  {
83  // Get value for corners
84  int val_idx = gidW;
85  if(gidW < 0 || gidW > (width - 1))
86  {
87  val_idx = gidW < 0 ? 0 : width - 1;
88  }
89 
90  // Handle top border
91  DATA_TYPE top_val = *(__global DATA_TYPE *)offset(&buf, val_idx, 0);
92  for(int i = -BORDER_SIZE_TOP; i < 0; ++i)
93  {
94  *(__global DATA_TYPE *)offset(&buf, gidW, i) = top_val;
95  }
96  // Handle bottom border
97  DATA_TYPE bottom_val = *(__global DATA_TYPE *)offset(&buf, val_idx, height - 1);
98  for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i)
99  {
100  *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = bottom_val;
101  }
102  }
103 }
104 
128  uint width,
129  uint height,
130  int2 start_pos,
131  DATA_TYPE constant_value)
132 {
134 
135  // Update pointer to point to the starting point of the valid region
136  buf.ptr += start_pos.y * buf.stride_y + start_pos.x * buf.stride_x;
137 
138  const int total_width = BORDER_SIZE_LEFT + width + BORDER_SIZE_RIGHT;
139  const int gid0 = get_global_id(0);
140  const int gidH = gid0 - total_width;
141  const int gidW = gid0 - BORDER_SIZE_LEFT;
142 
143  if(gidH >= 0)
144  {
145  // Handle left border
146  for(int i = -BORDER_SIZE_LEFT; i < 0; ++i)
147  {
148  *(__global DATA_TYPE *)offset(&buf, i, gidH) = constant_value;
149  }
150  // Handle right border
151  for(int i = 0; i < BORDER_SIZE_RIGHT; ++i)
152  {
153  *(__global DATA_TYPE *)offset(&buf, width + i, gidH) = constant_value;
154  }
155  }
156  else
157  {
158  // Handle top border
159  for(int i = -BORDER_SIZE_TOP; i < 0; ++i)
160  {
161  *(__global DATA_TYPE *)offset(&buf, gidW, i) = constant_value;
162  }
163  // Handle bottom border
164  for(int i = 0; i < BORDER_SIZE_BOTTOM; ++i)
165  {
166  *(__global DATA_TYPE *)offset(&buf, gidW, height + i) = constant_value;
167  }
168  }
169 }
#define CONVERT_TENSOR3D_TO_IMAGE_STRUCT_NO_STEP(name)
Definition: helpers.h:102
#define DATA_TYPE
__global uchar * offset(const Image *img, int x, int y)
Get the pointer position of a Image.
Definition: helpers.h:292
__kernel void fill_image_borders_constant(__global uchar *buf_ptr, uint buf_stride_x, uint buf_step_x, uint buf_stride_y, uint buf_step_y, uint buf_stride_z, uint buf_step_z, uint buf_offset_first_element_in_bytes, uint width, uint height, int2 start_pos, DATA_TYPE constant_value)
Fill N pixels of the padding edge of a single channel image with a constant value.
Definition: fill_border.cl:126
Structure to hold Image information.
Definition: helpers.h:131
#define TENSOR3D_DECLARATION(name)
Definition: helpers.h:65
__global uchar * ptr
Pointer to the starting postion of the buffer.
Definition: helpers.h:133
__kernel void fill_image_borders_replicate(__global uchar *buf_ptr, uint buf_stride_x, uint buf_step_x, uint buf_stride_y, uint buf_step_y, uint buf_stride_z, uint buf_step_z, uint buf_offset_first_element_in_bytes, uint width, uint height, int2 start_pos)
Fill N pixel of the padding edge of a single channel image by replicating the closest valid pixel...
Definition: fill_border.cl:50
int stride_y
Stride of the image in Y dimension (in bytes)
Definition: helpers.h:136
int stride_x
Stride of the image in X dimension (in bytes)
Definition: helpers.h:135