枚举协同工作的 VidPN 源和目标模式
本主题介绍视频呈现网络 (VidPN) 管理器和显示微型端口驱动程序如何协作,以枚举视频呈现源和目标上可用的模式。 在阅读本材料之前,应该熟悉以下主题的材料:
VidPN 管理器会不时要求显示微型端口驱动程序列举显示适配器视频源和目标的可用模式。 通常,请求的模式如下:
VidPN 管理器会创建或获取一个 VidPN,而该 VidPN 会固定在其部分(而非全部)源和目标上。
VidPN 管理器会调用 DxgkDdiIsSupportedVidPn 来确定 VidPN 是否可以扩展,以形成显示适配器支持的功能 VidPN。 也就是说,它询问是否可以在不改变现有固定模式的情况下,将模式固定在其余的源和目标上。
VidPN 管理器会调用 DxgkDdiEnumVidPnCofuncModality,以获取还没有固定模式的源和目标上的可用模式。
传递给 DxgkDdiEnumVidPnCofuncModality 的参数之一是一个 VidPN 对象的句柄,名为约束 VidPN。
DxgkDdiEnumVidPnCofuncModality 必须执行以下操作:
检查约束 VidPN。
对于没有固定模式的每个源和目标,请调整模式集,使其成为与约束条件共功能的最大可能模式集。
对于没有固定缩放转换的每个路径,请调整缩放支持标志,使其与约束条件共同发挥作用。
对于没有固定旋转转换的每个路径,请调整旋转支持标志,使其与约束条件共同发挥作用。
对于每个具有固定模式的源,报告该源可用的多重采样方法。
以下段落将详细介绍如何执行上一列表中的每项任务。
检查约束 VidPN。
以下约束 VidPN 的属性是 DxgkDdiEnumVidPnCofuncModality 必须遵守的约束。
拓扑(源和目标之间的关联集)
固定模式
每个路径的缩放、缩放支持、旋转和旋转支持
每个路径的目标颜色基础
每个路径的目标颜色系数动态范围
每个路径的内容类型(图形或视频)
每个路径的伽马渐变
要从约束 VidPN 中提取约束,请执行以下步骤:
首先,调用 pfnGetTopology 函数,获取指向 VidPN 拓扑接口的指针,该接口代表约束 VidPN 的拓扑结构。
调用 pfnAcquireFirstPathInfo 和 pfnAcquireNextPathInfo 函数,获取有关约束 VidPN 拓扑中每个路径的信息。 D3DKMDT_VIDPN_PRESENT_PATH 结构中包含有关特定路径的信息(源 ID、目标 ID、缩放转换、旋转转换、目标颜色基础等)。
对于每个路径,将路径的源 ID 传递给 pfnAcquireSourceModeSet 函数,以获取路径的源。
调用 pfnAcquirePinnedModeInfo 函数来确定源的模式集中有哪些模式(如有)被固定。 如果源的模式集中有一个固定模式,则可能无需检查模式集中的其余模式。 如果模式集中没有固定模式,则通过调用 pfnAcquireFirstModeInfo 和 pfnAcquireNextModeInfo 来检查模式集中的其余模式。
使用类似的程序检查目标模式集,并确定哪些目标模式集有固定模式。
调整模式集
在检查与限制 VidPN 拓扑中的源和目标相关联的模式集时,请注意哪些模式集具有固定模式。 如果模式集没有固定模式,则确定是否需要调整。 如果一个模式集包含的模式与约束不兼容,或者缺乏与约束兼容的可用模式,则必须对该模式集进行调整。
对于已连接监视器的视频演示目标,还必须考虑监视器支持的模式集。 即使显示适配器上的视频呈现目标支持特定模式(给定的约束),也只有在所连接的显示器同样支持该模式的情况下,才能在目标的模式集中列出该模式。 要确定所连接显示器支持的模式,请执行以下步骤:
-
调用 pfnAcquireMonitorSourceModeSet。 如果某个模式设置不需要调整,则可以将其保留。 如果需要调整模式集,则必须创建新的模式集,并用新模式集替换现有的模式集。
-
要创建和填充新的源模式集,请调用 pfnCreateNewSourceModeSet。
_DXGK_VIDPNSOURCEMODESET_INTERFACE
然后调用 pfnCreateNewModeInfo 和 pfnAddMode。
-
最后调用 pfnAssignSourceModeSet 将现有源模式集替换为新的模式集。
调整缩放支持标志
对于约束 VidPN 拓扑中的每个路径,确定该路径是否有固定的缩放转换。 要作出该决定,请检查 vpnPath.ContentTransformation.Scaling,其中 vpnPath 是表示路径的 D3DKMDT_VIDPN_PRESENT_PATH 结构。 如果 vpnPath.ContentTransformation.Scaling 被设置为 D3DKMDT_VPPS_IDENTITY、D3DKMDT_VPPS_CENTERED 或 D3DKMDT_VPPS_STRETCHED,则路径的缩放转换将被固定。 否则,缩放转换不会被固定。
如果路径没有固定的缩放转换,请确定是否需要调整路径的缩放支持标志。 如果支持标志显示支持的缩放类型与约束不兼容,或支持的缩放类型与约束兼容但却不支持,则必须对支持标志进行调整。 要更改缩放支持标志,请设置用于保存标志的 D3DKMDT_VIDPN_PRESENT_PATH_SCALING_SUPPORT 结构中的成员。
调整旋转支持标志
调整路径的旋转支持标记与调整路径的缩放支持标记类似。 假设 vpnPath 是一个 D3DKMDT_VIDPN_PRESENT_PATH 结构。 如果 vpnPath.ContentTransformation.Rotation 被设置为 D3DKMDT_VPPR_IDENTITY、D3DKMDT_VPPR_ROTATE90、D3DKMDT_VPPR_ROTATE180 或 D3DKMDT_VPPR_ROTATE270,则路径的旋转转换将被固定。 否则,旋转转换不会被固定。 旋转支持标志位于 vpnPath.ContentTransformation.RotationSupport 中。
报告多重采样方法
如果显示适配器有一个或多个视频输出编解码器能够通过多采样进行抗锯齿处理,则必须为每个具有固定模式的源报告可用的多采样方法(给定约束)。 要报告可用的多重取样方法,请执行以下步骤:
- 创建 D3DDDI_MULTISAMPLINGMETHOD 结构的数组
- 将数组传递给 VidPN 接口的 pfnAssignMultisamplingMethodSet 函数。
D3DDDI_MULTISAMPLINGMETHOD 结构有两个必须设置的成员,用于描述多重取样方法的特征。 NumSamples 成员表示采样的子像素数。 NumQualityLevels 成员表示方法可以运行的质量级别数量。 可以指定任意数量的质量级别,只要每增加一个级别都能明显改善显示图像的质量。
枚举透视
如前所述,DxgkDdiEnumVidPnCofuncModality 必须创建与 hConstrainingVidPn 参数中传递的 VidPN 功能相同的模式集。 在某些情况下,DxgkDdiEnumVidPnCofuncModality 必须根据 EnumPivotType 和 EnumPivot 参数中传递的附加信息(枚举透视)来增强其行为。
枚举透视可以是以下之一:
特定视频呈现源的模式集
特定视频呈现目标的模式集
特定 VidPN 呈现路径的缩放转换
特定 VidPN 呈现路径的旋转转换
如果枚举透视是一个模式集,那么 DxgkDdkEnumVidPnCofuncModality 必须保持该模式集不变。 如果枚举透视是路径的缩放(旋转)转换,则 DxgkDdiEnumVidPnCofuncModality 不得更改该路径的缩放(旋转)支持标志。