接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(5)
上一回讲解了drm_internal_framebuffer_create函数的第二部分,本回对于该函数余下部分进行解析。
为了便于理解,再次贴出drm_internal_framebuffer_create函数的源码,drivers/gpu/drm/drm_framebuffer.c中,代码如下:
- struct drm_framebuffer *
- drm_internal_framebuffer_create(struct drm_device *dev,
- const struct drm_mode_fb_cmd2 *r,
- struct drm_file *file_priv)
- {
- struct drm_mode_config *config = &dev->mode_config;
- struct drm_framebuffer *fb;
- int ret;
-
- if (r->flags & ~(DRM_MODE_FB_INTERLACED | DRM_MODE_FB_MODIFIERS)) {
- drm_dbg_kms(dev, "bad framebuffer flags 0x%08x\n", r->flags);
- return ERR_PTR(-EINVAL);
- }
-
- if ((config->min_width > r->width) || (r->width > config->max_width)) {
- drm_dbg