2017-04-25 13 views
3

私はOpenCLを使用して画像処理を行い、RGBB画像をフレームバッファに直接書き込むために使用したいと考えています。ワークフローを以下に示す。OpenCLを使用してゼロコピーでLinuxのフレームバッファに直接書き込む方法は?

1)フレームバッファをユーザ空間にマップする。

2)フレームバッファに結果をマッピングするclEnqueueMapBufferを使用) "CL_MEM_ALLOC_HOST_PTR"

3のフラグとclCreateBufferを用いOpenCLのバッファを作成します。

ただし、動作しません。画面上には何も表示されません。次に、フレームバッファからマップされた仮想アドレスが、OpenCLにマップされた仮想アドレスと同じではないことがわかりました。 GPUからフレームバッファへデータをゼロコピーで移動させたボディはありますか?どのようなアプローチをとるべきでしょうか?

いくつかのキーコード:ゼロコピーについては

if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0) { 
    printf("Unable to open /dev/fb0\n"); 
    return -1; 
} 
fb0 = (unsigned char *)mmap(0, fb0_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0); 
... 
cmDevSrc4 = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(cl_uchar) * imagesize * 4, NULL, &status); 
... 
fb0 = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmDevSrc4, CL_TRUE, CL_MAP_READ, 0, sizeof(cl_uchar) * imagesize * 4, 0, NULL, NULL, &ciErr); 

答えて

1

あなたはclCreateBuffer()関数呼び出しでCL_MEM_USE_HOST_PTRフラグを使用する必要がある既存のバッファを持ちます。さらに、既存のバッファへのポインタを2番目から最後の引数として与える必要があります。

私はLinuxのフレームバッファが内部的にどのように動作しているのかわかりませんが、デバイスからホストへのゼロコピーでもレンダリングのためにデータをGPUに余分にコピーする可能性があります。したがって、OpenGLで直接OpenCLバッファをレンダリングしたいかもしれません。 OpenCLの拡張子はcl_khr_gl_sharingです。

関連する問題