QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsopenclutils.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsopenclutils.h - QgsOpenClUtils
3
4 ---------------------
5 begin : 11.4.2018
6 copyright : (C) 2018 by Alessandro Pasotti
7 email : elpaso at itopen dot it
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16#ifndef QGSOPENCLUTILS_H
17#define QGSOPENCLUTILS_H
18
19#define SIP_NO_FILE
20
21#define CL_HPP_ENABLE_EXCEPTIONS
22
23#include <QtGlobal>
24#ifdef Q_OS_MAC
25#define CL_HPP_MINIMUM_OPENCL_VERSION 120
26#define CL_HPP_TARGET_OPENCL_VERSION 120
27#define CL_TARGET_OPENCL_VERSION 120
28#else
29#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
30#define CL_HPP_TARGET_OPENCL_VERSION 200
31#define CL_TARGET_OPENCL_VERSION 200
32#endif
33
34#include "qgsconfig.h"
35
36#ifdef OPENCL_USE_NEW_HEADER
37#include <CL/opencl.hpp>
38#else
39#include <CL/cl2.hpp>
40#endif
41
42#include "qgis_core.h"
43#include "qgis.h"
44
45#include "cpl_conv.h"
46
79class CORE_EXPORT QgsOpenClUtils
80{
81 Q_GADGET
82
83 public:
84
89 {
91 Throw
92 };
93
98 {
101 Other
102 };
103
104 Q_ENUM( HardwareType )
105
106
111 enum Info
112 {
113 Name = CL_DEVICE_NAME,
114 Vendor = CL_DEVICE_VENDOR,
115 Version = CL_DEVICE_VERSION,
116 Profile = CL_DEVICE_PROFILE,
117 ImageSupport = CL_DEVICE_IMAGE_SUPPORT,
118 Image2dMaxWidth = CL_DEVICE_IMAGE2D_MAX_WIDTH,
119 Image2dMaxHeight = CL_DEVICE_IMAGE2D_MAX_HEIGHT,
120 MaxMemAllocSize = CL_DEVICE_MAX_MEM_ALLOC_SIZE,
121 Type = CL_DEVICE_TYPE // CPU/GPU etc.
122 };
123
133 static bool available();
134
136 static bool enabled();
137
139 static const std::vector<cl::Device> devices();
140
148 static cl::Device activeDevice( );
149
155 static QString activePlatformVersion( );
156
158 static void storePreferredDevice( const QString deviceId );
159
161 static QString preferredDevice( );
162
164 static QString deviceId( const cl::Device device );
165
169 static QString deviceDescription( const cl::Device device );
170
174 static QString deviceDescription( const QString deviceId );
175
177 static void setEnabled( bool enabled );
178
180 static QString buildLog( cl::BuildError &error );
181
183 static QString sourceFromPath( const QString &path );
184
186 static QString sourceFromBaseName( const QString &baseName );
187
189 static QLatin1String LOGMESSAGE_TAG;
190
192 static QString errorText( const int errorCode );
193
200 static cl::CommandQueue commandQueue();
201
208 Q_DECL_DEPRECATED static cl::Program buildProgram( const cl::Context &context, const QString &source, ExceptionBehavior exceptionBehavior = Catch );
209
214 static cl::Program buildProgram( const QString &source, ExceptionBehavior exceptionBehavior = Catch );
215
216
224 static cl::Context context();
225
227 static QString sourcePath();
228
230 static void setSourcePath( const QString &value );
231
233 static QString activeDeviceInfo( const Info infoType = Info::Name );
234
236 static QString deviceInfo( const Info infoType, cl::Device device );
237
242 template <typename T>
244 {
245
246 public:
247
248 explicit CPLAllocator( unsigned long size ): mMem( static_cast<T *>( CPLMalloc( sizeof( T ) * size ) ) ) { }
249
251 {
252 CPLFree( static_cast<void *>( mMem ) );
253 }
254
255 void reset( T *newData )
256 {
257 if ( mMem )
258 CPLFree( static_cast<void *>( mMem ) );
259 mMem = newData;
260 }
261
262 void reset( unsigned long size )
263 {
264 reset( static_cast<T *>( CPLMalloc( sizeof( T ) *size ) ) );
265 }
266
268 {
269 return &mMem[0];
270 }
271
273 {
274 T *tmpMem = mMem;
275 mMem = nullptr;
276 return tmpMem;
277 }
278
279 T &operator[]( const int index )
280 {
281 return mMem[index];
282 }
283
284 T *get()
285 {
286 return mMem;
287 }
288
289 private:
290
291 T *mMem = nullptr;
292 };
293
294
295 private:
296
298
312 static bool activate( const QString &preferredDeviceId = QString() );
313
317 static void init();
318
319 static bool sAvailable;
320 static QLatin1String SETTINGS_GLOBAL_ENABLED_KEY;
321 static QLatin1String SETTINGS_DEFAULT_DEVICE_KEY;
322};
323
324
325
326#endif // QGSOPENCLUTILS_H
The QgsOpenClUtils class is responsible for common OpenCL operations such as.
HardwareType
The Type enum represent OpenCL device type.
ExceptionBehavior
The ExceptionBehavior enum define how exceptions generated by OpenCL should be treated.
@ Catch
Write errors in the message log and silently fail.
Info
The Info enum maps to OpenCL info constants.
static QLatin1String LOGMESSAGE_TAG
OpenCL string for message logs.
QgsMargins operator*(const QgsMargins &margins, double factor)
Returns a QgsMargins object that is formed by multiplying each component of the given margins by fact...
Definition: qgsmargins.h:242
Tiny smart-pointer-like wrapper around CPLMalloc and CPLFree: this is needed because OpenCL C++ API m...
T & operator[](const int index)
void reset(unsigned long size)
CPLAllocator(unsigned long size)