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 必须执行以下步骤:

  1. 停止与由 TargetId 参数指示的视频演示目标关联的显示设备,但必须保持与此目标关联的显示并可见。

  2. 检查与此目标关联的显示的连接。 如果目标未连接显示器,则 KMD 必须完成对此函数的调用并返回 STATUS_NOT_SUPPORTED 错误代码。

  3. 禁用连接到显示适配器的所有其他显示器的信号。 如果无法执行此操作,驱动程序应尝试将空白图像放在所有其他显示器上。 如果无法执行此操作,驱动程序必须在屏幕上保留最后一张图像不变。

  4. 将当前显示模式保留在指示的目标上,并将此模式作为此函数调用的一部分返回到 OS。

  5. 如果驱动程序无法维护当前显示模式,或者目标不是活动拓扑的一部分,驱动程序应选择备用活动目标并尝试维护该目标的当前分辨率。 如果不可能,驱动程序应尝试将显示器设置为其本机分辨率或高分辨率模式。 在这种情况下,显示分辨率必须设置为至少 800 x 600 像素,D3DDDIFMT_R8G8B8(每像素 24 位)或 D3DDDIFMT_X8R8G8B8 (32 bpp) 颜色格式。

  6. 如果没有活动目标,驱动程序应尝试启用目标,最好是内部面板(如果可用)。

  7. 如果可能,驱动程序必须清除当前帧缓冲区并禁用硬件光标和所有显示覆盖。

  8. 如果可能,驱动程序必须将设备的 gamma 渐变设置为其默认值。

  9. 驱动程序必须将当前帧缓冲区设置为处于线性模式。 驱动程序通过使用默认重排范围或禁用重排模式执行此操作。

  10. 驱动程序必须将当前帧缓冲区线性映射到 CPU 地址空间,使当前帧缓冲区可供 CPU 访问。

  11. 驱动程序必须确保所指示目标的可见性设置为“已启用”。

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

另请参阅

DXGKRNL_INTERFACE

DXGK_DISPLAY_INFORMATION

DXGK_DRIVERCAPS

DxgkCbAcquirePostDisplayOwnership

DxgkDdiAddDevice

DxgkDdiQueryAdapterInfo

DxgkDdiStartDevice

DxgkDdiStopDevice