从此,就要开始辗转与xf86-video-intel,drm与linux-2.6.30的代码中间。就像三位一体一样。实际上跳转的时候还是三体。幸好有vim+ctags+cscope的帮助!
Intel 2D X Driver直接调用libdrm的接口,后者再通过ioctl,call到内核态的函数。本来,
是没有这么麻烦的。drm的linux-core部分,就是对应的内核态的代码。但是,自从i965要支持GEM以后,linux-core的代码与kernel/gpu/drm的就不同步了。后来,intel的i915 drm代码就干脆直接放到kernel里面了。最开始的分支名称是drm-gem。
举个例子,i830_bind_memory函数调用到dri_bo_pin,dri_bo_pin就是libdrm里定义的,
#define dri_bo_pin drm_intel_bo_pin |
drm_intel_bo_pin,再调用到buffer object的内存管理器的相应接口。bo->bufmgr->bo_pin。
对GEM的内存管理器,其初始化为drm_intel_bufmgr_gem_init函数。
bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin; |
drm_intel_gem_bo_pin再调用ioctl,由内核完成相应的工作。
还有许多许多的函数回调,大都是这样的路子。
说到底,DRM内核代码的分析要不流于表面,还是得从2D X driver+ libdrm + kernel,还有Mesa3D i965 Dri + libdrm + kernel等几层关系入手。套用俗套的话就是,“一个系统的工程”。
学的就是架构,整个体系的建立。流于枝节,实际没有领会神髓。
阅读(3015) | 评论(0) | 转发(0) |