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