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 ( 
const auto &p : platforms )
 
   47     const std::string platver = p.getInfo<CL_PLATFORM_VERSION>();
 
   49                                .arg( QString::fromStdString( platver ),
 
   50                                      QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ),
 
   51                                LOGMESSAGE_TAG, Qgis::MessageLevel::Info );
 
   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>() ) ),
 
   66                                    LOGMESSAGE_TAG, Qgis::MessageLevel::Warning );
 
   68       if ( _devices.size() > 0 )
 
   70         for ( 
unsigned long i = 0; i < _devices.size(); i++ )
 
   73                                      .arg( deviceId( _devices[i] ) ),
 
   74                                      LOGMESSAGE_TAG, Qgis::MessageLevel::Info );
 
   75           existingDevices.push_back( _devices[i] );
 
   80   return existingDevices;
 
   83 void QgsOpenClUtils::init()
 
   85   static std::once_flag initialized;
 
   86   std::call_once( initialized, [ = ]( )
 
   89     QLibrary openCLLib { QStringLiteral( 
"/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL" ) };
 
   91     QLibrary openCLLib { QStringLiteral( 
"OpenCL" ) };
 
   93     openCLLib.setLoadHints( QLibrary::LoadHint::ResolveAllSymbolsHint );
 
   94     if ( ! openCLLib.load() )
 
   97                                  .arg( openCLLib.errorString() ),
 
  103     HMODULE hModule = GetModuleHandle( 
"OpenCL.dll" );
 
  106       TCHAR pszFileName[1024];
 
  107       if ( GetModuleFileName( hModule, pszFileName, 1024 ) < 1024 )
 
  114         DWORD dwLen = GetFileVersionInfoSize( pszFileName, &dwUseless );
 
  117           LPTSTR lpVI = ( LPSTR ) malloc( dwLen );
 
  120             if ( GetFileVersionInfo( pszFileName, NULL, dwLen, lpVI ) )
 
  122               VS_FIXEDFILEINFO *lpFFI;
 
  123               if ( VerQueryValue( lpVI, 
"\\", ( LPVOID * ) &lpFFI, ( UINT * ) &dwUseless ) )
 
  126                                            .arg( lpFFI->dwProductVersionMS >> 16 )
 
  127                                            .arg( lpFFI->dwProductVersionMS & 0xffff )
 
  128                                            .arg( lpFFI->dwProductVersionLS >> 16 )
 
  129                                            .arg( lpFFI->dwProductVersionLS & 0xffff ),
 
  133               struct LANGANDCODEPAGE
 
  141               if ( VerQueryValue( lpVI, _T( 
"\\VarFileInfo\\Translation" ), ( LPVOID * ) &lpTranslate, ( UINT * ) &cbTranslate ) && cbTranslate >= 
sizeof( 
struct LANGANDCODEPAGE ) )
 
  143                 QStringList items = QStringList()
 
  144                                     << QStringLiteral( 
"Comments" )
 
  145                                     << QStringLiteral( 
"InternalName" )
 
  146                                     << QStringLiteral( 
"ProductName" )
 
  147                                     << QStringLiteral( 
"CompanyName" )
 
  148                                     << QStringLiteral( 
"LegalCopyright" )
 
  149                                     << QStringLiteral( 
"ProductVersion" )
 
  150                                     << QStringLiteral( 
"FileDescription" )
 
  151                                     << QStringLiteral( 
"LegalTrademarks" )
 
  152                                     << QStringLiteral( 
"PrivateBuild" )
 
  153                                     << QStringLiteral( 
"FileVersion" )
 
  154                                     << QStringLiteral( 
"OriginalFilename" )
 
  155                                     << QStringLiteral( 
"SpecialBuild" );
 
  156                 for ( 
auto d : items )
 
  159                   QString subBlock = QString( QStringLiteral( 
"\\StringFileInfo\\%1%2\\%3" ) )
 
  160                                      .arg( lpTranslate[0].wLanguage, 4, 16, QLatin1Char( 
'0' ) )
 
  161                                      .arg( lpTranslate[0].wCodePage, 4, 16, QLatin1Char( 
'0' ) )
 
  164                   QgsDebugMsg( QString( 
"d:%1 subBlock:%2" ).arg( d ).arg( subBlock ) );
 
  166                   BOOL r = VerQueryValue( lpVI, subBlock.toUtf8(), ( LPVOID * )&lpBuffer, ( UINT * )&dwUseless );
 
  168                   if ( r && lpBuffer && lpBuffer != INVALID_HANDLE_VALUE && dwUseless < 1023 )
 
  172                                                .arg( QString::fromLocal8Bit( lpBuffer ) ),
 
  198     catch ( cl::Error &e )
 
  201                                  .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  210   return *sSourcePath();
 
  215   *sSourcePath() = value;
 
  230         return QString::fromStdString( device.getInfo<CL_DEVICE_VENDOR>() );
 
  232         return QString::fromStdString( device.getInfo<CL_DEVICE_PROFILE>() );
 
  234         return QString::fromStdString( device.getInfo<CL_DEVICE_VERSION>() );
 
  235       case Info::ImageSupport:
 
  236         return device.getInfo<CL_DEVICE_IMAGE_SUPPORT>() ? QStringLiteral( 
"True" ) : QStringLiteral( 
"False" );
 
  237       case Info::Image2dMaxHeight:
 
  238         return QString::number( device.getInfo<CL_DEVICE_IMAGE2D_MAX_HEIGHT>() );
 
  239       case Info::MaxMemAllocSize:
 
  240         return QString::number( device.getInfo<CL_DEVICE_MAX_MEM_ALLOC_SIZE>() );
 
  241       case Info::Image2dMaxWidth:
 
  242         return QString::number( device.getInfo<CL_DEVICE_IMAGE2D_MAX_WIDTH>() );
 
  245         const unsigned long type( device.getInfo<CL_DEVICE_TYPE>() );
 
  249           case CL_DEVICE_TYPE_CPU:
 
  250             mappedType = QgsOpenClUtils::HardwareType::CPU;
 
  252           case CL_DEVICE_TYPE_GPU:
 
  253             mappedType = QgsOpenClUtils::HardwareType::GPU;
 
  256             mappedType = QgsOpenClUtils::HardwareType::Other;
 
  258         const QMetaEnum metaEnum = QMetaEnum::fromType<QgsOpenClUtils::HardwareType>();
 
  259         return metaEnum.valueToKey( mappedType );
 
  262         return QString::fromStdString( device.getInfo<CL_DEVICE_NAME>() );
 
  265   catch ( cl::Error &e )
 
  268     QgsDebugMsgLevel( QStringLiteral( 
"Error %1 getting info for OpenCL device: %2" )
 
  269                       .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  279   return QgsSettings().
value( SETTINGS_GLOBAL_ENABLED_KEY, 
false, QgsSettings::Section::Core ).toBool();
 
  284   return cl::Device::getDefault();
 
  290   if ( cl::Platform::getDefault()() )
 
  292     const std::string platver = cl::Platform::getDefault().getInfo<CL_PLATFORM_VERSION>();
 
  293     if ( platver.find( 
"OpenCL " ) != std::string::npos )
 
  295       version = QString::fromStdString( platver.substr( 7 ) ).split( 
' ' ).first();
 
  308   return QgsSettings().
value( SETTINGS_DEFAULT_DEVICE_KEY, QString( ), QgsSettings::Section::Core ).toString();
 
  313   return QStringLiteral( 
"%1|%2|%3|%4" )
 
  314          .arg( 
deviceInfo( QgsOpenClUtils::Info::Name, device ) )
 
  315          .arg( 
deviceInfo( QgsOpenClUtils::Info::Vendor, device ) )
 
  316          .arg( 
deviceInfo( QgsOpenClUtils::Info::Version, device ) )
 
  317          .arg( 
deviceInfo( QgsOpenClUtils::Info::Type, device ) );
 
  320 bool QgsOpenClUtils::activate( 
const QString &preferredDeviceId )
 
  329     std::vector<cl::Platform> platforms;
 
  330     cl::Platform::get( &platforms );
 
  333     bool deviceFound = 
false;
 
  334     for ( 
const auto &p : platforms )
 
  338       const std::string platver = p.getInfo<CL_PLATFORM_VERSION>();
 
  339       QgsDebugMsg( QStringLiteral( 
"Found OpenCL platform %1: %2" ).arg( QString::fromStdString( platver ), QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ) );
 
  340       if ( platver.find( 
"OpenCL " ) != std::string::npos )
 
  342         std::vector<cl::Device> 
devices;
 
  346           p.getDevices( CL_DEVICE_TYPE_ALL, &
devices );
 
  348           if ( ! preferredDeviceId.isEmpty() )
 
  350             for ( 
const auto &_dev : 
devices )
 
  352               if ( preferredDeviceId == 
deviceId( _dev ) )
 
  365             for ( 
const auto &_dev : 
devices )
 
  367               if ( _dev.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_GPU )
 
  380             for ( 
const auto &_dev : 
devices )
 
  382               if ( _dev.getInfo<CL_DEVICE_TYPE>() == CL_DEVICE_TYPE_CPU )
 
  397         catch ( cl::Error &e )
 
  399           QgsDebugMsg( QStringLiteral( 
"Error %1 on platform %3 searching for OpenCL device: %2" )
 
  401                              QString::fromStdString( e.what() ),
 
  402                              QString::fromStdString( p.getInfo<CL_PLATFORM_NAME>() ) ) );
 
  414       const cl::Platform newP = cl::Platform::setDefault( plat );
 
  423         cl::Device::setDefault( dev );
 
  425                                    .arg( QString::fromStdString( dev.getInfo<CL_DEVICE_NAME>() ) ),
 
  432   catch ( cl::Error &e )
 
  435                                .arg( 
errorText( e.err() ), QString::fromStdString( e.what() ) ),
 
  444   return QStringLiteral(
 
  445            "Type: <b>%9</b><br>" 
  446            "Name: <b>%1</b><br>" 
  447            "Vendor: <b>%2</b><br>" 
  448            "Profile: <b>%3</b><br>" 
  449            "Version: <b>%4</b><br>" 
  450            "Image support: <b>%5</b><br>" 
  451            "Max image2d width: <b>%6</b><br>" 
  452            "Max image2d height: <b>%7</b><br>" 
  453            "Max mem alloc size: <b>%8</b><br>" 
  467   for ( 
const auto &dev : 
devices( ) )
 
  494   if ( file.open( QFile::ReadOnly | QFile::Text ) )
 
  496     QTextStream in( &file );
 
  497     source_str = in.readAll();
 
  509   const QString path = QStringLiteral( 
"%1/%2.cl" ).arg( 
sourcePath(), baseName );
 
  515   cl::BuildLogType build_logs = error.getBuildLog();
 
  517   if ( build_logs.size() > 0 )
 
  518     build_log = QString::fromStdString( build_logs[0].second );
 
  526     case 0: 
return QStringLiteral( 
"CL_SUCCESS" );
 
  527     case -1: 
return QStringLiteral( 
"CL_DEVICE_NOT_FOUND" );
 
  528     case -2: 
return QStringLiteral( 
"CL_DEVICE_NOT_AVAILABLE" );
 
  529     case -3: 
return QStringLiteral( 
"CL_COMPILER_NOT_AVAILABLE" );
 
  530     case -4: 
return QStringLiteral( 
"CL_MEM_OBJECT_ALLOCATION_FAILURE" );
 
  531     case -5: 
return QStringLiteral( 
"CL_OUT_OF_RESOURCES" );
 
  532     case -6: 
return QStringLiteral( 
"CL_OUT_OF_HOST_MEMORY" );
 
  533     case -7: 
return QStringLiteral( 
"CL_PROFILING_INFO_NOT_AVAILABLE" );
 
  534     case -8: 
return QStringLiteral( 
"CL_MEM_COPY_OVERLAP" );
 
  535     case -9: 
return QStringLiteral( 
"CL_IMAGE_FORMAT_MISMATCH" );
 
  536     case -10: 
return QStringLiteral( 
"CL_IMAGE_FORMAT_NOT_SUPPORTED" );
 
  537     case -12: 
return QStringLiteral( 
"CL_MAP_FAILURE" );
 
  538     case -13: 
return QStringLiteral( 
"CL_MISALIGNED_SUB_BUFFER_OFFSET" );
 
  539     case -14: 
return QStringLiteral( 
"CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST" );
 
  540     case -15: 
return QStringLiteral( 
"CL_COMPILE_PROGRAM_FAILURE" );
 
  541     case -16: 
return QStringLiteral( 
"CL_LINKER_NOT_AVAILABLE" );
 
  542     case -17: 
return QStringLiteral( 
"CL_LINK_PROGRAM_FAILURE" );
 
  543     case -18: 
return QStringLiteral( 
"CL_DEVICE_PARTITION_FAILED" );
 
  544     case -19: 
return QStringLiteral( 
"CL_KERNEL_ARG_INFO_NOT_AVAILABLE" );
 
  545     case -30: 
return QStringLiteral( 
"CL_INVALID_VALUE" );
 
  546     case -31: 
return QStringLiteral( 
"CL_INVALID_DEVICE_TYPE" );
 
  547     case -32: 
return QStringLiteral( 
"CL_INVALID_PLATFORM" );
 
  548     case -33: 
return QStringLiteral( 
"CL_INVALID_DEVICE" );
 
  549     case -34: 
return QStringLiteral( 
"CL_INVALID_CONTEXT" );
 
  550     case -35: 
return QStringLiteral( 
"CL_INVALID_QUEUE_PROPERTIES" );
 
  551     case -36: 
return QStringLiteral( 
"CL_INVALID_COMMAND_QUEUE" );
 
  552     case -37: 
return QStringLiteral( 
"CL_INVALID_HOST_PTR" );
 
  553     case -38: 
return QStringLiteral( 
"CL_INVALID_MEM_OBJECT" );
 
  554     case -39: 
return QStringLiteral( 
"CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" );
 
  555     case -40: 
return QStringLiteral( 
"CL_INVALID_IMAGE_SIZE" );
 
  556     case -41: 
return QStringLiteral( 
"CL_INVALID_SAMPLER" );
 
  557     case -42: 
return QStringLiteral( 
"CL_INVALID_BINARY" );
 
  558     case -43: 
return QStringLiteral( 
"CL_INVALID_BUILD_OPTIONS" );
 
  559     case -44: 
return QStringLiteral( 
"CL_INVALID_PROGRAM" );
 
  560     case -45: 
return QStringLiteral( 
"CL_INVALID_PROGRAM_EXECUTABLE" );
 
  561     case -46: 
return QStringLiteral( 
"CL_INVALID_KERNEL_NAME" );
 
  562     case -47: 
return QStringLiteral( 
"CL_INVALID_KERNEL_DEFINITION" );
 
  563     case -48: 
return QStringLiteral( 
"CL_INVALID_KERNEL" );
 
  564     case -49: 
return QStringLiteral( 
"CL_INVALID_ARG_INDEX" );
 
  565     case -50: 
return QStringLiteral( 
"CL_INVALID_ARG_VALUE" );
 
  566     case -51: 
return QStringLiteral( 
"CL_INVALID_ARG_SIZE" );
 
  567     case -52: 
return QStringLiteral( 
"CL_INVALID_KERNEL_ARGS" );
 
  568     case -53: 
return QStringLiteral( 
"CL_INVALID_WORK_DIMENSION" );
 
  569     case -54: 
return QStringLiteral( 
"CL_INVALID_WORK_GROUP_SIZE" );
 
  570     case -55: 
return QStringLiteral( 
"CL_INVALID_WORK_ITEM_SIZE" );
 
  571     case -56: 
return QStringLiteral( 
"CL_INVALID_GLOBAL_OFFSET" );
 
  572     case -57: 
return QStringLiteral( 
"CL_INVALID_EVENT_WAIT_LIST" );
 
  573     case -58: 
return QStringLiteral( 
"CL_INVALID_EVENT" );
 
  574     case -59: 
return QStringLiteral( 
"CL_INVALID_OPERATION" );
 
  575     case -60: 
return QStringLiteral( 
"CL_INVALID_GL_OBJECT" );
 
  576     case -61: 
return QStringLiteral( 
"CL_INVALID_BUFFER_SIZE" );
 
  577     case -62: 
return QStringLiteral( 
"CL_INVALID_MIP_LEVEL" );
 
  578     case -63: 
return QStringLiteral( 
"CL_INVALID_GLOBAL_WORK_SIZE" );
 
  579     case -64: 
return QStringLiteral( 
"CL_INVALID_PROPERTY" );
 
  580     case -65: 
return QStringLiteral( 
"CL_INVALID_IMAGE_DESCRIPTOR" );
 
  581     case -66: 
return QStringLiteral( 
"CL_INVALID_COMPILER_OPTIONS" );
 
  582     case -67: 
return QStringLiteral( 
"CL_INVALID_LINKER_OPTIONS" );
 
  583     case -68: 
return QStringLiteral( 
"CL_INVALID_DEVICE_PARTITION_COUNT" );
 
  584     case -69: 
return QStringLiteral( 
"CL_INVALID_PIPE_SIZE" );
 
  585     case -70: 
return QStringLiteral( 
"CL_INVALID_DEVICE_QUEUE" );
 
  586     case -71: 
return QStringLiteral( 
"CL_INVALID_SPEC_ID" );
 
  587     case -72: 
return QStringLiteral( 
"CL_MAX_SIZE_RESTRICTION_EXCEEDED" );
 
  588     case -1002: 
return QStringLiteral( 
"CL_INVALID_D3D10_DEVICE_KHR" );
 
  589     case -1003: 
return QStringLiteral( 
"CL_INVALID_D3D10_RESOURCE_KHR" );
 
  590     case -1004: 
return QStringLiteral( 
"CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR" );
 
  591     case -1005: 
return QStringLiteral( 
"CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR" );
 
  592     case -1006: 
return QStringLiteral( 
"CL_INVALID_D3D11_DEVICE_KHR" );
 
  593     case -1007: 
return QStringLiteral( 
"CL_INVALID_D3D11_RESOURCE_KHR" );
 
  594     case -1008: 
return QStringLiteral( 
"CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR" );
 
  595     case -1009: 
return QStringLiteral( 
"CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR" );
 
  596     case -1010: 
return QStringLiteral( 
"CL_INVALID_DX9_MEDIA_ADAPTER_KHR" );
 
  597     case -1011: 
return QStringLiteral( 
"CL_INVALID_DX9_MEDIA_SURFACE_KHR" );
 
  598     case -1012: 
return QStringLiteral( 
"CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR" );
 
  599     case -1013: 
return QStringLiteral( 
"CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR" );
 
  600     case -1093: 
return QStringLiteral( 
"CL_INVALID_EGL_OBJECT_KHR" );
 
  601     case -1092: 
return QStringLiteral( 
"CL_EGL_RESOURCE_NOT_ACQUIRED_KHR" );
 
  602     case -1001: 
return QStringLiteral( 
"CL_PLATFORM_NOT_FOUND_KHR" );
 
  603     case -1057: 
return QStringLiteral( 
"CL_DEVICE_PARTITION_FAILED_EXT" );
 
  604     case -1058: 
return QStringLiteral( 
"CL_INVALID_PARTITION_COUNT_EXT" );
 
  605     case -1059: 
return QStringLiteral( 
"CL_INVALID_PARTITION_NAME_EXT" );
 
  606     case -1094: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_INTEL" );
 
  607     case -1095: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_TYPE_INTEL" );
 
  608     case -1096: 
return QStringLiteral( 
"CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL" );
 
  609     case -1097: 
return QStringLiteral( 
"CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL" );
 
  610     case -1000: 
return QStringLiteral( 
"CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR" );
 
  611     case -1098: 
return QStringLiteral( 
"CL_INVALID_VA_API_MEDIA_ADAPTER_INTEL" );
 
  612     case -1099: 
return QStringLiteral( 
"CL_INVALID_VA_API_MEDIA_SURFACE_INTEL" );
 
  613     case -1100: 
return QStringLiteral( 
"CL_VA_API_MEDIA_SURFACE_ALREADY_ACQUIRED_INTEL" );
 
  614     case -1101: 
return QStringLiteral( 
"CL_VA_API_MEDIA_SURFACE_NOT_ACQUIRED_INTEL" );
 
  615     default: 
return QStringLiteral( 
"CL_UNKNOWN_ERROR" );
 
  627     return cl::CommandQueue( 
context );
 
  632     const cl_command_queue_properties properties = 0;
 
  634     cl_command_queue queue = clCreateCommandQueue( 
context(), device(),  properties, 
nullptr );
 
  636     return cl::CommandQueue( queue, 
true );
 
  643   static std::once_flag contextCreated;
 
  644   std::call_once( contextCreated, [ = ]()
 
  646     if ( 
available() && cl::Platform::getDefault()() && cl::Device::getDefault()() )
 
  648       context = cl::Context( cl::Device::getDefault() );
 
  670     if ( ok && version < 2.0f )
 
  672       program.build( QStringLiteral( 
"-cl-std=CL%1 -I\"%2\"" )
 
  678       program.build( QStringLiteral( 
"-I\"%1\"" )
 
  682   catch ( cl::BuildError &e )
 
  685     if ( build_log.isEmpty() )
 
  686       build_log = QObject::tr( 
"Build logs not available!" );
 
  687     const QString err = QObject::tr( 
"Error building OpenCL program: %1" )
 
  690     if ( exceptionBehavior == 
Throw )
 
  693   catch ( cl::Error &e )
 
  695     const QString err = QObject::tr( 
"Error %1 building OpenCL program in %2" )
 
  696                         .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.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
Q_GLOBAL_STATIC(QReadWriteLock, sDefinitionCacheLock)
#define QgsDebugMsgLevel(str, level)