OpenCL、OpenGL 同时工作。
来源:互联网 发布:如何做个淘宝客 编辑:程序博客网 时间:2024/05/29 04:07
视频处理如果能使用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 教程及实例
- OpenCL、OpenGL 同时工作
- OpenCL、OpenGL 同时工作。
- Understanding OpenCL-OpenGL Interoperability
- OpenCV、OpenCL、OpenGL、OpenPCL
- OpenGL、OpenCL与OpenAL
- OpenCV/OpenCL/OpenGL区别
- OpenCV、OpenCL、OpenGL、OpenMP
- OpenCL与OpenGL协作方法
- OpenCV、OpenCL、OpenGL、OpenMP区别
- opencl中工作组,工作项
- 学习 OpenGL 和 OpenCL 的互操作性
- OpenGL与OpenCL是何关系?
- opengl的一些基本概念与opencl
- OpenCl菜鸟,初学笔记1---opencl工作原理
- OpenGL ES/Open CV/OpenGL、OpenCL与OpenAL研究
- C++ kmeans 同时绘图opengl
- OpenCL
- OpenCL
- jqery使用方法
- VC++深入详解笔记——13. 文档串行化
- 在open stack集群上使用nise_bosh安装Cloud Foundry
- j2ee的十三个技术规范
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- OpenCL、OpenGL 同时工作。
- poj 1041 John's trip
- VC++深入详解笔记——14. 网络编程
- PB [Grid风格数据窗口改变线条颜色] 的变通实现方法(也可以成为 带表头的Grid数据窗口)
- sqlite3使用
- Ubuntu 的UML工具
- linux 两台服务器 之前传送文件 rsync
- Objective-C在ARC下结合GCD的单例模式和宏模版
- 电子现金圈存(转)