OpenCL image2d_t在将其映射回主机时返回错误的值

时间:2015-10-16 19:15:53

标签: c++ c opencl

我正在编写一个光线跟踪器,并试图将生成的图像的结果写入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

生成的图像是: enter image description here

我知道我可能犯了一个新手的错误,但是我无法弄清楚问题是什么,我无法在互联网上的任何地方找到任何指南来使这项工作。

我正在使用配备Intel Iris Pro图形GPU的MacBook Pro。

1 个答案:

答案 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);
}