視頻處理如果能使用OpenCL、OpenGL、omap將大量提高運算速度,簡單介紹OpenCL、OpenGL 同時工作。
OpenCL和OpenGL都能用于操作GPU,但是前者主要用于通用計算,而后者主要用于圖像渲染。在某些情況下,我們希望能用OpenCL計得到算圖像,然后展示在顯示器上。如果直接調用OpenGL的現有API,則需要把計算得到的結果通過pci-e總線傳回host端內存,再由OpenGL再次通過pci-e總線傳回gpu端顯存。這樣就造成了額外的拷貝,傳輸開銷。事實上,可以使用OpenCL的OpenGL擴展功能,使得OpenCL和OpenGL能共享buffer,從而避免額外的傳輸。這種共享可以通俗的理解為是讓OpenCL和OpenGL共享同一塊內存的指針。
? 要實現這種共享需要三步:
? 1.OpenCL在OpenGL的上下文基礎上創建上下文
? //創建上下文的屬性
? cl_context_properties properties[] = {
? CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(), //獲得OpenGL上下文
? CL_WGL_HDC_KHR, (cl_context_properties) wglGetCurrentDC(), //獲得OpenGl設備信息
? CL_CONTEXT_PLATFORM, (cl_context_properties) platform, //獲得平臺信息
? 0};
? //利用剛剛創建的屬性創建上下文
? ctx = clCreateContext(properties, 1, &device, NULL, NULL, &err);
? 2.OpenCL在OpenGL內存對象的基礎上創建內存對象
? //以buffer為例,需要一個OpenGL的vbo才能創建共用的內存對象
? cl_mem clCreateFromGLBuffer(cl_context context, cl_mem_flags flags,?
? GLuint vbo_desc, cl_int *err)
? 注意:OpenGL的內存對象必須先行創建,使用OpenCL中的image則需要OpenGL中的texture
? 3.共享內存對象的同步及訪問
? 很顯然OpenCL和OpenGL不能同時去訪問同一個數據對象,需要加鎖,解鎖進行同步
? ?
? //加鎖
? int clEnqueueAcquireGLObjects(cl_command_queue queue, cl_uint num_objects,
? const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
? const cl_event *event_wait_list, cl_event *event)
? //加鎖后在該處運行openCL代碼
? //解鎖
? int clEnqueueReleaseGLObjects(cl_command_queue queue, cl_uint num_objects,
? const cl_mem *mem_objects, cl_uint num_events_in_wait_list,
? const cl_event *event_wait_list, cl_event *event)
? 做完這三步后,OpenGL即可直接使用共享的內存對象進行渲染及其他操作。
? 更加詳細的信息請參考:Understanding OpenCL-OpenGL Interoperability
? OpenCL / OpenGL Interoperation 教程及實例