2017-04-25 206 views
3

我正在使用OpenCL來做一些圖像處理,並且想用它將RGBA圖像直接寫入framebuffer。工作流程如下所示:如何使用OpenCL直接寫入到零拷貝的linux framebuffer?

1)將framebuffer映射到用戶空間。

2)創建使用clCreateBuffer用 「CL_MEM_ALLOC_HOST_PTR」

3)的標誌的OpenCL緩衝器使用clEnqueueMapBuffer映射結果的幀緩衝器。

但是,它不起作用。屏幕上沒有任何東西。然後我發現來自幀緩衝區的映射虛擬地址與虛擬地址映射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

對於零拷貝你需要使用CL_MEM_USE_HOST_PTR國旗在clCreateBuffer()函數調用已有的緩衝區。另外,您需要將指向現有緩衝區的指針作爲倒數第二個參數。

我不知道linux framebuffer如何在內部工作,但即使從設備到宿主的零拷貝也可能導致額外的數據複製到GPU進行渲染。所以你可能想用OpenGL直接渲染OpenCL緩衝區。查看OpenCL的cl_khr_gl_sharing擴展。