@@ -370,13 +370,13 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
370370 entry.typeName = QStringLiteral ( " unsigned int" );
371371 break ;
372372 case Qgis::DataType::Int16:
373- entry.typeName = QStringLiteral ( " int " );
373+ entry.typeName = QStringLiteral ( " short " );
374374 break ;
375375 case Qgis::DataType::UInt32:
376- entry.typeName = QStringLiteral ( " unsigned long " );
376+ entry.typeName = QStringLiteral ( " unsigned int " );
377377 break ;
378378 case Qgis::DataType::Int32:
379- entry.typeName = QStringLiteral ( " long " );
379+ entry.typeName = QStringLiteral ( " int " );
380380 break ;
381381 case Qgis::DataType::Float32:
382382 entry.typeName = QStringLiteral ( " float" );
@@ -422,7 +422,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
422422 // Inputs:
423423 ##INPUT_DESC##
424424 // Expression: ##EXPRESSION_ORIGINAL##
425- __kernel void rasterCalculator( ##INPUT##,
425+ __kernel void rasterCalculator( ##INPUT##
426426 __global float *resultLine
427427 )
428428 {
@@ -439,16 +439,18 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
439439 inputDesc.append ( QStringLiteral ( " // %1 = %2" ).arg ( ref.varName ).arg ( ref.name ) );
440440 }
441441 programTemplate = programTemplate.replace ( QStringLiteral ( " ##INPUT_DESC##" ), inputDesc.join ( ' \n ' ) );
442- programTemplate = programTemplate.replace ( QStringLiteral ( " ##INPUT##" ), inputArgs.join ( ' ,' ) );
442+ programTemplate = programTemplate.replace ( QStringLiteral ( " ##INPUT##" ), inputArgs.length () ? ( inputArgs. join ( ' ,' ). append ( ' , ' ) ) : QChar ( ' ' ) );
443443 programTemplate = programTemplate.replace ( QStringLiteral ( " ##EXPRESSION##" ), cExpression );
444444 programTemplate = programTemplate.replace ( QStringLiteral ( " ##EXPRESSION_ORIGINAL##" ), calcNode->toString ( ) );
445445
446- // qDebug() << programTemplate;
446+ qDebug () << programTemplate;
447447
448448 // Create a program from the kernel source
449449 cl::Program program ( QgsOpenClUtils::buildProgram ( programTemplate, QgsOpenClUtils::ExceptionBehavior::Throw ) );
450450
451451 // Create the buffers, output is float32 (4 bytes)
452+ // We assume size of float = 4 because that's the size used by OpenCL and IEEE 754
453+ Q_ASSERT ( sizeof ( float ) == 4 );
452454 std::size_t resultBufferSize ( 4 * static_cast <size_t >( mNumOutputColumns ) );
453455 cl::Buffer resultLineBuffer ( ctx, CL_MEM_WRITE_ONLY,
454456 resultBufferSize, nullptr , nullptr );
@@ -461,7 +463,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
461463 }
462464 kernel.setArg ( static_cast <unsigned int >( inputBuffers.size () ), resultLineBuffer );
463465
464- QgsOpenClUtils::CPLAllocator<float > resultLine ( resultBufferSize );
466+ QgsOpenClUtils::CPLAllocator<float > resultLine ( static_cast < size_t >( mNumOutputColumns ) );
465467
466468 // open output dataset for writing
467469 GDALDriverH outputDriver = openOutputDriver ();
@@ -528,6 +530,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
528530 // qDebug() << "Input: " << line << i << ref.varName << " = " << block->value( 0, i );
529531 // qDebug() << "Writing buffer " << ref.index;
530532
533+ Q_ASSERT ( ref.bufferSize == static_cast <size_t >( block->data ().size ( ) ) );
531534 queue.enqueueWriteBuffer ( inputBuffers[ref.index ], CL_TRUE, 0 ,
532535 ref.bufferSize , block->bits () );
533536
0 commit comments