DXGKDDI_STOP_DEVICE_AND_RELEASE_POST_DISPLAY_OWNERSHIP回调函数 (dispmprt.h)
OS 调用内核模式显示驱动程序 (KMD) DxgkddiStopDeviceAndReleasePostDisplayOwnership 函数来请求 KMD 重置显示设备和释放当前开机自测试 (POST) 设备的所有权。
语法
DXGKDDI_STOP_DEVICE_AND_RELEASE_POST_DISPLAY_OWNERSHIP DxgkddiStopDeviceAndReleasePostDisplayOwnership;
NTSTATUS DxgkddiStopDeviceAndReleasePostDisplayOwnership(
[in] PVOID MiniportDeviceContext,
[in] D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
[out] PDXGK_DISPLAY_INFORMATION DisplayInfo
)
{...}
参数
[in] MiniportDeviceContext
与显示适配器关联的上下文块的句柄。 KMD 的 DxgkDdiAddDevice 函数以前向 DirectX 图形内核子系统(Dxgkrnl)提供了此句柄。
[in] TargetId
一个 D3DDDI_VIDEO_PRESENT_TARGET_ID 值,该值指定显示设备连接到的显示适配器上视频呈现目标的标识符。 此标识符可以是在上一次调用 dxgkDdiCommitVidPn期间在当前视频演示网络(VidPN)状态中留下的目标的标识符。
有关使用 TargetId 参数的更多详细信息,请参阅“备注”部分。
[out] DisplayInfo
指向 OS 分配的 DXGK_DISPLAY_INFORMATION 结构的指针。
返回值
如果成功,则返回 STATUS_SUCCESS。 否则,它将返回 Ntstatus.h中定义的错误代码之一。 有关详细信息,请参阅“备注”部分。
言论
从 Windows 8(WDDM 1.2 开始),OS 在即插即用(PnP)停止操作期间调用此函数。
若要向 OS 指示此函数受支持,驱动程序必须在调用 DxgkDdiQueryAdapterInfo 函数时设置 DXGK_DRIVERCAPS 结构的 NonVGASupport 成员。
允许的颜色格式
KMD 应仅报告 32 位颜色格式。 因此,DisplayInfo->ColorFormat 成员必须仅包含以下两种 D3DDDIFORMAT 格式之一:
- D3DDDIFMT_X8R8G8B8
- D3DDDIFMT_A8R8G8B8
视频演示目标初始化
KMD 必须将 DisplayInfo->TargetId 成员设置为保持活动状态的显示器的目标标识符。 通常,此标识符将是 OS 传递给驱动程序的 TargetId 参数的值。
同样,KMD 必须将 DisplayInfo->AcpiId 成员设置为保持活动的显示器的 ACPI 标识符。
KMD 所需的步骤
调用 KMD DxgkDdiStopDeviceAndReleasePostDisplayOwnership 函数时,KMD 必须执行以下步骤:
停止与由 TargetId 参数指示的视频演示目标关联的显示设备,但必须保持与此目标关联的显示并可见。
检查与此目标关联的显示的连接。 如果目标未连接显示器,则 KMD 必须完成对此函数的调用并返回 STATUS_NOT_SUPPORTED 错误代码。
禁用连接到显示适配器的所有其他显示器的信号。 如果无法执行此操作,驱动程序应尝试将空白图像放在所有其他显示器上。 如果无法执行此操作,驱动程序必须在屏幕上保留最后一张图像不变。
将当前显示模式保留在指示的目标上,并将此模式作为此函数调用的一部分返回到 OS。
如果驱动程序无法维护当前显示模式,或者目标不是活动拓扑的一部分,驱动程序应选择备用活动目标并尝试维护该目标的当前分辨率。 如果不可能,驱动程序应尝试将显示器设置为其本机分辨率或高分辨率模式。 在这种情况下,显示分辨率必须设置为至少 800 x 600 像素,D3DDDIFMT_R8G8B8(每像素 24 位)或 D3DDDIFMT_X8R8G8B8 (32 bpp) 颜色格式。
如果没有活动目标,驱动程序应尝试启用目标,最好是内部面板(如果可用)。
如果可能,驱动程序必须清除当前帧缓冲区并禁用硬件光标和所有显示覆盖。
如果可能,驱动程序必须将设备的 gamma 渐变设置为其默认值。
驱动程序必须将当前帧缓冲区设置为处于线性模式。 驱动程序通过使用默认重排范围或禁用重排模式执行此操作。
驱动程序必须将当前帧缓冲区线性映射到 CPU 地址空间,使当前帧缓冲区可供 CPU 访问。
驱动程序必须确保所指示目标的可见性设置为“已启用”。
KMD 执行这些步骤后,它必须返回设备的当前显示设置。 驱动程序通过设置 DisplayInfo 参数引用的 DXGK_DISPLAY_INFORMATION 结构的成员来返回此信息。
设备停止后,Windows 通用显示驱动程序可能会使用此显示信息来管理显示设备。
其他要求
在支持统一可扩展固件接口(UEFI)的系统上,VGA 基本输入/输出系统(BIOS)不存在。 为了支持在这些系统上执行 PnP 停止操作,WDDM 1.2 及更高版本支持 OS 重置 POST 设备并在 PnP 停止操作期间获取其显示信息。 OS 通过调用 KMD 的 DxgkDdiStopDeviceAndReleasePostDisplayOwnership 函数来执行此操作。
在响应设备管理器等进程或驱动程序升级过程中的请求时,可能会发生 PnP 停止操作。
从 Windows 8 开始,OS 仅在 PnP 停止操作期间调用驱动程序的 DxgkDdiStopDeviceAndReleasePostDisplayOwnership 函数。
KMD 可以选择调用 DxgkCbAcquirePostDisplayOwnership。 但是,无论驱动程序是否之前调用 DxgkCbAcquirePostDisplayOwnership,OS 仍可能调用 KMD 的 DxgkDdiStopDeviceAndReleasePostDisplayOwnership 函数。
如果驱动程序成功完成对此函数的调用,则 OS 不会调用 KMD 的 DxgkDdiStopDevice 函数。 如果驱动程序未能完成对此函数的调用,OS 将调用 DxgkDdiStopDevice,并且设备行为将与 Windows 7 中的相同。
在仅限 UEFI 的系统上,如果 KMD 无法调用此函数,则会显示黑屏,并且未安装 IHV 驱动程序。 此方案的解决方法是让用户重新启动计算机。
有关如何在 PnP 方案中使用此函数的详细信息,请参阅 WDDM 1.2 及更高版本中 即插即用 (PnP)。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 8 (WDDM 1.2) |
支持的最低服务器 | Windows Server 2012 |
目标平台 | 桌面 |
标头 | dispmprt.h |
IRQL | PASSIVE_LEVEL |