Graphics Reference
In-Depth Information
kernel void
sobel_char8
(
global const uchar
restrict in
,
//
<
Input .
global char
restrict dx
,
//
<
Xgradient.
global char
restrict dy
,
//
<
Ygradient.
const int
width
)
{
// X and Y gradient accumulators .
short8
_dx
,
_dy
;
// Left , middle and right pixels : loaded as
// unsigned 8
−
bit , converted to signed 16
−
bit .
uchar8
lLoad
,
mLoad
,
rLoad
;
short8
lData
,
mData
,
rData
;
// Compute (column , row) position and off set .
const int
column
=
get global id
(0)
8;
const int
row
=
get global id
(1)
1;
const int
offset
=
row
width
+
column
;
// Compute contribution from f i r s t row .
lLoad
=
vload8
(0,
in
+(
offset
+
width
0+0));
mLoad
=
vload8
(0,
in
+(
offset
+
width
0+1));
rLoad
=
vload8
(0,
in
+(
offset
+
width
0+2));
lData
=
convert short8
(
lLoad
);
mData
=
convert short8
(
mLoad
);
rData
=
convert short8
(
rLoad
);
_dx
=
rData
−
lData
;
_dy
=
rData
+
lData
+
mData
(
short8
)2;
// Compute contribution from second row .
lLoad
=
vload8
(0,
in
+(
offset
+
width
1+0));
rLoad
=
vload8
(0,
in
+(
offset
+
width
1+2));
lData
=
convert short8
(
lLoad
);
rData
=
convert short8
(
rLoad
);
_dx
+= (
rData
−
lData
)
(
short8
)2;
// Compute contribution from third row.
lLoad
=
vload8
(0,
in
+(
offset
+
width
2+0));
mLoad
=
vload8
(0,
in
+(
offset
+
width
2+1));
rLoad
=
vload8
(0,
in
+(
offset
+
width
2+2));
lData
=
convert short8
(
lLoad
);
mData
=
convert short8
(
mLoad
);
rData
=
convert short8
(
rLoad
);
_dx
+=
rData
−
lData
;
_dy
−
=
rData
+
lData
+
mData
(
short8
)2;
// Store the results .
vstore8
(
convert char8
(
_dx
>>
3) , 0,
dx
+
offset
+
width
+1);
vstore8
(
convert char8
(
_dy
>>
3) , 0,
dy
+
offset
+
width
+1);
}
Listing 7.2.
Initial vector implementation:
char8
.