使用纵横比和自定义缩放模式

为了支持从 Windows 7 ((其中 DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN7) )开始可用的纵横比保留拉伸缩放和自定义缩放模式,向显示微型端口驱动程序使用的 VidPN 呈现路径数据添加了以下功能:

指定缩放模式

缩放桌面映像中介绍了使用这些缩放模式的监视器上 桌面的行为和外观。 当显示模式管理器 (DMM) 调用 DxgkDdiEnumVidPnCofuncModality 函数时,驱动程序必须根据 VidPN 当前路径支持的缩放类型设置 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT 的成员,如下所示:

标识缩放
如果路径可以显示不带转换的内容,请将 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORTIdentity 成员设置为非零值。 调用 DxgkDdiEnumVidPnCofuncModality 时,将 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION 结构的缩放成员设置为 D3DKMDT_VPPS_IDENTITY

居中缩放
如果路径可以显示未缩放且以目标为中心的内容,请将 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT。居中。 调用 DxgkDdiEnumVidPnCofuncModality 时,设置 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION。缩放D3DKMDT_VPPS_CENTERED

拉伸缩放
如果路径可以显示缩放以适应目标的内容,同时不保留源的纵横比,请设置 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT。拉伸。 调用 DxgkDdiEnumVidPnCofuncModality 时,设置 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION。缩放D3DKMDT_VPPS_STRETCHED

纵横比保留拉伸缩放
如果路径可以缩放源内容以适应目标,同时保留源的纵横比,请设置 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT。AspectRatioCenteredMax。 调用 DxgkDdiEnumVidPnCofuncModality 时,设置 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION。缩放D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAX

自定义缩放
如果路径可以显示其他 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT 结构成员未描述的一个或多个缩放模式,请设置 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT。自定义。 调用 DxgkDdiEnumVidPnCofuncModality 时,设置 D3DKMDT_VIDPN_PRESENT_PATH_TRANSFORMATION。缩放D3DKMDT_VPPS_CUSTOM。 独立硬件供应商 (IHV) 可以使用专用转义值来通知驱动程序如何解释给定目标上的自定义缩放。

如果当前固定的目标模式和源模式具有相同的纵横比,但大小不同,则显示微型端口驱动程序应仅设置 拉伸居中 成员。 在这种情况下,DMM 将清除 AspectRatioCenteredMax 成员的任何非零值。

API 到 DDI 缩放

下表显示了用户模式 API 缩放值与 D3DKMDT_VIDPN_PRESENT_PATH_SCALING 枚举中的显示微型端口驱动程序 DDI 缩放值的对应关系。

SetDisplayConfig API 缩放值 DDI 缩放值

DC_IDENTITY

D3DKMDT_VPPS_IDENTITY

DC_CENTERED

D3DKMDT_VPPS_CENTERED

DC_STRETCHED

D3DKMDT_VPPS_STRETCHED

DC_ASPRATIOMAX

D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAX

DC_CUSTOM

D3DKMDT_VPPS_CUSTOM

DC_PREFERRED

D3DKMDT_VPPS_PREFERRED

此映射可与 缩放桌面映像 中的表一起使用,以了解用户模式缩放类型如何转换为发送到显示微型端口驱动程序的 DDI 缩放类型。

缩放和驱动程序版本

下表显示了在不同版本的操作系统上运行的不同显示微型端口驱动程序版本的行为。

驱动程序版本操作系统版本

DXGKDDI_INTERFACE_VERSION<DXGKDDI_INTERFACE_VERSION_WIN7

>= DXGKDDI_INTERFACE_VERSION_VISTA

DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN7

Windows Vista

驱动程序具有 Windows Vista 行为。

驱动程序必须在初始化期间检查操作系统版本,并且绝不应公开或使用 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORTAspectRatioCenteredMaxCustom 成员。 如果驱动程序违反此要求,DMM 将忽略 AspectRatioCenteredMaxCustom ,并且仅识别 IdentityCenteredStretched 成员。 如果驱动程序尝试在任何 VidPN 路径上固定 D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAX 缩放模式,DMM 将返回 状态代码STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION ,并将此缩放模式视为全屏拉伸模式。

Windows 7

操作系统清除 AspectRatioCenteredMaxCustom 成员的值,并假定驱动程序不支持保持纵横比的拉伸缩放和自定义缩放模式。 DMM 将仅设置 D3DKMDT_VPPS_IDENTITYD3DKMDT_VPPS_STRETCHEDD3DKMDT_VPPS_CENTERED缩放模式。 驱动程序的行为与 Windows Vista 上的行为相同。

驱动程序应支持 AspectRatioCenteredMax 成员,并且操作系统从控制面板应用程序中使用它。 驱动程序可以选择通过设置 Custom 成员来实现 自定义 功能。

在尝试检查并使用D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORTAspectRatioCenteredMaxCustom 成员之前,DMM 始终会确认驱动程序接口 >= DXGKDDI_INTERFACE_VERSION_WIN7

重要 支持 D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAXD3DKMDT_VPPS_CUSTOM 值的显示微型端口驱动程序绝不应将 值设置为 D3DKMDT_VPPS_NOTSPECIFIED

使用多个适配器进行缩放

随 Windows 7 引入的缩放类型 D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAXD3DKMDT_VPPS_CUSTOM 的值存储在与 GPU () 图形处理单元关联的 CCD 连接数据库中。 如果用户使用支持这些缩放成员的驱动程序将监视器从一个 GPU 移动到另一个 GPU,则原始驱动程序可能不支持第二个 GPU。 在这种情况下,操作系统会将这些缩放类型映射到系统默认缩放。

如果两个 GPU 都支持 D3DKMDT_VPPS_ASPECTRATIOCENTEREDMAXD3DKMDT_VPPS_CUSTOM缩放类型,并且第一个 GPU 的驱动程序实现了 D3DKMDT_VPPS_CUSTOM 自定义缩放请求,那么如果用户将监视器切换到第二个 GPU,则第二个 GPU 的驱动程序可能不知道如何解释自定义缩放请求。 在这种情况下,第二个驱动程序应无法调用 DxgkDdiCommitVidPn 函数,并应返回 STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED 状态代码;操作系统会将此缩放类型映射到系统默认缩放。