DXGKDDI_SYSTEM_DISPLAY_ENABLE回调函数 (dispmprt.h)

OS 调用内核模式显示驱动程序 (KMD) DxgkddiSystemDisplayEnable 函数,以请求 KMD 将当前显示设备重置为指定状态。

语法

DXGKDDI_SYSTEM_DISPLAY_ENABLE DxgkddiSystemDisplayEnable;

NTSTATUS DxgkddiSystemDisplayEnable(
  [in]  PVOID MiniportDeviceContext,
  [in]  D3DDDI_VIDEO_PRESENT_TARGET_ID TargetId,
  [in]  PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS Flags,
  [out] UINT *Width,
  [out] UINT *Height,
  [out] D3DDDIFORMAT *ColorFormat
)
{...}

参数

[in] MiniportDeviceContext

与显示适配器关联的上下文块的句柄。 KMD 的 DxgkDdiAddDevice 函数以前提供了此句柄来 Dxgkrnl

[in] TargetId

一个 D3DDDI_VIDEO_PRESENT_TARGET_ID 值,该值指定显示设备连接到的显示适配器上视频呈现目标的标识符。 此标识符可以是在上一次调用 dxgkDdiCommitVidPn期间在当前视频演示网络(VidPn)状态中留下的目标的标识符。

[in] Flags

指向包含按位 OR 标志的 DXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS 值的指针。 此成员由 OS 保留。

[out] Width

指定设备的显示模式的宽度(以像素为单位)。

[out] Height

指定设备的显示模式的高度(以像素为单位)。

[out] ColorFormat

指向指定显示设备颜色格式的 D3DDDIFORMAT 值的指针。

返回值

DxgkDdiSystemDisplayEnable 如果成功,则返回STATUS_SUCCESS。 如果 TargetId 参数指定的目标未连接到显示设备,该函数将返回STATUS_NOT_SUPPORTED。 否则,它将返回 Ntstatus.h中定义的错误代码之一。

言论

OS 在出现系统停止错误后,在 bug 检查操作期间调用 DxgkddiSystemDisplayEnable

KMD 所需的步骤

调用 KMD DxgkDdiSystemDisplayEnable 函数时,必须执行以下步骤:

  1. 取消所有 GPU 操作或将 GPU 重置为空闲状态。
  2. OS 通过 TargetId 参数指示视频演示目标。 驱动程序必须保持与此目标关联的显示器打开并可见。 如果驱动程序无法打开显示器,则调用此函数必须失败。 在这种情况下,OS 可能会调用 DxgkDdiResetDevice 并导致系统 bug 检查。
  3. 检查与此目标关联的显示的连接。 如果目标未连接显示器,驱动程序必须完成对此函数的调用并返回STATUS_NOT_SUPPORTED错误代码。
  4. 禁用连接到显示适配器的所有其他显示器的信号。 如果无法执行此操作,驱动程序应尝试将空白图像放置在所有其他显示器上。 如果无法执行此操作,驱动程序必须在屏幕上保留最后一张图像不变。
  5. 将当前显示模式保留在指示的目标上,并将此模式作为此函数调用的一部分返回到 OS。
  6. 如果驱动程序无法维持当前显示模式,或者目标不是活动拓扑的一部分,驱动程序应尝试在另一个目标上设置帧缓冲区,该目标能够以每像素 24 位的格式至少显示分辨率为 640 x 480 像素。 如果无法执行此操作,驱动程序可能会失败此函数调用,这将导致系统 bug 检查和黑屏的显示。

KMD 不必使用线性帧缓冲区模式。 但是,KMD 应支持从具有 D3DDDIFORMAT 枚举 D3DDDIFMT_A8R8G8B8 格式的源到此帧缓冲区的写入操作。

源图像限制

KMD 为 OS 控制显示功能后,OS 可以调用 DxgkDdiSystemDisplayWrite 函数来更新屏幕图像,并将来自指定源的图像块写入由 DxgkDdiSystemDisplayEnable 函数重置的屏幕。

DxgkDdiSystemDisplayWrite 为驱动程序提供源图像的起始地址以及步幅、宽度和高度。 源图像的颜色格式始终 D3DDDIFMT_X8R8G8B8。 OS 保证源映像位于非分页内存中。

KMD 必须将此源图像写入当前屏幕,从 PositionX 指定的位置开始,以及 DxgkDdiSystemDisplayWrite 函数的 PositionY 参数。

建议驱动程序使用 CPU 将映像从源写入帧缓冲区,因为系统 bug 检查可能是由重复 超时检测和恢复(TDR) 实例引起的,导致 GPU 处于未知状态。

使用非分页内存

调用此函数时,Windows 内核模式函数可能不可用。

DxgkDdiSystemDisplayEnable 可在任何 IRQL 上调用,因此它必须位于不可分页的内存中。 DxgkDdiSystemDisplayEnable 不得调用任何在可分页内存中的代码,并且不得操作可分页内存中的任何数据。

自动显示切换

自动显示开关驱动程序的 DxgkDdiSystemDisplayEnable DDI 必须确保在调用结束时禁用面板自我刷新(PSR)。 有关详细信息,请参阅 自动显示开关

要求

要求 价值
最低支持的客户端 Windows 8 (WDDM 1.2)
支持的最低服务器 Windows Server 2012
目标平台 桌面
标头 dispmprt.h
IRQL 任何级别 (请参阅“备注”部分)

另请参阅

D3DDDIFORMAT

DxgkCbAcquirePostDisplayOwnership

DxgkDdiAddDevice

DxgkDdiCommitVidPn

DxgkDdiResetDevice

DxgkDdiStopDeviceAndReleasePostDisplayOwnership

DxgkDdiSystemDisplayWrite