GraphicsMagick 的 OpenCL 开发记录(二十七)

文章目录

  • 如何写`ScaleImage()`的硬件加速函数(一)

<2022-04-21 周四>

如何写ScaleImage()的硬件加速函数(一)

分析ScaleImage()函数及考虑参数如何传递:

  1. 函数中最大的循环是按Y垂直方向的,这样每次内循环以X水平方向进行。
  2. 最大的循环中以两个if-else分支为主,分别比较目标宽高是否等于原始宽高,所以可以考虑以两个无符号整形代表(因为kernel函数不支持布尔类型,1表示相等,0表示不等)或者也可以直接传入原始宽高和目标高宽,在kernel函数中比较是否相等。
  3. 选择传入目标宽高和原始宽高比较好,这样x_scaley_scale也可以在kernel函数中计算。
  4. 该函数中有申请可变长的动态数组,按照原始图片的宽度为长度申请堆内存。参考ResizeImage()AccelerateResizeImage()函数,它们没有用到可变长动态数组,在kernel函数中申请动态数组明显不合适,因为opencl不支持动态数组。
  5. 继续参考ResizeImage()AccelerateResizeImage()函数,用到了三个图片内存传入kernel函数,分别是imageBuffertempImageBufferfilteredImageBuffer,原以为参数传递错了,为什么在resizeHorizontalFilter()resizeVerticalFilter()函数中只有一个函数用到了filteredImageBuffer变量?
  6. 仔细分析resizeHorizontalFilter()resizeVerticalFilter()函数发现它们的第五个参数是输入参数,第九个参数是输出参数,tempImageBuffer是临时内存,做为第一个函数的输出参数和第二个函数的输入参数,代码如下:
outputReady=resizeHorizontalFilter(device,queue,image,filteredImage,
  imageBuffer,matte_or_cmyk,(cl_uint) image->columns,
  (cl_uint) image->rows,tempImageBuffer,(cl_uint) resizedColumns,
  (cl_uint) image->rows,filter_type,filter_info,blur,
  cubicCoefficientsBuffer,xFactor,exception);
if (outputReady == MagickFalse)
  goto cleanup;

outputReady=resizeVerticalFilter(device,queue,image,filteredImage,
  tempImageBuffer,matte_or_cmyk,(cl_uint) resizedColumns,
  (cl_uint) image->rows,filteredImageBuffer,(cl_uint) resizedColumns,
  (cl_uint) resizedRows,filter_type,filter_info,blur,
  cubicCoefficientsBuffer,yFactor,exception);
if (outputReady == MagickFalse)
  goto cleanup;
  1. 那似乎ScaleImage()里用不到这个临时内存,因为函数结构有区别。
  2. 以原图宽高为长度的动态数组是不是可以在调用kernel函数之前申请好,用于临时内存?

commit:fake run: AccelerateScaleImage() can work now but with wrong effect。

你可能感兴趣的:(GraphicsMagick,的,OpenCL,开发,GraphicsMagick,ImageMagick,OpenCL,c++)