在标准与非标准模式之间切换

DirectX 9.0 驱动程序为标准显示模式创建标准主图面,为非标准模式创建虚拟主图面,以便运行时可以在必要时在模式之间切换。 两个图面表示相同的视频内存,但以不同的格式显示。 请求翻页时,驱动程序在标准模式和非标准模式之间切换,如以下顺序所示:

  1. 应用程序请求模式切换。

    应用程序调用 ChangeDisplaySettings 函数将视频模式更改为匹配的位深度。 对于 10:10:10:2 模式,位深度为每像素 32 位。 有关 ChangeDisplaySettings 的详细信息,请参阅Microsoft Windows SDK的文档。

  2. 驱动程序创建标准主图面。

    运行时调用驱动程序的 DdCreateSurface 函数以请求创建主图面。 此主图面使用标准显示格式 (例如,D3DFMT_A8B8G8R8) 且没有后台缓冲区。

  3. 驱动程序创建虚拟主图面链。

    运行时调用驱动程序的 DdCreateSurface 函数以请求创建虚拟主图面。 运行时为此图面指定 DDSCAPS2 结构的 dwCaps2 成员中的DDSCAPS2_EXTENDEDFORMATPRIMARY (0x40000000) 功能位,以指示该图面使用非标准显示模式 (例如,D3DFMT_A2R10G10B10) 。 运行时还指定 DDSCAPS2 的 dwCaps 成员中的DDSCAPS_OFFSCREENPLAIN功能位,以指示图面具有显式像素格式。

    由于此图面只是现有主图面的另一个名称,因此驱动程序不应为该图面分配更多视频内存。

    对于此图面,运行时还指定 dwCaps 中的DDSCAPS_FLIP和DDSCAPS_COMPLEX功能位,以及一组附加的后台缓冲区,类似于运行时设置标准主图面翻转链的方式。 驱动程序应为这些后台缓冲区分配视频内存,因为不会对这些后台缓冲区进一步调用驱动程序的 DdCreateSurface 函数;也就是说,运行时仅为标准主数据库创建多个图面对象。

  4. 驱动程序将图面翻转为非标准格式。

    当显示设备输出标准格式时,应用程序会在其中一个后台缓冲区中编写非标准图像。 准备好显示此图像后,运行时会将其中一个非标准图面指定为调用驱动程序的 DdFlip 函数的目标。 然后,驱动程序重新编程显示设备以输出非标准格式。

  5. 将运行应用程序。

    应用程序在非标准缓冲区之间生成对驱动程序的 DdFlip 函数的进一步调用,驱动程序继续显示非标准格式。 应用程序还可以使用D3DDP2OP_BLT操作代码生成对驱动程序的 D3dDrawPrimitives2 函数的调用,以将后台缓冲区复制到前缓冲区,但这些调用始终在两个非标准图面对象之间进行。 除非驱动程序支持窗口模式中的非标准格式,否则驱动程序不会处理非标准与标准图面格式之间的 blt。 有关窗口模式案例的详细信息,请参阅 支持Two-Dimensional操作

  6. 驱动程序将图面翻转回标准格式。

    当应用程序关闭或最小化时,运行时会将标准格式的主图面指定为调用驱动程序的 DdFlip 函数的目标。 然后,驱动程序重新编程显示设备以输出标准格式。

  7. 驱动程序销毁虚拟表面。

    当驱动程序销毁虚拟表面时,它应确保在显示设备中重新编程标准格式。