GLX学习与分析

GLX是X Window的一个扩展,按我的理解,它是专门为X Window实现3D渲染而开发的一个扩展。X Window没有开发自己的3D渲染的实现,而是使用了Mesa(不准确的说是OpenGL的一种实现),为了实现X Window 与OpenGL的结合,制定了GLX标准。GLX的实现主要有两个版本,一个是基于Xorg的,一个是基于XFree86的,两者差别不大,下面我们讨论的都是基于XFree86的实现。

 

一、X Window与OpengGL的结合的思路

    X Window 走的是2D的Path,而OpenGL走的是3D的path,那么两者怎么样才能有效地结合在一起,使原本走2D path的X Window具有3D的效果呢?X Window采用的方法就是由它自己创建Drawable,然后把Drawable交给OpenGL来渲染,再由OpenGL将渲染结果显示到屏幕上,从而使X Window具有3D的效果。如何把Drawable交给OpenGL就是GLX所要做的工作。

    X提供了两种Drawable: Window(onscreen)和Pixmap(offscreen)。与之对应的GLX也有GLXWindow和GLXPixmap,此外,GLX还有自己特有的位于offscreen上的GLXPbuffer,GLXPbuffer与GLXPixmap不同是它比GLXPixmap创建(在不可见的frame buffer中)更加方便。

    对于X Window和OpengGL及glx的关系图请参阅“Aiglx学习总结”。

 

二、应用程序的一般过程

     应用程序一般先用 XOpenDisplay 打开一个链接,然后通过glXQueryExtension查询是否有Glx扩展,如果不存在就做相应的处理,否则就创建一个窗口,然后通过glXGetFBConfigs得到一个GLXFBConfig,它是主要用来描述颜色缓存和一些辅助缓存的格式、类型和大小的,创建glxWindow和glxContext的时候需要指定一个GLXFBConfig。接着把刚才创建的XWindow和GLXFBConfig传给glXCreateWindow创建一个可以让OpenGL渲染的窗口。同时,通过把刚才创建的GLXFBConfig传给glXCreateNewContext创建一个Render Context。然后通过glXMakeContextCurrent把刚刚创建的Reder Context绑定到刚才创建的GLXWindow上,那么以后的GL操作都将是按照Render Context对GLXWindow的操作。其大概的流程图如下所示:  

三、GL扩展的实现

    由于在AIGLX中,GL的实现是indirect方式的,即需要通过X Server来实现,所以需要某个扩展来支持GL命令从客户端到服务器的发送,然而我找了很久都没有发现这个扩展,后来才发现原来它是通过GLX扩展来实现GL命令的传送的。

既然GLX是X的一个扩展,那么它就是满足X的扩展机制的,关于X的扩展机制可以参考absurd的X Window研究笔记。一个扩展的实现必须包含三个部分,Client,Protocol和Server,基本上一个函数(需要X Server来实现的函数)就需要在Protocol中定义一个请求的结构,然而对于GL的命令GLX却没有为每个GL函数设立一个Request,而是将所有的GL命令的发送都通过一个Reques即GLXRender请求来发送,只是每个GL命令的内部操作码不同而已。具体的代码可以参考SGI的GLX的实现中的G_render.c 。
Linux GPU 驱动的学习路线可以分为以下几个阶段: ### 第一阶段:基础知识 #### 1. 计算机体系结构基础 - 学习基本的计算机架构知识,包括CPU、内存、I/O系统等。 #### 2. Linux内核基础 - 熟悉Linux操作系统的工作原理内核模块的机制。 - 掌握如何编译构建Linux内核,并能够安装运行自定义内核。 #### 3. 图形学基础 - 了解图形处理器(GPU)的基本工作原理以及其在现代计算机系统中的角色。 - 学习OpenGL或其他图形API的基础知识。 ### 第二阶段:深入Linux内核 #### 4. 内核模块开发 - 理解并实践如何创建、安装加载内核模块。 #### 5. XorgWayland显示服务器 - 学习XorgWayland的工作机制,理解它们是如何管理用户界面的渲染显示的。 #### 6. Linux图形堆栈分析 - 分析Linux图形堆栈中的关键组件通信协议,如XServer、GLX、EGL、KMS等。 ### 第三阶段:GPU驱动开发 #### 7. GPU硬件特性研究 - 深入研究目标GPU系列的技术规格、支持的功能以及可能遇到的问题点。 #### 8. 核心驱动框架理解 - 学习理解GPU驱动的核心组件,例如:驱动注册、设备初始化、设备挂载、中断处理、DMA操作等。 #### 9. 设备树Kconfig配置 - 探索设备树表示法及其在驱动开发中的应用,学会使用Kconfig进行内核模块的配置化开发。 #### 10. 实践驱动编写 - 开始编写简单的驱动程序,从最基础的硬件交互开始,逐步增加功能复杂度。 ### 第四阶段:高级技术优化 #### 11. 性能分析工具使用 - 学会使用perf、gprof等工具对驱动程序进行性能分析优化。 #### 12. 动态库动态加载 - 掌握动态库的概念使用方法,在驱动开发中实现动态加载能力。 #### 13. 错误检测调试 - 研究各种错误检测机制,掌握常用调试工具技术,提高驱动稳定性。 ### 第五阶段:项目实践社区贡献 #### 14. 实际项目经验 - 参实际项目或开源社区的驱动开发活动,积累实践经验。 #### 15. 社区交流贡献 - 加入相关的开发者论坛社区,积极提问、分享经验解决问题。 通过以上学习步骤,你可以逐步建立起关于Linux GPU驱动开发的专业知识,并最终具备设计、实现及优化GPU驱动的能力。在学习过程中,持续关注最新的技术发展社区动态也非常重要,这有助于保持技术的前沿性实用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值