libkwinnvidiahack4 包有什么作用?

ger*_*ijk 4 kde nvidia graphics kwin

我刚刚偶然发现了libkwinnvidiahack4软件包安装 libkwinnvidiahack4(还有libkwinactivenvidiahack4安装 libkwinactivenvidiahack4)。从描述中我了解到它为 KDE 窗口管理器与 Nvidia 二进制图形驱动程序结合提供了一些“技巧”。

这个包包含一个由 nvidia 卡用于 KDE 窗口管理器的库。

这个包是 KDE 工作区模块的一部分。

然而,这种描述缺乏它的实际作用。我使用 KDE/Kubuntu 并安装了 Nvidia 图形驱动程序。安装这些软件包有什么好处?他们在做什么?

我已经libkwinnvidiahack4安装了该软件包(可能是自动安装的),但我不确定它负责什么。

运行更改日志 ( apt-get changelog libkwinnvidiahack4) 给我一个kde-workspace带有条目的更改日志(从中提取的几个片段):

  • 移动 libkwinnvidiahack4 到它自己的包
  • 添加包

    • kde-window-manager-active
    • kde-window-manager-active-gles
    • libkwinactiveglutils1
    • libkwinactiveglesutils1
    • libkwinactiveeffects1abi3
    • libkwinactivenvidiahack4
  • kde-window-manager/-gles 依赖于 libkwinnvidiahack4

  • 不要安装 /usr/lib/libkwinnvidiahack.so。没有人应该链接到 libkwinnvidiahack。使 kdebase-workspace-dev 依赖于 libkdecorations4 和 libkwineffects1 而不是 kde-window-manager,因为 kde-window-manager 不包含任何可以链接的内容。

这也没有解释为什么添加这些包以及它们的作用。

fos*_*dom 5

经过一番谷歌搜索后,我发现了这篇文章

该文件的唯一目的是在链接顺序中比(nvidia 的)libGL 晚,因此由它之前的动态链接器初始化,允许它尽快设置 __GL_YIELD=NOTHING 以便 libGL 注意到它。

鉴于引用来自某个 M-Graesslin,Martin 是该领域的主要维护者,因此是一个可靠的来源。

确实,查看源代码

apt-get source libkwinnvidiahack4
Run Code Online (Sandbox Code Playgroud)

这实际上是 kde 工作区模块。

kwin/nvidiahack.cpp 是有问题的源模块 - 它本身就是一个小模块

由于此hack仍在 13.04 中 - 并且是核心构建的一部分,是的,它仍然需要,其目的是确保 KDE 的 OpenGL 组件的库链接以正确的功能顺序完成。

就模块的作用而言 - 看起来它定义了一个运行时环境变量 __GL_YIELD

来自freedesktop 规范

OpenGL 屈服行为

有几种情况,NVIDIA OpenGL 驱动程序需要等待外部状态改变才能继续。为了避免在这些情况下消耗太多 CPU 时间,驱动程序有时会让步,以便内核可以在驱动程序等待时安排其他进程运行。例如,在等待命令缓冲区中的空闲空间时,如果经过一定次数的迭代后空闲空间仍未可用,则驱动程序将在继续循环之前让步。

默认情况下,驱动程序调用 sched_yield() 来执行此操作。但是,如果有其他相同优先级的进程在 CPU 上竞争时间,这可能会导致调用进程被调度到相对较长的时间段。一个例子是基于 OpenGL 的复合管理器正在移动和重新绘制窗口,而 X 服务器试图在窗口移动时更新窗口,这都是 CPU 密集型操作。

您可以使用 __GL_YIELD 环境变量来解决这些调度问题。该变量允许用户指定驱动程序想要让步时应该做什么。

因此,黑客是永远不要等待并始终在 OpenGL 复合表面上绘画 - 很可能是为了阻止图形工件的出现。