17 #include "qgssettings.h" 
   23 #include <QTextStream> 
   32 QLatin1String QgsOpenClUtils::SETTINGS_GLOBAL_ENABLED_KEY = QLatin1String( 
"OpenClEnabled" );
 
   33 QLatin1String QgsOpenClUtils::SETTINGS_DEFAULT_DEVICE_KEY = QLatin1String( 
"OpenClDefaultDevice" );
 
   35 bool QgsOpenClUtils::sAvailable = 
false;
 
   42   std::vector<cl::Platform> platforms;
 
   43   cl::Platform::get( &platforms );
 
   44   std::vector<cl::Device> existingDevices;
 
   45   for ( 
auto &p : platforms )
 
   47     std::string platver = p.getInfo<CL_PLATFORM_VERSION>();
 
   49                                .arg( QString::fromStdString( platver ),
 
   50                                      QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ),
 
   52     if ( platver.find( 
"OpenCL " ) != std::string::npos )
 
   54       std::vector<cl::Device> _devices;
 
   58         p.getDevices( CL_DEVICE_TYPE_ALL, &_devices );
 
   60       catch ( cl::Error &e )
 
   63                                    .arg( errorText( e.err() ),
 
   64                                          QString::fromStdString( e.what() ),
 
   65                                          QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ), LOGMESSAGE_TAG );
 
   67       if ( _devices.size() > 0 )
 
   69         for ( 
unsigned long i = 0; i < _devices.size(); i++ )
 
   72                                      .arg( deviceId( _devices[i] ) ), LOGMESSAGE_TAG );
 
   73           existingDevices.push_back( _devices[i] );
 
   78   return existingDevices;
 
   81 void QgsOpenClUtils::init()
 
   83   static std::once_flag initialized;
 
   84   std::call_once( initialized, [ = ]( )
 
   87     QLibrary openCLLib { QStringLiteral( 
"/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL" ) };
 
   89     QLibrary openCLLib { QStringLiteral( 
"OpenCL" ) };
 
   91     openCLLib.setLoadHints( QLibrary::LoadHint::ResolveAllSymbolsHint );
 
   92     if ( ! openCLLib.load() )
 
   95                                  .arg( openCLLib.errorString() ),
 
  101     HMODULE hModule = GetModuleHandle( 
"OpenCL.dll" );
 
  104       TCHAR pszFileName[1024];
 
  105       if ( GetModuleFileName( hModule, pszFileName, 1024 ) < 1024 )
 
  110         DWORD dwLen = GetFileVersionInfoSize( pszFileName, &dwUseless );
 
  113           LPTSTR lpVI = ( LPSTR ) malloc( dwLen );
 
  116             if ( GetFileVersionInfo( pszFileName, NULL, dwLen, lpVI ) )
 
  118               VS_FIXEDFILEINFO *lpFFI;
 
  119               if ( VerQueryValue( lpVI, 
"\\", ( LPVOID * ) &lpFFI, ( UINT * ) &dwUseless ) )
 
  122                                            .arg( lpFFI->dwProductVersionMS >> 16 )
 
  123                                            .arg( lpFFI->dwProductVersionMS & 0xffff )
 
  124                                            .arg( lpFFI->dwProductVersionLS >> 16 )
 
  128               struct LANGANDCODEPAGE
 
  136               if ( VerQueryValue( lpVI, _T( 
"\\VarFileInfo\\Translation" ), ( LPVOID * ) &lpTranslate, ( UINT * ) &cbTranslate ) && cbTranslate >= 
sizeof( 
struct LANGANDCODEPAGE ) )
 
  138                 QStringList items = QStringList()
 
  139                                     << QStringLiteral( 
"Comments" )
 
  140                                     << QStringLiteral( 
"InternalName" )
 
  141                                     << QStringLiteral( 
"ProductName" )
 
  142                                     << QStringLiteral( 
"CompanyName" )
 
  143                                     << QStringLiteral( 
"LegalCopyright" )
 
  144                                     << QStringLiteral( 
"ProductVersion" )
 
  145                                     << QStringLiteral( 
"FileDescription" )
 
  146                                     << QStringLiteral( 
"LegalTrademarks" )
 
  147                                     << QStringLiteral( 
"PrivateBuild" )
 
  148                                     << QStringLiteral( 
"FileVersion" )
 
  149                                     << QStringLiteral( 
"OriginalFilename" )
 
  150                                     << QStringLiteral( 
"SpecialBuild" );
 
  151                 for ( 
auto d : items )
 
  154                   QString subBlock = QString( QStringLiteral( 
"\\StringFileInfo\\%1%2\\%3" ) )
 
  155                                      .arg( lpTranslate[0].wLanguage, 4, 16, QLatin1Char( 
'0' ) )
 
  156                                      .arg( lpTranslate[0].wCodePage, 4, 16, QLatin1Char( 
'0' ) )
 
  159                   QgsDebugMsg( QString( 
"d:%1 subBlock:%2" ).arg( d ).arg( subBlock ) );
 
  161                   BOOL r = VerQueryValue( lpVI, subBlock.toUtf8(), ( LPVOID * )&lpBuffer, ( UINT * )&dwUseless );
 
  163                   if ( r && lpBuffer && lpBuffer != INVALID_HANDLE_VALUE && dwUseless < 1023 )
 
  190     catch ( cl::Error &e )
 
  193                                  .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  202   return *sSourcePath();
 
  207   *sSourcePath() = value;
 
  222         return QString::fromStdString( device.getInfo<CL_DEVICE_VENDOR>() );
 
  224         return QString::fromStdString( device.getInfo<CL_DEVICE_PROFILE>() );
 
  226         return QString::fromStdString( device.getInfo<CL_DEVICE_VERSION>() );
 
  227       case Info::ImageSupport:
 
  228         return device.getInfo<CL_DEVICE_IMAGE_SUPPORT>() ? QStringLiteral( 
"True" ) : QStringLiteral( 
"False" );
 
  229       case Info::Image2dMaxHeight:
 
  230         return QString::number( device.getInfo<CL_DEVICE_IMAGE2D_MAX_HEIGHT>() );
 
  231       case Info::MaxMemAllocSize:
 
  232         return QString::number( device.getInfo<CL_DEVICE_MAX_MEM_ALLOC_SIZE>() );
 
  233       case Info::Image2dMaxWidth:
 
  234         return QString::number( device.getInfo<CL_DEVICE_IMAGE2D_MAX_WIDTH>() );
 
  237         unsigned long type( device.getInfo<CL_DEVICE_TYPE>() );
 
  241           case CL_DEVICE_TYPE_CPU:
 
  242             mappedType = QgsOpenClUtils::HardwareType::CPU;
 
  244           case CL_DEVICE_TYPE_GPU:
 
  245             mappedType = QgsOpenClUtils::HardwareType::GPU;
 
  248             mappedType = QgsOpenClUtils::HardwareType::Other;
 
  250         QMetaEnum metaEnum = QMetaEnum::fromType<QgsOpenClUtils::HardwareType>();
 
  251         return metaEnum.valueToKey( mappedType );
 
  254         return QString::fromStdString( device.getInfo<CL_DEVICE_NAME>() );
 
  257   catch ( cl::Error &e )
 
  260     QgsDebugMsgLevel( QStringLiteral( 
"Error %1 getting info for OpenCL device: %2" )
 
  261                       .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  271   return QgsSettings().value( SETTINGS_GLOBAL_ENABLED_KEY, 
false, QgsSettings::Section::Core ).toBool();
 
  276   return cl::Device::getDefault();
 
  282   if ( cl::Platform::getDefault()() )
 
  284     std::string platver = cl::Platform::getDefault().getInfo<CL_PLATFORM_VERSION>();
 
  285     if ( platver.find( 
"OpenCL " ) != std::string::npos )
 
  287       version = QString::fromStdString( platver.substr( 7 ) ).split( 
' ' ).first();
 
  295   QgsSettings().setValue( SETTINGS_DEFAULT_DEVICE_KEY, 
deviceId, QgsSettings::Section::Core );
 
  300   return QgsSettings().value( SETTINGS_DEFAULT_DEVICE_KEY, QString( ), QgsSettings::Section::Core ).toString();
 
  305   return QStringLiteral( 
"%1|%2|%3|%4" )
 
  306          .arg( 
deviceInfo( QgsOpenClUtils::Info::Name, device ) )
 
  307          .arg( 
deviceInfo( QgsOpenClUtils::Info::Vendor, device ) )
 
  308          .arg( 
deviceInfo( QgsOpenClUtils::Info::Version, device ) )
 
  309          .arg( 
deviceInfo( QgsOpenClUtils::Info::Type, device ) );
 
  312 bool QgsOpenClUtils::activate( 
const QString &preferredDeviceId )
 
  321     std::vector<cl::Platform> platforms;
 
  322     cl::Platform::get( &platforms );
 
  325     bool deviceFound = 
false;
 
  326     for ( 
auto &p : platforms )
 
  330       std::string platver = p.getInfo<CL_PLATFORM_VERSION>();
 
  331       QgsDebugMsg( QStringLiteral( 
"Found OpenCL platform %1: %2" ).arg( QString::fromStdString( platver ), QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ) );
 
  332       if ( platver.find( 
"OpenCL " ) != std::string::npos )
 
  334         std::vector<cl::Device> 
devices;
 
  338           p.getDevices( CL_DEVICE_TYPE_ALL, &
devices );
 
  340           if ( ! preferredDeviceId.isEmpty() )
 
  342             for ( 
const auto &_dev : 
devices )
 
  344               if ( preferredDeviceId == 
deviceId( _dev ) )
 
  357             for ( 
const auto &_dev : 
devices )
 
  359               if ( _dev.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_GPU )
 
  372             for ( 
const auto &_dev : 
devices )
 
  374               if ( _dev.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_CPU )
 
  389         catch ( cl::Error &e )
 
  391           QgsDebugMsg( QStringLiteral( 
"Error %1 on platform %3 searching for OpenCL device: %2" )
 
  393                              QString::fromStdString( e.what() ),
 
  394                              QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ) );
 
  406       cl::Platform newP = cl::Platform::setDefault( plat );
 
  415         cl::Device::setDefault( dev );
 
  417                                    .arg( QString::fromStdString( dev.getInfo<CL_DEVICE_NAME>() ) ),
 
  424   catch ( cl::Error &e )
 
  427                                .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  436   return QStringLiteral(
 
  437            "Type: <b>%9</b><br>" 
  438            "Name: <b>%1</b><br>" 
  439            "Vendor: <b>%2</b><br>" 
  440            "Profile: <b>%3</b><br>" 
  441            "Version: <b>%4</b><br>" 
  442            "Image support: <b>%5</b><br>" 
  443            "Max image2d width: <b>%6</b><br>" 
  444            "Max image2d height: <b>%7</b><br>" 
  445            "Max mem alloc size: <b>%8</b><br>" 
  459   for ( 
const auto &dev : 
devices( ) )
 
  475   QgsSettings().setValue( SETTINGS_GLOBAL_ENABLED_KEY, 
enabled, QgsSettings::Section::Core );
 
  486   if ( file.open( QFile::ReadOnly | QFile::Text ) )
 
  488     QTextStream in( &file );
 
  489     source_str = in.readAll();
 
  501   QString path = QStringLiteral( 
"%1/%2.cl" ).arg( 
sourcePath(), baseName );
 
  507   cl::BuildLogType build_logs = error.getBuildLog();
 
  509   if ( build_logs.size() > 0 )
 
  510     build_log = QString::fromStdString( build_logs[0].second );
 
  518     case 0: 
return QStringLiteral( 
"CL_SUCCESS" );
 
  519     case -1: 
return QStringLiteral( 
"CL_DEVICE_NOT_FOUND" );
 
  520     case -2: 
return QStringLiteral( 
"CL_DEVICE_NOT_AVAILABLE" );
 
  521     case -3: 
return QStringLiteral( 
"CL_COMPILER_NOT_AVAILABLE" );
 
  522     case -4: 
return QStringLiteral( 
"CL_MEM_OBJECT_ALLOCATION_FAILURE" );
 
  523     case -5: 
return QStringLiteral( 
"CL_OUT_OF_RESOURCES" );
 
  524     case -6: 
return QStringLiteral( 
"CL_OUT_OF_HOST_MEMORY" );
 
  525     case -7: 
return QStringLiteral( 
"CL_PROFILING_INFO_NOT_AVAILABLE" );
 
  526     case -8: 
return QStringLiteral( 
"CL_MEM_COPY_OVERLAP" );
 
  527     case -9: 
return QStringLiteral( 
"CL_IMAGE_FORMAT_MISMATCH" );
 
  528     case -10: 
return QStringLiteral( 
"CL_IMAGE_FORMAT_NOT_SUPPORTED" );
 
  529     case -12: 
return QStringLiteral( 
"CL_MAP_FAILURE" );
 
  530     case -13: 
return QStringLiteral( 
"CL_MISALIGNED_SUB_BUFFER_OFFSET" );
 
  531     case -14: 
return QStringLiteral( 
"CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST" );
 
  532     case -15: 
return QStringLiteral( 
"CL_COMPILE_PROGRAM_FAILURE" );
 
  533     case -16: 
return QStringLiteral( 
"CL_LINKER_NOT_AVAILABLE" );
 
  534     case -17: 
return QStringLiteral( 
"CL_LINK_PROGRAM_FAILURE" );
 
  535     case -18: 
return QStringLiteral( 
"CL_DEVICE_PARTITION_FAILED" );
 
  536     case -19: 
return QStringLiteral( 
"CL_KERNEL_ARG_INFO_NOT_AVAILABLE" );
 
  537     case -30: 
return QStringLiteral( 
"CL_INVALID_VALUE" );
 
  538     case -31: 
return QStringLiteral( 
"CL_INVALID_DEVICE_TYPE" );
 
  539     case -32: 
return QStringLiteral( 
"CL_INVALID_PLATFORM" );
 
  540     case -33: 
return QStringLiteral( 
"CL_INVALID_DEVICE" );
 
  541     case -34: 
return QStringLiteral( 
"CL_INVALID_CONTEXT" );
 
  542     case -35: 
return QStringLiteral( 
"CL_INVALID_QUEUE_PROPERTIES" );
 
  543     case -36: 
return QStringLiteral( 
"CL_INVALID_COMMAND_QUEUE" );
 
  544     case -37: 
return QStringLiteral( 
"CL_INVALID_HOST_PTR" );
 
  545     case -38: 
return QStringLiteral( 
"CL_INVALID_MEM_OBJECT" );
 
  546     case -39: 
return QStringLiteral( 
"CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" );
 
  547     case -40: 
return QStringLiteral( 
"CL_INVALID_IMAGE_SIZE" );
 
  548     case -41: 
return QStringLiteral( 
"CL_INVALID_SAMPLER" );
 
  549     case -42: 
return QStringLiteral( 
"CL_INVALID_BINARY" );
 
  550     case -43: 
return QStringLiteral( 
"CL_INVALID_BUILD_OPTIONS" );
 
  551     case -44: 
return QStringLiteral( 
"CL_INVALID_PROGRAM" );
 
  552     case -45: 
return QStringLiteral( 
"CL_INVALID_PROGRAM_EXECUTABLE" );
 
  553     case -46: 
return QStringLiteral( 
"CL_INVALID_KERNEL_NAME" );
 
  554     case -47: 
return QStringLiteral( 
"CL_INVALID_KERNEL_DEFINITION" );
 
  555     case -48: 
return QStringLiteral( 
"CL_INVALID_KERNEL" );
 
  556     case -49: 
return QStringLiteral( 
"CL_INVALID_ARG_INDEX" );
 
  557     case -50: 
return QStringLiteral( 
"CL_INVALID_ARG_VALUE" );
 
  558     case -51: 
return QStringLiteral( 
"CL_INVALID_ARG_SIZE" );
 
  559     case -52: 
return QStringLiteral( 
"CL_INVALID_KERNEL_ARGS" );
 
  560     case -53: 
return QStringLiteral( 
"CL_INVALID_WORK_DIMENSION" );
 
  561     case -54: 
return QStringLiteral( 
"CL_INVALID_WORK_GROUP_SIZE" );
 
  562     case -55: 
return QStringLiteral( 
"CL_INVALID_WORK_ITEM_SIZE" );
 
  563     case -56: 
return QStringLiteral( 
"CL_INVALID_GLOBAL_OFFSET" );
 
  564     case -57: 
return QStringLiteral( 
"CL_INVALID_EVENT_WAIT_LIST" );
 
  565     case -58: 
return QStringLiteral( 
"CL_INVALID_EVENT" );
 
  566     case -59: 
return QStringLiteral( 
"CL_INVALID_OPERATION" );
 
  567     case -60: 
return QStringLiteral( 
"CL_INVALID_GL_OBJECT" );
 
  568     case -61: 
return QStringLiteral( 
"CL_INVALID_BUFFER_SIZE" );
 
  569     case -62: 
return QStringLiteral( 
"CL_INVALID_MIP_LEVEL" );
 
  570     case -63: 
return QStringLiteral( 
"CL_INVALID_GLOBAL_WORK_SIZE" );
 
  571     case -64: 
return QStringLiteral( 
"CL_INVALID_PROPERTY" );
 
  572     case -65: 
return QStringLiteral( 
"CL_INVALID_IMAGE_DESCRIPTOR" );
 
  573     case -66: 
return QStringLiteral( 
"CL_INVALID_COMPILER_OPTIONS" );
 
  574     case -67: 
return QStringLiteral( 
"CL_INVALID_LINKER_OPTIONS" );
 
  575     case -68: 
return QStringLiteral( 
"CL_INVALID_DEVICE_PARTITION_COUNT" );
 
  576     case -69: 
return QStringLiteral( 
"CL_INVALID_PIPE_SIZE" );
 
  577     case -70: 
return QStringLiteral( 
"CL_INVALID_DEVICE_QUEUE" );
 
  578     case -71: 
return QStringLiteral( 
"CL_INVALID_SPEC_ID" );
 
  579     case -72: 
return QStringLiteral( 
"CL_MAX_SIZE_RESTRICTION_EXCEEDED" );
 
  580     case -1002: 
return QStringLiteral( 
"CL_INVALID_D3D10_DEVICE_KHR" );
 
  581     case -1003: 
return QStringLiteral( 
"CL_INVALID_D3D10_RESOURCE_KHR" );
 
  582     case -1004: 
return QStringLiteral( 
"CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR" );
 
  583     case -1005: 
return QStringLiteral( 
"CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR" );
 
  584     case -1006: 
return QStringLiteral( 
"CL_INVALID_D3D11_DEVICE_KHR" );
 
  585     case -1007: 
return QStringLiteral( 
"CL_INVALID_D3D11_RESOURCE_KHR" );
 
  586     case -1008: 
return QStringLiteral( 
"CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR" );
 
  587     case -1009: 
return QStringLiteral( 
"CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR" );
 
  588     case -1010: 
return QStringLiteral( 
"CL_INVALID_DX9_MEDIA_ADAPTER_KHR" );
 
  589     case -1011: 
return QStringLiteral( 
"CL_INVALID_DX9_MEDIA_SURFACE_KHR" );
 
  590     case -1012: 
return QStringLiteral( 
"CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR" );
 
  591     case -1013: 
return QStringLiteral( 
"CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR" );
 
  592     case -1093: 
return QStringLiteral( 
"CL_INVALID_EGL_OBJECT_KHR" );
 
  593     case -1092: 
return QStringLiteral( 
"CL_EGL_RESOURCE_NOT_ACQUIRED_KHR" );
 
  594     case -1001: 
return QStringLiteral( 
"CL_PLATFORM_NOT_FOUND_KHR" );
 
  595     case -1057: 
return QStringLiteral( 
"CL_DEVICE_PARTITION_FAILED_EXT" );
 
  596     case -1058: 
return QStringLiteral( 
"CL_INVALID_PARTITION_COUNT_EXT" );
 
  597     case -1059: 
return QStringLiteral( 
"CL_INVALID_PARTITION_NAME_EXT" );
 
  598     case -1094: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_INTEL" );
 
  599     case -1095: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_TYPE_INTEL" );
 
  600     case -1096: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL" );
 
  601     case -1097: 
return QStringLiteral( 
"CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL" );
 
  602     case -1000: 
return QStringLiteral( 
"CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR" );
 
  603     case -1098: 
return QStringLiteral( 
"CL_INVALID_VA_API_MEDIA_ADAPTER_INTEL" );
 
  604     case -1099: 
return QStringLiteral( 
"CL_INVALID_VA_API_MEDIA_SURFACE_INTEL" );
 
  605     case -1100: 
return QStringLiteral( 
"CL_VA_API_MEDIA_SURFACE_ALREADY_ACQUIRED_INTEL" );
 
  606     case -1101: 
return QStringLiteral( 
"CL_VA_API_MEDIA_SURFACE_NOT_ACQUIRED_INTEL" );
 
  607     default: 
return QStringLiteral( 
"CL_UNKNOWN_ERROR" );
 
  619     return cl::CommandQueue( 
context );
 
  624     cl_command_queue_properties properties = 0;
 
  626     cl_command_queue queue = clCreateCommandQueue( 
context(), device(),  properties, 
nullptr );
 
  628     return cl::CommandQueue( queue, 
true );
 
  635   static std::once_flag contextCreated;
 
  636   std::call_once( contextCreated, [ = ]()
 
  638     if ( 
available() && cl::Platform::getDefault()() && cl::Device::getDefault()() )
 
  640       context = cl::Context( cl::Device::getDefault() );
 
  662     if ( ok && version < 2.0f )
 
  664       program.build( QStringLiteral( 
"-cl-std=CL%1 -I\"%2\"" )
 
  670       program.build( QStringLiteral( 
"-I\"%1\"" )
 
  674   catch ( cl::BuildError &e )
 
  677     if ( build_log.isEmpty() )
 
  678       build_log = QObject::tr( 
"Build logs not available!" );
 
  679     QString err = QObject::tr( 
"Error building OpenCL program: %1" )
 
  682     if ( exceptionBehavior == 
Throw )
 
  685   catch ( cl::Error &e )
 
  687     QString err = QObject::tr( 
"Error %1 building OpenCL program in %2" )
 
  688                   .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) );
 
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
The QgsOpenClUtils class is responsible for common OpenCL operations such as.
static Q_DECL_DEPRECATED cl::Program buildProgram(const cl::Context &context, const QString &source, ExceptionBehavior exceptionBehavior=Catch)
Build the program from source in the given context and depending on exceptionBehavior can throw or ca...
static void setSourcePath(const QString &value)
Set the base path to OpenCL program directory.
static QString buildLog(cl::BuildError &error)
Extract and return the build log error from error.
static void storePreferredDevice(const QString deviceId)
Store in the settings the preferred deviceId device identifier.
static QString sourcePath()
Returns the base path to OpenCL program directory.
static cl::Context context()
Context factory.
static cl::Device activeDevice()
Returns the active device.
static bool enabled()
Returns true if OpenCL is enabled in the user settings.
static bool available()
Checks whether a suitable OpenCL platform and device is available on this system and initialize the Q...
static QString deviceDescription(const cl::Device device)
Returns a formatted description for the device.
static QString activeDeviceInfo(const Info infoType=Info::Name)
Returns infoType information about the active (default) device.
static const std::vector< cl::Device > devices()
Returns a list of OpenCL devices found on this sysytem.
static void setEnabled(bool enabled)
Set the OpenCL user setting to enabled.
static QString preferredDevice()
Read from the settings the preferred device identifier.
static QString deviceInfo(const Info infoType, cl::Device device)
Returns infoType information about the device.
static QString errorText(const int errorCode)
Returns a string representation from an OpenCL errorCode.
static cl::CommandQueue commandQueue()
Create an OpenCL command queue from the default context.
static QString sourceFromPath(const QString &path)
Read an OpenCL source file from path.
static QString sourceFromBaseName(const QString &baseName)
Returns the full path to a an OpenCL source file from the baseName ('.cl' extension is automatically ...
ExceptionBehavior
The ExceptionBehavior enum define how exceptions generated by OpenCL should be treated.
@ Throw
Write errors in the message log and re-throw exceptions.
static QString deviceId(const cl::Device device)
Create a string identifier from a device.
Info
The Info enum maps to OpenCL info constants.
static QLatin1String LOGMESSAGE_TAG
OpenCL string for message logs.
static QString activePlatformVersion()
Returns the active platform OpenCL version string (e.g.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)
#define QgsDebugMsgLevel(str, level)