图形互操作源码分析

项目打包下载

  1 /*
  2 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
  3 *
  4 * NVIDIA Corporation and its licensors retain all intellectual property and
  5 * proprietary rights in and to this software and related documentation.
  6 * Any use, reproduction, disclosure, or distribution of this software
  7 * and related documentation without an express license agreement from
  8 * NVIDIA Corporation is strictly prohibited.
  9 *
 10 * Please refer to the applicable NVIDIA end user license agreement (EULA)
 11 * associated with this source code for terms and conditions that govern
 12 * your use of this NVIDIA software.
 13 *
 14 */
 15 /*
 16 图形互操作实验
 17 */
 18 #include <GL\glut.h>
 19 #include "../common/book.h"
 20 #include "../common/cpu_bitmap.h"
 21 #include "device_launch_parameters.h"
 22 #include "cuda.h"
 23 #include "cuda_gl_interop.h"
 24 #include <math.h>
 25 #include <cuda_runtime_api.h>
 26 PFNGLBINDBUFFERARBPROC    glBindBuffer = NULL;
 27 PFNGLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;
 28 PFNGLGENBUFFERSARBPROC    glGenBuffers = NULL;
 29 PFNGLBUFFERDATAARBPROC    glBufferData = NULL;
 30
 31 #define     DIM    512
 32
 33 /*
 34 定义数据缓冲区的两个句柄
 35 bufferObj是OpenGL对这个数据的名字
 36 resource是cuda对这个变量的名字
 37 */
 38 GLuint  bufferObj;
 39 cudaGraphicsResource *resource;
 40
 41 /*
 42
 43 */
 44 __global__ void kernel(uchar4 *ptr) {
 45     //计算像素位置
 46     int x = threadIdx.x + blockIdx.x * blockDim.x;
 47     int y = threadIdx.y + blockIdx.y * blockDim.y;
 48     int offset = x + y * blockDim.x * gridDim.x;
 49
 50     //计算相应位置上的值
 51     float fx = x / (float)DIM - 0.5f;
 52     float fy = y / (float)DIM - 0.5f;
 53     unsigned char   green = 128 + 127 * sin(abs(fx * 100) - abs(fy * 100));
 54
 55     // accessing uchar4 vs unsigned char*
 56     ptr[offset].x = 0;
 57     ptr[offset].y = green;
 58     ptr[offset].z = 0;
 59     ptr[offset].w = 255;
 60 }
 61
 62 //退出
 63 static void key_func(unsigned char key, int x, int y) {
 64     switch (key) {
 65     case 27:
 66         // clean up OpenGL and CUDA
 67         HANDLE_ERROR(cudaGraphicsUnregisterResource(resource));
 68         glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
 69         glDeleteBuffers(1, &bufferObj);
 70         exit(0);
 71     }
 72 }
 73
 74 /*
 75 如果没有任何缓冲区绑定为GL_PIXEL_UNPACK_BUFFER_ARB源,那么OpenGL驱动程序将从这个缓冲区进行复制
 76 由于数据位于GPU上,并且我们已经将共享数据缓冲区绑定为GL_PIXEL_UNPACK_BUFFER_ARB源
 77 因此最后一个参数将变成绑定缓冲区的一个偏移
 78 由于是要赋值整个缓冲区,所以偏移值就是0
 79 */
 80 static void draw_func(void) {
 81     glDrawPixels(DIM, DIM, GL_RGBA, GL_UNSIGNED_BYTE, 0);
 82     glutSwapBuffers();
 83 }
 84
 85
 86 int main(int argc, char **argv) {
 87     cudaDeviceProp  prop;
 88     int dev;
 89
 90     memset(&prop, 0, sizeof(cudaDeviceProp));
 91     prop.major = 1;
 92     prop.minor = 0;
 93     HANDLE_ERROR(cudaChooseDevice(&dev, &prop));
 94
 95     /*
 96     dev中保存的是符合要求的设备ID
 97     互操作性要求,在其他任何运行时调用它之前要通过cudaGLSetGLDevice()指定
 98     将获得的设备ID dev传递进去
 99     为cuda运行时使用OpenGL驱动程序做好准备
100     */
101     HANDLE_ERROR(cudaGLSetGLDevice(dev));
102
103     /*
104     在执行其他任何操作前需要先执行这些GLUT调用
105     通过GLUT创建名为bitmap的窗口
106     并在这个窗口中绘制结果
107     */
108     glutInit(&argc, argv);
109     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
110     glutInitWindowSize(DIM, DIM);
111     glutCreateWindow("图形互操作演示");
112
113     /*
114     在OpenGL中创建一个数据缓冲区对象
115     将句柄存放在全局变量bufferObj中
116     */
117     glBindBuffer = (PFNGLBINDBUFFERARBPROC)GET_PROC_ADDRESS("glBindBuffer");
118     glDeleteBuffers = (PFNGLDELETEBUFFERSARBPROC)GET_PROC_ADDRESS("glDeleteBuffers");
119     glGenBuffers = (PFNGLGENBUFFERSARBPROC)GET_PROC_ADDRESS("glGenBuffers");
120     glBufferData = (PFNGLBUFFERDATAARBPROC)GET_PROC_ADDRESS("glBufferData");
121
122     // the first three are standard OpenGL, the 4th is the CUDA reg
123     // of the bitmap these calls exist starting in OpenGL 1.5
124     //生成缓冲区句柄
125     glGenBuffers(1, &bufferObj);
126     //将句柄绑定到缓冲区
127     glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, bufferObj);
128     /*
129     请求OpenGL驱动程序来分配一个缓冲区
130     GL_DYNAMIC_DRAW_ARB标志表示缓冲区将被应用程序反复修改
131     刚开始没有初始值,所以倒数第二个参数为null
132     保存图像大小为DIM*DIM个32位的值
133     */
134     glBufferData(GL_PIXEL_UNPACK_BUFFER_ARB, DIM * DIM * 4,
135         NULL, GL_DYNAMIC_DRAW_ARB);
136
137     /*
138     通过调用cudaGraphicsGLRegisterBuffer告诉运行时cuda运行时希望在OpenGL和CUDA间使用像素缓冲区数据OpenGL PBO bufferObj
139     CUDA运行时将在resource中返回一个句柄指向缓冲区
140     在随后的CUDA运行时调用中,将通过这个句柄来访问缓冲区bufferObj
141     cudaGraphicsMapFlagsNone标志表示不需要为缓冲区指定特殊的行为
142     */
143     HANDLE_ERROR(
144         cudaGraphicsGLRegisterBuffer(&resource,
145         bufferObj,
146         cudaGraphicsMapFlagsNone));
147
148     /*
149     告诉CUDA运行时映射共享资源
150     */
151     HANDLE_ERROR(cudaGraphicsMapResources(1, &resource, NULL));
152     uchar4* devPtr;
153     size_t  size;
154     /*
155     请求一个被映射资源的指针
156     可以把devPtr作为设备指针来使用
157     */
158     HANDLE_ERROR(
159         cudaGraphicsResourceGetMappedPointer((void**)&devPtr,
160         &size,
161         resource));
162
163     dim3    grids(DIM / 16, DIM / 16);
164     dim3    threads(16, 16);
165     //devPtr为指向共享缓冲区的指针
166     kernel << <grids, threads >> >(devPtr);
167     /*
168     在执行绘制任务之前取消资源的映射以确保应用程序的CUDA部分和图形部分之间实现同步
169     */
170     HANDLE_ERROR(cudaGraphicsUnmapResources(1, &resource, NULL));
171
172     // set up GLUT and kick off main loop
173     glutKeyboardFunc(key_func);
174     glutDisplayFunc(draw_func);
175     glutMainLoop();
176 }
时间: 2024-10-23 14:21:04

图形互操作源码分析的相关文章

bootstrap源码分析之Carousel

源码文件: Carousel.scssCarousel.js 实现原理: 隐藏所有要显示的元素,然后指定当前要显示的为block,宽.高自适应 源码分析: 1.Html结构:主要分为以四个部分  1.1.容器:最外层div,需要一个data-ride="carousel"来指定为轮播放插件,并且提供一个Id,方便圆圈指示符的关联  1.2.图片列表部分,用一个外层div包裹所有,然后每个img会被一个div,则class为item的包裹住  1.3.圆圈指示符:用一个ol列表来显示其各

插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑

请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52258434 在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇文章主要分析Activity预注册占坑,Activity占了坑后又是什么时候开始瞒天过海欺骗AMS的?先看下Agenda: AndroidMainfest.xml中概览 Activity中关键方

Go Mobile 例子 basic 源码分析

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准. go 的 golang.org/x/mobile/gl 这个包 是基于OpenGL ES 2了, 文档在: https://godoc.org/golang.org/x/mobile/gl Khronos的api文档

Android应用Activity、Dialog、PopWindow窗口显示机制及源码分析

[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重劳动成果] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>,然后有人在文章下面评论和微博私信中问我关于Android应用Dialog.PopWindow.Toast加载显示机制是咋回事,所以我就写一篇文章来分析分析吧(本文以Android5.1.1 (API 22)源码为基础分析),以便大家在应

【源码分析】动态分析 C 程序函数调用关系

By Falcon of TinyLab.org 2015/04/15 缘由 源码分析是程序员离不开的话题.无论是研究开源项目,还是平时做各类移植.开发,都避免不了对源码的深入解读. 工欲善其事,必先利其器. 之前已经介绍了如何通过 Callgraph 静态分析源代码,这里介绍如何分析程序运行时的实际函数执行情况,考虑到应用部分和内核部分有比较大的差异,该篇先介绍应用部分. 主要介绍三款工具,一款是 gprof,另外一款是 valgrind,再一款则是能够把前两款的结果导出为 dot 图形的工具

LevelDB源码分析--Cache及Get查找流程

本打算接下来分析version相关的概念,但是在准备的过程中看到了VersionSet的table_cache_这个变量才想起还有这样一个模块尚未分析,经过权衡觉得leveldb的version相对Cache来说相对复杂,而且version虽然对整个leveldb来说实现上跟其他功能十分紧密,但是从概念上来说却相对弱很多,有点感觉是附加的功能的感觉.所以从介绍系统首先应该注意的是整个系统概念的完整性的角度说还是先分析Cache相关的功能. 我们先来看Cache的基本框架结构数据: struct

《极简笔记》源码分析(二)

0. 介绍 此文将对Github上lguipeng大神所开发的 极简笔记 v2.0 (点我下载源码)代码进行分析学习. 通过此文你将学到: 应用源码的研读方法 MVP架构模式 Application的应用 Degger2依赖注入框架 搜索控件的使用 ButterKnife库的使用 Material主题 RecyclerView等新控件的用法 Lambda表达式 Java自定义注解 aFinal框架 RxJava框架 EventBus消息框架 布局文件常用技巧 PreferenceFragment

Eoe客户端源码分析---SlidingMenu的使用

Eoe客户端源码分析及代码注释 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,可以通过ViewPager和PagerIndicator显示对应的数据内容. 0  BaseSlidingFragmentActivity.java 主要函数: (1)showMenu() /** * Opens the menu and shows the menu view.*/ public void showMenu() { showMenu(true); } (2)showContent() /

转:Ogre源码分析之Root类、Facade模式

Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最简单的一种方式:当你构造构造一个Root实例的时候你就启动了整个Ogre,当析构的时候(让它停止活动或者执行delete删除它)Ogre也就关闭了. API手册中这样介绍到:Ogre::Root 类代表了客户应用程序的入口点.在这里,应用程序可以获得系统的重要的访问权,也就是获取渲染系统 ,管理配置