@ -1566,6 +1566,7 @@ struct Device::Impl
version_ = getStrProp ( CL_DEVICE_VERSION ) ;
extensions_ = getStrProp ( CL_DEVICE_EXTENSIONS ) ;
doubleFPConfig_ = getProp < cl_device_fp_config , int > ( CL_DEVICE_DOUBLE_FP_CONFIG ) ;
halfFPConfig_ = getProp < cl_device_fp_config , int > ( CL_DEVICE_HALF_FP_CONFIG ) ;
hostUnifiedMemory_ = getBoolProp ( CL_DEVICE_HOST_UNIFIED_MEMORY ) ;
maxComputeUnits_ = getProp < cl_uint , int > ( CL_DEVICE_MAX_COMPUTE_UNITS ) ;
maxWorkGroupSize_ = getProp < size_t , size_t > ( CL_DEVICE_MAX_WORK_GROUP_SIZE ) ;
@ -1678,6 +1679,7 @@ struct Device::Impl
String version_ ;
std : : string extensions_ ;
int doubleFPConfig_ ;
int halfFPConfig_ ;
bool hostUnifiedMemory_ ;
int maxComputeUnits_ ;
size_t maxWorkGroupSize_ ;
@ -1827,11 +1829,7 @@ int Device::singleFPConfig() const
{ return p ? p - > getProp < cl_device_fp_config , int > ( CL_DEVICE_SINGLE_FP_CONFIG ) : 0 ; }
int Device : : halfFPConfig ( ) const
# ifdef CL_VERSION_1_2
{ return p ? p - > getProp < cl_device_fp_config , int > ( CL_DEVICE_HALF_FP_CONFIG ) : 0 ; }
# else
{ CV_REQUIRE_OPENCL_1_2_ERROR ; }
# endif
{ return p ? p - > halfFPConfig_ : 0 ; }
bool Device : : endianLittle ( ) const
{ return p ? p - > getBoolProp ( CL_DEVICE_ENDIAN_LITTLE ) : false ; }
@ -6668,6 +6666,10 @@ void convertFromImage(void* cl_mem_image, UMat& dst)
depth = CV_32F ;
break ;
case CL_HALF_FLOAT :
depth = CV_16F ;
break ;
default :
CV_Error ( cv : : Error : : OpenCLApiCallError , " Not supported image_channel_data_type " ) ;
}
@ -6676,9 +6678,23 @@ void convertFromImage(void* cl_mem_image, UMat& dst)
switch ( fmt . image_channel_order )
{
case CL_R :
case CL_A :
case CL_INTENSITY :
case CL_LUMINANCE :
type = CV_MAKE_TYPE ( depth , 1 ) ;
break ;
case CL_RG :
case CL_RA :
type = CV_MAKE_TYPE ( depth , 2 ) ;
break ;
// CL_RGB has no mappings to OpenCV types because CL_RGB can only be used with
// CL_UNORM_SHORT_565, CL_UNORM_SHORT_555, or CL_UNORM_INT_101010.
/*case CL_RGB:
type = CV_MAKE_TYPE ( depth , 3 ) ;
break ; */
case CL_RGBA :
case CL_BGRA :
case CL_ARGB :
@ -7068,6 +7084,13 @@ static std::string kerToStr(const Mat & k)
stream < < " DIG( " < < data [ i ] < < " f) " ;
stream < < " DIG( " < < data [ width ] < < " f) " ;
}
else if ( depth = = CV_16F )
{
stream . setf ( std : : ios_base : : showpoint ) ;
for ( int i = 0 ; i < width ; + + i )
stream < < " DIG( " < < ( float ) data [ i ] < < " h) " ;
stream < < " DIG( " < < ( float ) data [ width ] < < " h) " ;
}
else
{
for ( int i = 0 ; i < width ; + + i )
@ -7091,7 +7114,7 @@ String kernelToStr(InputArray _kernel, int ddepth, const char * name)
typedef std : : string ( * func_t ) ( const Mat & ) ;
static const func_t funcs [ ] = { kerToStr < uchar > , kerToStr < char > , kerToStr < ushort > , kerToStr < short > ,
kerToStr < int > , kerToStr < float > , kerToStr < double > , 0 } ;
kerToStr < int > , kerToStr < float > , kerToStr < double > , kerToStr < float16_t > } ;
const func_t func = funcs [ ddepth ] ;
CV_Assert ( func ! = 0 ) ;
@ -7130,14 +7153,14 @@ int predictOptimalVectorWidth(InputArray src1, InputArray src2, InputArray src3,
int vectorWidths [ ] = { d . preferredVectorWidthChar ( ) , d . preferredVectorWidthChar ( ) ,
d . preferredVectorWidthShort ( ) , d . preferredVectorWidthShort ( ) ,
d . preferredVectorWidthInt ( ) , d . preferredVectorWidthFloat ( ) ,
d . preferredVectorWidthDouble ( ) , - 1 } ;
d . preferredVectorWidthDouble ( ) , d . preferredVectorWidthHalf ( ) } ;
// if the device says don't use vectors
if ( vectorWidths [ 0 ] = = 1 )
{
// it's heuristic
vectorWidths [ CV_8U ] = vectorWidths [ CV_8S ] = 4 ;
vectorWidths [ CV_16U ] = vectorWidths [ CV_16S ] = 2 ;
vectorWidths [ CV_16U ] = vectorWidths [ CV_16S ] = vectorWidths [ CV_16F ] = 2 ;
vectorWidths [ CV_32S ] = vectorWidths [ CV_32F ] = vectorWidths [ CV_64F ] = 1 ;
}
@ -7225,10 +7248,12 @@ struct Image2D::Impl
{
cl_image_format format ;
static const int channelTypes [ ] = { CL_UNSIGNED_INT8 , CL_SIGNED_INT8 , CL_UNSIGNED_INT16 ,
CL_SIGNED_INT16 , CL_SIGNED_INT32 , CL_FLOAT , - 1 , - 1 } ;
CL_SIGNED_INT16 , CL_SIGNED_INT32 , CL_FLOAT , - 1 , CL_HALF_FLOAT } ;
static const int channelTypesNorm [ ] = { CL_UNORM_INT8 , CL_SNORM_INT8 , CL_UNORM_INT16 ,
CL_SNORM_INT16 , - 1 , - 1 , - 1 , - 1 } ;
static const int channelOrders [ ] = { - 1 , CL_R , CL_RG , - 1 , CL_RGBA } ;
// CL_RGB has no mappings to OpenCV types because CL_RGB can only be used with
// CL_UNORM_SHORT_565, CL_UNORM_SHORT_555, or CL_UNORM_INT_101010.
static const int channelOrders [ ] = { - 1 , CL_R , CL_RG , /*CL_RGB*/ - 1 , CL_RGBA } ;
int channelType = norm ? channelTypesNorm [ depth ] : channelTypes [ depth ] ;
int channelOrder = channelOrders [ cn ] ;