免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 62300 | 回复: 6
打印 上一主题 下一主题

我的参赛题目——“龙芯平台下3D图像加速的实现”与大家交流 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-21 12:35 |只看该作者 |倒序浏览
本帖最后由 小乖乖87 于 2012-08-21 12:43 编辑

    今年第一次参加“龙芯杯”中国开源软件设计大赛,据说这是目前中国开源届最大的竞赛,想到一方面可以更加深入的了解龙芯的技术,亲自实践;另一方面也可以为开源做些贡献,因此便报名参加了。根据我所的擅场的领域,我直接选择了第9号命题:Gallium 3D在龙芯平台上的移植和优化。项目书顺利通过,从7月初起正式在龙芯杯大赛组委会提供的平台上开始研发。在此也和大家分享一些研发中的过程和进展。
    开源架构的图形驱动架构比较复杂,因此在我这个项目的开发中,有些概念还是要先了解一下。我收集整理了一下,供大家参考:
Mesa
Mesa是一个开源的OpenGL实现, 它为X提供基于DRI的硬件驱动以及基于XLib的软件驱动。Mesa的3D图形驱动结构复杂,每一个厂商要为其3D加速实现写一个后端。

Gallium
自从Mesa7。5版本之后,一种新的架构Gallium3D被Mesa采用,用来克服3D驱动实现复杂的问题。得益于这种架构,驱可以更小更简单。

DRI
DRI全称Direct Rendering Ini frastructure, 是一个设计用来安全而有效地直接访问显示硬件的框架,通过它可实现真正意义上的”硬件加速”。
它包括了几个主要的部分:X端,和内核层面的支持。X端有两种不同X扩展协议, XFree86-DRI 和DRI2,这两个扩展的作用都是在DRI的内容上协调客户端与服务端。
DRM
DRM全称是Direct Rendering Manager, 它是DRI在内核层面主要实现部分。所有的显卡都对应一个内核模块比如i915是intel显示核心的模块, 他们都有一个功能的父亲drm。ko用来统一接口。DRM作用很大,它可以知道显卡的中断以及DMA存取信息,并且能处理AGP和帧缓冲内存的分配。
GLX
GLX全称是"OpenGL Extension to the X Window System, 它是OpenGL与X联系的纽带, 使得在X的框架下使用OpenGL成为可能。(有时候你不会希望你的OpengGL程序没有窗口管理器)
GLX由以下几部分组成:一组为X视窗系统提供OpenGL 函数的API;一个X协议的扩展,实现从X的客户端(这里是那些OpenGL程序)传送3D渲染命令道X的服务端(在没有提供硬件加速的情况下X是通过软件来实现的X服务器端的3D渲染)。
由于X11是一个网络视窗系统,客户端和服务端可能不是分布在一个机器上。GLX还将OpenGL的命令打包进入网络数据包,通过X11网络通道传输,能让你远程运行OpenGL程序。
GLX还负责那些不能写到OpenGL中的实现,协调与X有关的3D行为。
GLX对于X, 类似于WGL对于Windows, AGL对于MacOS, EGL对于Embeded系统

GLX有两种绘图方式,直接渲染和非直接渲染。
要么客户端直接自己绘制图形,要么传递OpenGL的绘制命令到服务端。后者称作非直接渲染。通常来讲直接渲染更快些,因为非直接渲染依赖于服务端的处理速度。



了解了以上概念,通过glxinfo | grep OpenGL查看当前 GL的驱动,发现当前OpenGL的驱动版本是Mesa DRI。



然后便开始着手编译我自己的OpenGL驱动了,硬件需要准备好一台装着操作系统的龙芯主机和一根网线。往下逐步按照步骤进行。对此我作了些总结,希望对大家有所帮助。
下载源码
你可以从以下三个网站找到要下载的源码,第一个是大名鼎鼎的Mesa(也就是Gallium),后两个是编译Galiium需要依赖的库(如果系统上没有或者对应的版本不符合要求,你需要下载他们然后自己编译)
ftp://ftp.freedesktop.org/pub/mesa/
http://dri.freedesktop.org/libdrm/
http://xorg.freedesktop.org/releases/individual/proto/
准备编译环境
由于龙芯处理器采用的是MIPS指令集,与我们熟知和常用的X86指令集下的编译有一定的区别,不能直接使用普通PC平台编译。因此在我这个项目的开发中,需要采用交叉编译或者直接在龙芯平台上编译。
在最开始的阶段,我尝试着进行交叉编译,以试着将编译和调试能够很好的分开,方便后期调试。后来我发现这并不是个好主意:首先,交叉编译环境搭建复杂;其次,这个驱动不是那么的”底层”,调试起来不是很费力气,交叉编译显得没有必要。所以我决定在龙芯平台上直接编译(推荐你也这么做) 。
编译安装
configure
./configure --with-gallium-drivers=r600 --enable-dri –with-dri-drivers=””
(configure有很多参数,这些参数可配置3D加速的行为以及架构,在稍候的版本中计划将Gallium相关的代码摘录出来,组成一个独立的工程)
make
执行make或者gmake
编译完成后会在工程目录下生成lib目录存放目标文件,其中lib/gallium下放的均是gallium相关的库文件。
你会发现有libGL 和 r600_dri两个库文件
install
你可以执行make install安装,但不建议那么做。这样会干掉之前的环境,我们只替换我们需要的部分就可以了。
所以这里我复制r600_dri到/usr/lib/dri/目录下,X启动时候会自动加载r600_dri驱动。
验证安装
查看X是否加载r600_dri驱动



查看OpenGL版本,发现驱动的版本为Gallium 0.4
glxinfo | grep OpenGL


编译OpenGL程序
Glu
gcc `pkg-config --cflags --libs glut` mydemo.c -o mydemo

Glx
gcc  `pkg-config –cflags –libs gl` -lX11 –lm

        以上内容是我在这些天内所整理出来的一些进展。接下来的时间里,我将继续进行性能调查与优化,测试程序、进行热点分析、优化方案、最终实现效果。希望能与更多的开源大神们进一步交流,也希望能在此次大赛上遇到更多高手共同切磋。
       

论坛徽章:
0
2 [报告]
发表于 2012-08-21 15:24 |只看该作者
整理的很详细,谢谢分享,对开源软件有了进一步了解

论坛徽章:
0
3 [报告]
发表于 2012-08-22 10:54 |只看该作者
很详细...谢谢楼主分享。{:3_200:}

论坛徽章:
0
4 [报告]
发表于 2012-08-22 11:00 |只看该作者
期待接下来的进展。。。

论坛徽章:
0
5 [报告]
发表于 2012-08-22 14:50 |只看该作者
谢谢楼主分享,资料很详细很有用,好好学习下

论坛徽章:
0
6 [报告]
发表于 2012-08-22 14:51 |只看该作者
求更多分享……

论坛徽章:
0
7 [报告]
发表于 2013-08-26 15:55 |只看该作者
多些分享,  最近也要移植 i915 DRM 驱动, 能否详细讲解一下 DRM 相关的架构吗? X 部分也可以  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP