OpenCL、OpenGL 同时工作
生活随笔
收集整理的這篇文章主要介紹了
OpenCL、OpenGL 同时工作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
視頻處理如果能使用OpenCL、OpenGL、omap將大量提高運算速度,簡單介紹OpenCL、OpenGL 同時工作。
OpenCL和OpenGL都能用于操作GPU,但是前者主要用于通用計算,而后者主要用于圖像渲染。在某些情況下,我們希望能用OpenCL計得到算圖像,然后展示在顯示器上。如果直接調(diào)用OpenGL的現(xiàn)有API,則需要把計算得到的結(jié)果通過pci-e總線傳回host端內(nèi)存,再由OpenGL再次通過pci-e總線傳回gpu端顯存。這樣就造成了額外的拷貝,傳輸開銷。事實上,可以使用OpenCL的OpenGL擴展功能,使得OpenCL和OpenGL能共享buffer,從而避免額外的傳輸。這種共享可以通俗的理解為是讓OpenCL和OpenGL共享同一塊內(nèi)存的指針。
? 要實現(xiàn)這種共享需要三步:
? 1.OpenCL在OpenGL的上下文基礎(chǔ)上創(chuàng)建上下文
? //創(chuàng)建上下文的屬性
? cl_context_properties properties[] = {
? CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(), //獲得OpenGL上下文
? CL_WGL_HDC_KHR, (cl_context_properties) wglGetCurrentDC(), //獲得OpenGl設(shè)備信息
? CL_CONTEXT_PLATFORM, (cl_context_properties) platform, //獲得平臺信息
? 0};
? //利用剛剛創(chuàng)建的屬性創(chuàng)建上下文
? ctx = clCreateContext(properties, 1, &device, NULL, NULL, &err);
? 2.OpenCL在OpenGL內(nèi)存對象的基礎(chǔ)上創(chuàng)建內(nèi)存對象
? //以buffer為例,需要一個OpenGL的vbo才能創(chuàng)建共用的內(nèi)存對象
? cl_mem clCreateFromGLBuffer(cl_context context, cl_mem_flags flags,?
? GLuint vbo_desc, cl_int *err)
? 注意:OpenGL的內(nèi)存對象必須先行創(chuàng)建,使用OpenCL中的image則需要OpenGL中的texture
? 3.共享內(nèi)存對象的同步及訪問
? 很顯然OpenCL和OpenGL不能同時去訪問同一個數(shù)據(jù)對象,需要加鎖,解鎖進行同步
? ?
? //加鎖
? 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即可直接使用共享的內(nèi)存對象進行渲染及其他操作。
? 更加詳細的信息請參考:Understanding OpenCL-OpenGL Interoperability
? OpenCL / OpenGL Interoperation 教程及實例
總結(jié)
以上是生活随笔為你收集整理的OpenCL、OpenGL 同时工作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言指针定义变量方式
- 下一篇: 熟悉,不等于能力