枚举协同工作的 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 拓扑中的每个路径的信息。 有关特定路径的信息 (源 ID、目标 ID、缩放转换、旋转转换、目标颜色基础等) 包含在 D3DKMDT_VIDPN_PRESENT_PATH 结构中。
对于每个路径,将路径的源 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 不得更改缩放 (旋转) 该路径的支持标志。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈