@@ -370,13 +370,13 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
370
370
entry.typeName = QStringLiteral ( " unsigned int" );
371
371
break ;
372
372
case Qgis::DataType::Int16:
373
- entry.typeName = QStringLiteral ( " int " );
373
+ entry.typeName = QStringLiteral ( " short " );
374
374
break ;
375
375
case Qgis::DataType::UInt32:
376
- entry.typeName = QStringLiteral ( " unsigned long " );
376
+ entry.typeName = QStringLiteral ( " unsigned int " );
377
377
break ;
378
378
case Qgis::DataType::Int32:
379
- entry.typeName = QStringLiteral ( " long " );
379
+ entry.typeName = QStringLiteral ( " int " );
380
380
break ;
381
381
case Qgis::DataType::Float32:
382
382
entry.typeName = QStringLiteral ( " float" );
@@ -422,7 +422,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
422
422
// Inputs:
423
423
##INPUT_DESC##
424
424
// Expression: ##EXPRESSION_ORIGINAL##
425
- __kernel void rasterCalculator( ##INPUT##,
425
+ __kernel void rasterCalculator( ##INPUT##
426
426
__global float *resultLine
427
427
)
428
428
{
@@ -439,16 +439,18 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
439
439
inputDesc.append ( QStringLiteral ( " // %1 = %2" ).arg ( ref.varName ).arg ( ref.name ) );
440
440
}
441
441
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 ( ' ' ) );
443
443
programTemplate = programTemplate.replace ( QStringLiteral ( " ##EXPRESSION##" ), cExpression );
444
444
programTemplate = programTemplate.replace ( QStringLiteral ( " ##EXPRESSION_ORIGINAL##" ), calcNode->toString ( ) );
445
445
446
- // qDebug() << programTemplate;
446
+ qDebug () << programTemplate;
447
447
448
448
// Create a program from the kernel source
449
449
cl::Program program ( QgsOpenClUtils::buildProgram ( programTemplate, QgsOpenClUtils::ExceptionBehavior::Throw ) );
450
450
451
451
// 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 );
452
454
std::size_t resultBufferSize ( 4 * static_cast <size_t >( mNumOutputColumns ) );
453
455
cl::Buffer resultLineBuffer ( ctx, CL_MEM_WRITE_ONLY,
454
456
resultBufferSize, nullptr , nullptr );
@@ -461,7 +463,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
461
463
}
462
464
kernel.setArg ( static_cast <unsigned int >( inputBuffers.size () ), resultLineBuffer );
463
465
464
- QgsOpenClUtils::CPLAllocator<float > resultLine ( resultBufferSize );
466
+ QgsOpenClUtils::CPLAllocator<float > resultLine ( static_cast < size_t >( mNumOutputColumns ) );
465
467
466
468
// open output dataset for writing
467
469
GDALDriverH outputDriver = openOutputDriver ();
@@ -528,6 +530,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
528
530
// qDebug() << "Input: " << line << i << ref.varName << " = " << block->value( 0, i );
529
531
// qDebug() << "Writing buffer " << ref.index;
530
532
533
+ Q_ASSERT ( ref.bufferSize == static_cast <size_t >( block->data ().size ( ) ) );
531
534
queue.enqueueWriteBuffer ( inputBuffers[ref.index ], CL_TRUE, 0 ,
532
535
ref.bufferSize , block->bits () );
533
536
0 commit comments