如何在 intel GPU 上设置外部显示器的缩放模式

如何在 intel GPU 上设置外部显示器的缩放模式

我可以使用以下方法设置内部笔记本电脑面板的显示缩放模式:

xrandr --output LVDS1 --set "scaling mode" "Full aspect" 然而,这不适用于外部显示器(DP1、VGA1、DP1),因为不支持缩放模式属性:

$> xrandr --output HDMI1 --set "scaling mode" "Full aspect"
X Error of failed request:  BadName (named color or font does not exist)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  11 (RRQueryOutputProperty)
  Serial number of failed request:  47
  Current serial number in output stream:  47

显示较低分辨率内容时如何保持宽高比?

答案1

缩放模式属性尚未在 intel 驱动程序中实现(看这里)。它在专有的 AMD 和 NVIDIA 驱动程序中实现,并且最近在开源 radeon 驱动程序中实现(这里)。

但是,您可以通过使用 xrandr 手动执行缩放来解决此限制:

假设您的屏幕的原始分辨率为 1920x1080,并且您想要显示未拉伸的 1024x768 分辨率。长宽比的比例为16/9至4/3。所以 1.333333 变为 1。

xrandr --output HDMI1 --mode 1024x768 --scale 1.33333333x1 --panning 1024x768

这将使屏幕具有正确的分辨率和正确的宽高比。但它并不居中。为了实现这一点,我们需要使用变换选项将其(大致)放在屏幕的中心(1024*1.3333333 - 1024 = 342 / 2 = 171):

xrandr --output HDMI1 --mode 1024x768 --panning 1024x768 --transform 1.33333333,0,-171,0,1,0,0,0,1

不幸的是,未使用的屏幕背景是灰色和/或乱码,而不是黑色。

答案2

接受的答案几乎是我使用英特尔 GPU 渲染带有黑色边框的较低分辨率所需的答案。我的目标是以 5120x1440 超超宽原生分辨率渲染 1920x1080 帧缓冲区,以黑色边框为中心(用于截屏):

xrandr \
    --output DP-1 \
    --mode 5120x1440 \
    --fb 1920x1080 \
    --transform 2.666666667,0,1600,0,1.33333333333,180,0,0,1 \
    --panning 1920x1080

参数详细解释:

  • 输出:输出端口(例如DP-1、HDMI-1等)
  • 模式:显示器显示模式(例如原始分辨率)
  • 脸书:帧缓冲区大小
  • 转换:3x3 仿射变换矩阵,描述如何在监视器几何体中变换渲染输出的几何体;换句话说,“如何”在显示器上定位帧缓冲区
  • 平移:窗口管理器可用的总区域

对我来说主要的区别是参数的顺序 至关重要。对于我的硬件,有必要确保平移发生在之后转换

变换矩阵具有以下形状(忽略旋转):

sx 0  tx      tx = translation x (x pos)
 0 sy ty      ty = translation y (y pos)
 0  0 1       sx = scale x
              sy = scale y

转换为 xrandr 参数:sx,0,tx,0,sy,ty,0,0,1

计算如下:

sx = 5120/1920 = 2.66666666667
sy = 1440/1080 = 1.33333333333
tx = (5120 / 2) - (1920 / 2) = 1600
ty = (1440 / 2) - (1080 / 2) = 180

使用该矩阵,我们指示显示服务器按 (2.66666666667, 1.33333333333) 缩放帧缓冲区,然后通过平移 1600x180 单位将其居中。

相关内容