我正在编写一个光线跟踪器,并试图将生成的图像的结果写入image2d_t,然后通过将其映射回主机将其写入磁盘。
问题是,我无法让OpenCL内核写入image2d_t并在主机上读回结果。主机上的图像是一个大部分黑色的图像,带有一些白点。
以下是我的主机代码的重要部分:
cl_image_format rgba_format;
rgba_format.image_channel_order = CL_RGBA;
rgba_format.image_channel_data_type = CL_UNSIGNED_INT8;
outputImage = clCreateImage2D(context, CL_MEM_WRITE_ONLY,
&rgba_format, width, height, 0, NULL, &err);
if(err < 0) fatalError("failed to create OpenCL image");
err = clSetKernelArg(sampleKernel, 0, sizeof(outputImage), &outputImage);
if(err < 0) fatalError("failed to set kernel argument.");
size_t global_offset[2] = {0, 0};
size_t work_size[2] = {height, width};
int err = clEnqueueNDRangeKernel(queue, sampleKernel, 2, global_offset,
work_size, NULL, 0, NULL, NULL);
if(err < 0) fatalError("failed to enqueue kernel execution.");
clFinish(queue);
// Map the entire output image.
size_t row_pitch;
size_t origin[3] = {0, 0, 0};
size_t region[3] = {width, height, 1};
uint8_t *output = (uint8_t *) clEnqueueMapImage(queue, outputImage,
CL_TRUE, CL_MAP_READ, origin, region, &row_pitch, NULL, 0, NULL,
NULL, &err);
if(err < 0) fatalError("failed to map output kernel image.");
for(int i = 0; i < 5; ++i)
printf("%u %u %u %u\n", output[i*4], output[i*4 + 1], output[i*4 + 2],
output[i*4 + 3]);
savePPM(output);
我的客户代码:
__kernel void sample(__write_only image2d_t out)
{
int2 coord = (get_global_id(1), get_global_id(0));
uint4 color = (255, 0, 0, 255);
write_imageui(out, coord, color);
}
printf()输出为:
255 255 255 255
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
我知道我可能犯了一个新手的错误,但是我无法弄清楚问题是什么,我无法在互联网上的任何地方找到任何指南来使这项工作。
我正在使用配备Intel Iris Pro图形GPU的MacBook Pro。
答案 0 :(得分:1)
解决了这个问题。不要忘记在OpenCL向量上添加类型限定符。
固定内核是:
__kernel void sample(__write_only image2d_t out)
{
int2 coord = (int2) (get_global_id(1), get_global_id(0));
uint4 color = (uint4) (255, 0, 0, 255);
write_imageui(out, coord, color);
}