最近正在阅读mesa3D 7.6.1版本的源代码,代码量很大,感觉到十分困难。以后是否能够读下去,并且理解它的整个实现过程,不能确定。但既然阅读了,就应该积累起来,特写下本系列笔记。
1 编译mesa3D 7.6.1是很容易的事情,里边包含有VC8的sln解决方案,打开它直接编译即可完成;
2 如何调试编译出来的opengl32.dll文件呢?其实Windows系统在检索exe所需要的dll文件时,第一顺序是在当前exe文件所在的目录,所以只要保证编译出的opengl32.dll与调试用的exe文件生成在同一目录,就可以在调试时进入到对应opengl函数的实现代码环节;
3 阅读源代码时,我首先是找opengl32.dll中导出的函数它具体对应的代码函数在哪儿。严格地说这比较难找,因为在mesa里是使用函数分发表来处理的。在glapitemp.h头文件里以宏的方式定义了许多函数,该文件被两个.c文件包含,一个是dispatch.c,一个是glapi.c。前者结合dispatch.h包含glapitemp.h将对应宏展开成为对应opengl32.dll所导出的函数体定义;而后者则是定义成为一组对应opengl到处函数的相应NoOp*函数,并且将这些函数保存到__glapi_noop_table结构变量里。实际上在运行过程中,一直会有一个extern struct _glapi_table *_glapi_Dispatch;内部函数成员地址会被修正成为相应的mesa实现函数。调用opengl函数实际上是通过dispatch.c呼叫_glapi_Dispatch里所存储的对应函数,这一过程即分发,所以说dispatch table呗;
4 当然这里wgl*系列函数和部分gl*函数都比较好找,而glBegin、glEnd以及用在它们之间的glColor*、glVertex*系列函数的分发过程就比较复杂。到现在为止,虽然调试过好几遍mesa源代码,但是仍然晕头转向的。
5 mesa7.6.1源代码里部分文件写有一些说明,真的很宝贵,但遗憾的是实在太少;整个工程模块又存有许多模块,阅读量很大;在光栅渲染环节存在许多函数分发表,搞得晕头转向。
不知道阅读这样的源代码怎样去做比较好?