管理多头内存

在从属头上每个图面的 DDSCAPS2 结构的 dwCaps2 成员中设置DDSCAPS2_ADDITIONALPRIMARY功能位会通知该头,这些图面是从分配给该头的视频内存中分配的最后一个图面。 然后,从属头应放弃对其视频内存分配给主头的控制,因为从属头保证它在应用程序的生存期内不会收到后续 的 DdCreateSurface 调用。

驱动程序必须确保主头能够分配与从属头关联的内存。

当运行时调用驱动程序的 DdDestroySurface 函数来销毁设置了DDSCAPS2_ADDITIONALPRIMARY功能位的从属头上的图面时,将通知驱动程序从属头再次控制其视频内存管理。

在大多数情况下,选择哪个头拥有视频内存是现有 DirectDraw 进程中固有的。 尤其是在下列情况下:

  • 运行时保证在使用 DDSCAPS2_ADDITIONALPRIMARY 位进行 DdCreateSurface 调用后,不会对从属头发出后续分配请求。 因此,驱动程序无需随时限制来自其自己的视频内存池的分配。

  • 终止或最小化应用程序时,将销毁所有图面。 因此,主头从从属头的池中创建的所有纹理都会被清理。

  • 如果未为从属头上的图面设置DDSCAPS2_ADDITIONALPRIMARY位,则这些头会继续分配视频内存,就像它们是独立的头一样。 事实上,此类从属头在功能上与任何其他多监视器适配器相同。

  • 驱动程序需要提供一个实现,其中主头从从头的池中分配内存,包括确定何时可以从从头的池中分配特定资源。 请注意,主头本身没有任何关于它是否参与多头方案的信息。 当主头耗尽其自己的视频内存时,它必须遍历其组中的所有从属头,以确定其中是否有任何一个头具有可供主 (使用的池,换句话说,以确定是否有任何从属头接收了DDSCAPS2_ADDITIONALPRIMARY位集) 的 DdCreateSurface 调用。

  • 最后,请注意,运行时保证组中的所有头都参与多头方案。 因此,驱动程序必须仅保持一位状态,指示它当前是否处于多头模式。