5
回答
我的参赛题目——“龙芯平台下3D图像加速的实现”与大家交流
终于搞明白,存储TCO原来是这样算的>>>   

        今年第一次参加龙芯杯中国开源软件设计大赛,据说这是目前中国开源届最大的竞赛,想到一方面可以更加深入的了解龙芯的技术,亲自实践;另一方面也可以为开源做些贡献,因此便报名参加了。根据我所的擅场的领域,我直接选择了第9号命题:Gallium 3D在龙芯平台上的移植和优化。项目书顺利通过,从7月初起正式在龙芯杯大赛组委会提供的平台上开始研发。在此也和大家分享一些研发中的过程和进展。

        开源架构的图形驱动架构比较复杂,因此在我这个项目的开发中,有些概念还是要先了解一下。我收集整理了一下,供大家参考:

Mesa

Mesa是一个开源的OpenGL实现, 它为X提供基于DRI的硬件驱动以及基于XLib的软件驱动。Mesa3D图形驱动结构复杂,每一个厂商要为其3D加速实现写一个后端。

Gallium

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

DRI

DRI全称Direct Rendering Ini frastructure, 是一个设计用来安全而有效地直接访问显示硬件的框架,通过它可实现真正意义上的硬件加速

它包括了几个主要的部分:X端,和内核层面的支持。X端有两种不同X扩展协议, XFree86-DRI DRI2,这两个扩展的作用都是在DRI的内容上协调客户端与服务端。

DRM

DRM全称是Direct Rendering Manager, 它是DRI在内核层面主要实现部分。所有的显卡都对应一个内核模块比如i915intel显示核心的模块, 他们都有一个功能的父亲drmko用来统一接口。DRM作用很大,它可以知道显卡的中断以及DMA存取信息,并且能处理AGP和帧缓冲内存的分配。

GLX

GLX全称是"OpenGL Extension to the X Window System, 它是OpenGLX联系的纽带, 使得在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

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

<无标签>
举报
苏槿年
发帖于5年前 5回/612阅
顶部