Skip to content

Commit 215bfd4

Browse files
committed
Wrap make program in OpenCL utils
1 parent ebad360 commit 215bfd4

File tree

3 files changed

+65
-39
lines changed

3 files changed

+65
-39
lines changed

src/core/qgsopenclutils.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,35 @@ cl::Context QgsOpenClUtils::context()
256256
return cl::Context();
257257
}
258258
}
259+
260+
cl::Program QgsOpenClUtils::buildProgram( const cl::Context &context, const QString &source, ExceptionBehavior exceptionBehavior )
261+
{
262+
cl::Program program;
263+
try
264+
{
265+
program = cl::Program( context, source.toStdString( ) );
266+
program.build( "-cl-std=CL1.1" );
267+
}
268+
catch ( cl::BuildError &e )
269+
{
270+
cl::BuildLogType build_logs = e.getBuildLog();
271+
QString build_log;
272+
if ( build_logs.size() > 0 )
273+
build_log = QString::fromStdString( build_logs[0].second );
274+
else
275+
build_log = QObject::tr( "Build logs not available!" );
276+
QString err = QObject::tr( "Error building OpenCL program: %1" )
277+
.arg( build_log );
278+
QgsMessageLog::logMessage( err, LOGMESSAGE_TAG, Qgis::Critical );
279+
if ( exceptionBehavior == Throw )
280+
throw e;
281+
}
282+
catch ( cl::Error &e )
283+
{
284+
QString err = QObject::tr( "Error %1 running OpenCL program in %2" )
285+
.arg( errorText( e.err() ), QString::fromStdString( e.what() ) );
286+
QgsMessageLog::logMessage( err, LOGMESSAGE_TAG, Qgis::Critical );
287+
throw e;
288+
}
289+
return program;
290+
}

src/core/qgsopenclutils.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,21 @@
3939
class CORE_EXPORT QgsOpenClUtils
4040
{
4141
public:
42+
43+
enum ExceptionBehavior
44+
{
45+
Catch,
46+
Throw
47+
};
48+
4249
static bool enabled();
4350
static bool available();
4451
static void setEnabled( bool enabled );
4552
static QString buildLog( cl::BuildError &e );
4653
static QString sourceFromPath( const QString &path );
4754
static QLatin1String LOGMESSAGE_TAG;
4855
static QString errorText( const int errorCode );
49-
56+
static cl::Program buildProgram( const cl::Context &context, const QString &source, ExceptionBehavior exceptionBehavior = Catch );
5057
static cl::Context context();
5158

5259
/**

tests/src/core/testqgsopenclutils.cpp

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,18 @@ class TestQgsOpenClUtils: public QObject
3333
void TestEnable();
3434
void TestDisable();
3535
void TestAvailable();
36-
void testRunProgram();
36+
void testMakeRunProgram();
3737
void testContext();
3838

3939
private:
4040

41+
cl::Program buildProgram( const cl::Context &context, const QString &source )
42+
{
43+
cl::Program program( context, source.toStdString( ) );
44+
program.build( "-cl-std=CL1.1" );
45+
return program;
46+
}
47+
4148
std::string source()
4249
{
4350
std::string pgm = R"CL(
@@ -70,7 +77,7 @@ void TestQgsOpenClUtils::TestAvailable()
7077
}
7178

7279

73-
void TestQgsOpenClUtils::testRunProgram()
80+
void TestQgsOpenClUtils::testMakeRunProgram()
7481
{
7582

7683
cl_int err = 0;
@@ -87,43 +94,23 @@ void TestQgsOpenClUtils::testRunProgram()
8794
cl::Buffer b_buf( b_vec.begin(), b_vec.end(), true );
8895
cl::Buffer c_buf( c_vec.begin(), c_vec.end(), false );
8996

90-
try
91-
{
92-
// This also works:
93-
cl::Program program( source( ) );
94-
program.build( "-cl-std=CL1.1" );
95-
96-
auto kernel =
97-
cl::KernelFunctor <
98-
cl::Buffer &,
99-
cl::Buffer &,
100-
cl::Buffer &
101-
> ( program, "vectorAdd" );
102-
103-
kernel( cl::EnqueueArgs(
104-
cl::NDRange( 3 )
105-
),
106-
a_buf,
107-
b_buf,
108-
c_buf
109-
);
110-
}
111-
catch ( cl::BuildError e )
112-
{
113-
qDebug() << "OPENCL Build Error: " << QgsOpenClUtils::errorText( e.err() ) << e.what();
114-
cl::BuildLogType build_logs = e.getBuildLog();
115-
QString build_log;
116-
if ( build_logs.size() > 0 )
117-
build_log = QString::fromStdString( build_logs[0].second );
118-
else
119-
build_log = QObject::tr( "Build logs not available!" );
120-
qDebug() << build_log;
97+
cl::Program program = QgsOpenClUtils::buildProgram( ctx, QString::fromStdString( source() ) );
98+
99+
auto kernel =
100+
cl::KernelFunctor <
101+
cl::Buffer &,
102+
cl::Buffer &,
103+
cl::Buffer &
104+
> ( program, "vectorAdd" );
105+
106+
kernel( cl::EnqueueArgs(
107+
cl::NDRange( 3 )
108+
),
109+
a_buf,
110+
b_buf,
111+
c_buf
112+
);
121113

122-
}
123-
catch ( cl::Error e )
124-
{
125-
qDebug() << "OPENCL Error: " << e.err() << e.what();
126-
}
127114
cl::copy( c_buf, c_vec.begin(), c_vec.end() );
128115
for ( size_t i = 0; i < c_vec.size(); ++i )
129116
{

0 commit comments

Comments
 (0)