<2022-04-21 周四>
如何写ScaleImage()
的硬件加速函数(一)
分析ScaleImage()
函数及考虑参数如何传递:
- 函数中最大的循环是按
Y
垂直方向的,这样每次内循环以X
水平方向进行。 - 最大的循环中以两个
if-else
分支为主,分别比较目标宽高是否等于原始宽高,所以可以考虑以两个无符号整形代表(因为kernel
函数不支持布尔类型,1
表示相等,0
表示不等)或者也可以直接传入原始宽高和目标高宽,在kernel
函数中比较是否相等。 - 选择传入目标宽高和原始宽高比较好,这样
x_scale
和y_scale
也可以在kernel
函数中计算。 - 该函数中有申请可变长的动态数组,按照原始图片的宽度为长度申请堆内存。参考
ResizeImage()
和AccelerateResizeImage()
函数,它们没有用到可变长动态数组,在kernel
函数中申请动态数组明显不合适,因为opencl
不支持动态数组。 - 继续参考
ResizeImage()
和AccelerateResizeImage()
函数,用到了三个图片内存传入kernel
函数,分别是imageBuffer
,tempImageBuffer
和filteredImageBuffer
,原以为参数传递错了,为什么在resizeHorizontalFilter()
和resizeVerticalFilter()
函数中只有一个函数用到了filteredImageBuffer
变量? - 仔细分析
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;
- 那似乎
ScaleImage()
里用不到这个临时内存,因为函数结构有区别。 - 以原图宽高为长度的动态数组是不是可以在调用
kernel
函数之前申请好,用于临时内存?
commit
:fake run: AccelerateScaleImage() can work now but with wrong effect。