DRM全解析 —— ADD_FB2(0)

本文参考以下博文:

DRM驱动(四)之ADD_FB

特此致谢!

在笔者之前的libdrm全解析系列文章中,讲到了drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &f)以及其封装函数drmModeAddFB。对应的文章链接为:

libdrm全解析三十一 —— 源码全解析(28)

libdrm全解析三十二 —— 源码全解析(29)

实际上你如果看KWin源码,会发现使用更多的并不是drmModeAddFB函数,而是drmModeAddFB2WithModifiers函数。KWin源码中的代码片段如下(src/backends/drm/drm_buffer.cpp):

std::shared_ptr DrmFramebuffer::createFramebuffer(const std::shared_ptr &buffer)
{
    const auto size = buffer->size();
    const auto handles = buffer->handles();
    const auto strides = buffer->strides();
    const auto offsets = buffer->offsets();

    uint32_t framebufferId = 0;
    int ret;
    if (buffer->gpu()->addFB2ModifiersSupported() && buffer->modifier() != DRM_FORMAT_MOD_INVALID) {
        uint64_t modifier[4];
        for (uint32_t i = 0; i < 4; i++) {
            modifier[i] = i < buffer->planeCount() ? buffer->modifier() : 0;
        }

        ret = drmModeAddFB2WithModifiers(buffer->gpu()->fd(), size.width(), size.height(), buffer->format(), handles.data(), strides.data(), offsets.data(), modifier, &framebufferId, DRM_MODE_FB_MODIFIERS);
    } else {
        ret = drmModeAddFB2(buffer->gpu()->fd(), size.width(), size.height(), buffer->format(), handles.data(), strides.data(), offsets.data(), &framebufferId, 0);
        if (ret == EOPNOTSUPP && handles.size() == 1) {
            //qCCritical(KWIN_DRM, "meidaozheli vvvv333...\n\n"); //phph
            ret = drmModeAddFB(buffer->gpu()->fd(), size.width(), size.height(), 24, 32, strides[0], handles[0], &framebufferId);
        }
    }
    if (ret == 0) {
        return std::make_shared(buffer, framebufferId);
    } else {
        return nullptr;
    }
}

这里我们的重点并不是KWin(针对于KWin源码的研究笔者正在进行中,后续会有专门的文章对于KWin源码进行解析),只是让读者感受一下实际的使用场景,并且能够知道真正主要使用的是drmModeAddFB2WithModifiers(),更准确地说,使用的优先级是drmModeAddFB2WithModifiers() > drmModeAddFB2() > drmModeAddFB()。

对于drmModeAddFB函数,笔者之前已经有过系列文章“DRM全解析 —— ADD_FB”,写得还算比较清楚和深入。有了前系列文章的基础,再加上笔者近一段时间对于图形部分(KWin、libdrm/DRM)的深入研究以及更深刻理解,本系列文章开始对于更常用暨更为重要的drmModeAddFB2WithModifiers和drmModeAddFB2函数进行深入解析。

本篇文章就作为契子或引子吧,真正的解析内容从下一篇文章开始。

你可能感兴趣的:(DRM,libdrm,DRM)