X协议调整大小、旋转和反射的扩展(The X Resize, Rotate and Reflect Extension )

英文源文地址: https://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt ,本文仅做简单翻译,获得对XRandR的大致了解。

一、引言

    X 协议中Resize,Rotate和Reflect扩展,简称RandR,可以调整大小,旋转和反射屏幕的根窗口。它基于2001年Usenix技术会议论文集[RANDR]中规定的X调整大小和旋转扩展。
   实现并集成到X服务器中的RandR与该论文中讨论的设计有很大不同:即,RandR 1.0不实现该文档中描述的深度切换功能,并且文档和实现中对于协议描述的支持,已经这儿的协议描述中去除了,被其他事件所取代。
    这些事件包括:
      ►现代工具包(在本例中为GTK + 2.x)已经发展到了可以在任意深度的屏幕之间实现移植的程度
   ►摩尔定律的不断发展使得VRAM数量的限制不再成为一个问题,减少了在笔记本电脑或台式机系统上实现深度切换的压力
   ►需要针对深度切换的设计,来支持迁移的传统工具包持续衰落
   ►由于我们无法控制的事件,在此期间缺乏深度切换实现经验
    此外,支持深度切换的需求使重新设计X server上的设备独立部分变得复杂。
    不能为了社区一直想要的特性,进一步推迟RandR的广泛部署(调整屏幕大小,特别是在笔记本电脑上),或者部署可能缺乏实现经验而存在缺陷的协议,我们决定从协议中删除深度切换。如果条件允许,我们可能会在以后作为协议的修订实现,这样仍然可以保持应用程序有一个稳定的基础。这里描述的协议已经在主要的X.org服务器中实现,并且在分发的hw / kdrive实现中更加完善,完全实现了调整大小,旋转和映射。
1.2 扩展协议的1.2版本简介
    RandR协议版本1.1中发现的一个重要限制是无法处理Xinerama模型,其中多个显示器只显示公共底层屏幕的一部分。在这种环境中,零个或多个视频输出与每个CRT控制器相关联,该控制器定义一组视频定时和较大屏幕内的“视口(viewport)”。 此视口独立于屏幕的整体大小,可能位于屏幕内的任何位置。
    这样做的影响是将屏幕尺寸与每个视频输出显示的尺寸分离,并允许多个输出在同一个屏幕上显示信息。
    为了扩展RandR,我们将输出、CRTC和屏幕配置信息分开,并允许它们单独配置。为了与协议的1.1版本兼容,我们使1.1请求同时影响屏幕和(可能是唯一的)CRTC和输出。可用输出集以UTF-8编码的名称呈现,并且可以在底层硬件允许的情况下连接到CRTC。 CRTC配置现在使用完整模式信息而不仅仅是大小和刷新率,每个模式都有名字。这些名称也使用UTF-8编码。用户也可以添加新模式。
    为此新功能提供了其他请求和事件。
                              

 

    在上图中,屏幕被两个CRTC覆盖(不完整)。CRTC1连接到两个输出A和B.CRTC2连接到输出C。输出A和B将使用相同的模式行呈现完全相同的屏幕区域。输出C将使用不同的模式行,呈现不同(更大)的屏幕区域。
RandR提供每个可用CRTC和输出的相关信息;CRTC和输出之间的连接处于应用程序控制之下,尽管硬件可能会对配置施加限制。该协议不会试图描述这些限制,而是提供了一种机制来找出支持的组合。
1.3 扩展协议的1.3版本简介
 
   版本1.3基于1.2做更改,并添加了一些新功能,不需要从根本上改变扩展。 此版本中添加了以下功能:
     •投影变换。一般旋转支持的实现工作使得添加完整的投影变换变得微不足道。这些可以用于缩放屏幕以及执行投影原则校正等。
     •平移。它被RandR 1.2删除了,因为旧的语义不再适用。使用RandR 1.3可以在每个crtc上指定平移。 
1.4扩展协议的1.4版本简介
    版本1.4添加了可选的Border属性。
    •可选的Border属性。此属性允许客户端指定CRTC的视口小于在模式中描述的活跃显示区域。例如,这对于补偿某些电视的过扫描行为很有用。
   1.4版添加了一个新对象:a provider object。提供者对象代表向X服务器提供服务的GPU或虚拟设备。提供者具有一系列能力和一组可能的角色。
   提供者对象用于控制多GPU系统。可以动态配置提供者角色以提供以下支持:
    1)输出从属:插入USB设备,但使用主GPU渲染其输出。在一些双GPU笔记本电脑上,第二个GPU未连接到LVDS面板,因此我们需要将第一个GPU用作第二个GPU的输出从属设备。
    2)卸载 - 对于双GPU笔记本电脑,允许直接渲染的应用程序在第二个GPU上运行并在第一个GPU上显示。
    3)GPU切换 - 允许主屏幕渲染器在两个GPU之间切换。
    4)多GPU渲染 - 取代Xinerama。 
1.5. 扩展协议的1.5版本简介
   1.5版为输出添加了一个可选的TILE属性。
   •可选的TILE属性。此属性用于表示平铺显示器配置中的各个tile,通过DisplayID v1.3公开。
   1.5版添加了monitor(下面翻译为监视器):
    •“monitor”是屏幕的矩形子集,表示呈现给用户的一系列像素集合。
    •每个监视器都与输出列表相关联(可能为空)。
    •客户端定义监视器时,将从现有监视器中删除关联的输出。如果删除导致该监视器的列表变空,则将删除该监视器。
对于没有与任何客户端定义的监视器关联的输出的CRTC,当第一个输出与之关联,将会自动定义一个服务器定义的监视器。
    •定义监视器时,将几何设置为全零将使该监视器动态跟踪与其关联的活动输出的边界。
   此新对象将硬件的物理配置从屏幕的逻辑子集分离开,应用程序应考虑单个可视区域。 
1.5.1.监视器与Xinerama之间的关系
   Xinerama的信息现在来自监视器,而不是直接来自CRTC。标记为Primary的监视器将首先列出。
1.5.2. 输出的生命周期说明
   随着DisplayPort multistream(MST)的引入,动态连接器的实现变成了可能,当RandR输出消失时,许多RandR客户端无法处理XID BadMatch。这说明X服务器不会动态删除输出,只需将它们标记为断开连接即可。

二、屏幕更改模型

屏幕可能会在此扩展程序的控制下或由于外部事件而动态更改。包括:交换监视器,按下按钮以从内部显示器切换到外部笔记本电脑上的监视器,热插拔的显卡都在总线上,例如Cardbus或允许热插拔的Express Card(除此扩展外还需要额外工作)。
   由于屏幕配置是动态的且与客户端异步,可能随时被更改,RandR提供一种机制确保您的客户端查看最新的可行配置,并强制执行希望控制配置的应用程序以证明其在履行更改屏幕配置的请求之前,信息是最新的(通过在请求中增加一个时间戳)。
   每当屏幕配置发生变化时,都会通知感兴趣的应用程序,提供屏幕的当前大小和子像素顺序,以确保显示子像素渲染和时间戳的正确性。客户端在更改配置前必须刷新对屏幕配置的了解,然后才能在通知后尝试更改配置,否则请求将失败。 
   为避免方向,反射和尺寸之间的乘法爆炸,尺寸仅为正常旋转中的尺寸。旋转和反射以及它们如何相互作用可能会令人困惑。在Randr中,坐标系相对于法线方向以逆时针方向旋转。反射是沿着窗口系统坐标系,而不是物理屏幕X和Y轴,因此旋转和反射不会相互作用。考虑反射的另一种方法是在旋转之前在“常规”方向中指定,如果感觉其他方式令人困惑。
   我们希望大多数客户端和工具包都对屏幕结构体的更改都是透明的,因为它们通常直接使用连接显示结构中的值。通过工具包动态更新,我们相信弹出菜单和其他弹出窗口将在屏幕配置更改时也能正确定位(问题是确保弹出窗口在重新配置的屏幕上可见)。
 
三、 数据类型
   子像素顺序和变换数据类型与Render扩展共享,并在那里记录。
   原始扩展中定义的唯一数据类型是屏幕大小,以正常(0度)方向定义。 在以后的版本中添加了几个。
posted @ 2018-12-17 10:59  ItalySue  阅读(430)  评论(0编辑  收藏  举报