__kernel void upsample_2x(省略参数...) {
int dx = get_global_id(0);
int dy = get_global_id(1);
float scale = 0.5f;
float sx = (dx + 0.5f) * (float)scale - 0.5f;
float sy = (dy + 0.5f) * (float)scale - 0.5f;
int x = floor(sx);
int y = floor(sy);
float u = sx - x;
float v = sy - y;
if (x < 0) {
x = 0, u = 0;
}
if (x >= width) {
x = width - 1, u = 0;
}
if (y < 0) {
y = 0, v = 0;
}
if (y >= height) {
y = height - 1, v = 0;
}
float u1 = 1.0f - u;
float v1 = 1.0f - v;
int x_ = min(x + 1, width - 1);
int y_ = min(y + 1, height - 1);
for (int cn = 0; cn < channel; cn++) {
float data00 = convert_float(gaussianMat[mad24(y, width, x) * channel + cn]);
float data10 = convert_float(gaussianMat[mad24(y, width, x_) * channel + cn]);
float data01 = convert_float(gaussianMat[mad24(y_, width, x) * channel + cn]);
float data11 = convert_float(gaussianMat[mad24(y_, width, x_) * channel + cn]);
half value_reup = convert_half(v1 * (u1 * data00 + u * data10) + v * (u1 * data01 + u * data11));
}
}
__kernel void resize(省略参数...)
{
int dx = get_global_id(0);
int dy = get_global_id(1);
__global const half* pSrc = src + mad24(offsetY, src_step, offsetX);
float sx = (dx + 0.5f) * (float)ifx - 0.5f;
float sy = (dy + 0.5f) * (float)ify - 0.5f;
int x = floor(sx);
int y = floor(sy);
float u = sx - x;
float v = sy - y;
if(x < 0){x = 0, u = 0;}
if(x >= src_w) {x = src_w - 1, u = 0;}
if(y < 0) {y = 0, v = 0;}
if(y >= src_h) {y = src_h - 1, v = 0;}
float u1 = 1.0f - u;
float v1 = 1.0f - v;
int x_ = min(x + 1, src_w - 1);
int y_ = min(y + 1, src_h - 1);
float data00 = convert_float(pSrc[mad24(y, src_step, x )]);
float data10 = convert_float(pSrc[mad24(y, src_step, x_)]);
float data01 = convert_float(pSrc[mad24(y_, src_step, x )]);
float data11 = convert_float(pSrc[mad24(y_, src_step, x_)]);
float val = v1 * (u1 * data00 + u * data10) + v * (u1 * data01 + u * data11);
return;
}