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 .
Search WWH ::




Custom Search