支持多个处理器

多处理器计算机上的用户模式显示驱动程序可以让 Microsoft Direct3D 运行时处理多处理器优化,或者驱动程序可以执行自己的多处理器优化。

运行时处理的Multiple-Processor优化

Direct3D 运行时处理的多处理器优化仅在支持 LockAsyncUnlockAsyncRename 函数的驱动程序上启用。 这些函数使多处理器优化能够很好地适用于经常锁定动态资源的应用程序。 LockAsyncUnlockAsync 函数以及 GetQueryData 函数必须在公开 DDI 版本的 0x0000000B 或更高版本的驱动程序上重新进入。 驱动程序在调用驱动程序的 OpenAdapter 函数时,返回 D3D10DDIARG_OPENADAPTER 结构的 DriverVersion 成员中的 DDI 版本值。 当运行时以可重入方式调用驱动程序函数时,一个线程可以在该函数内执行,而另一个引用相同显示设备的线程在另一个驱动程序函数内执行。

在某些情况下,Direct3D 运行时使用多处理器优化将工作卸载到单独的处理器并提高计算机性能。 启用多处理器优化后,Direct3D 运行时和用户模式显示驱动程序之间会添加一个额外的软件层。 此软件层截获 Direct3D 运行时对用户模式显示驱动程序函数进行的所有调用。

软件层不会直接调用用户模式显示驱动程序,而是将命令排队到工作线程异步处理的批处理中。 但是,软件层无法批处理对用户模式显示驱动程序的函数进行的所有调用。 具体而言,软件层无法批量调用返回信息 (的函数,例如 CreateResource) 。 当软件层必须调用其中一种类型的驱动程序函数时,它会通过工作线程刷新所有排队的命令,然后软件层在main应用程序线程上调用驱动程序函数。

驱动程序处理的Multiple-Processor优化

如果驱动程序将执行其自己的多处理器优化,则它不得实现 LockAsyncUnlockAsyncRename 函数。 在这种情况下,驱动程序必须调用 pfnSetAsyncCallbacksCb 函数,以通知运行时运行时是启动还是停止接收来自工作线程的运行时回调函数的调用。

如果驱动程序执行自己的多处理器优化,则应遵循 Direct3D 运行时在确定启用多处理器优化时使用的相同策略。 此策略允许跨所有进程公平共享系统资源。 具体而言,在以下情况下,驱动程序应禁用多处理器优化:

  • 应用程序在窗口模式下运行。

  • 计算机仅包含一个处理器 (或处理器核心) ;驱动程序应在具有超线程的单处理器计算机上禁用优化。

  • 应用程序请求不启用多处理器优化,或者应用程序使用软件顶点处理;此信息将传递到驱动程序的 CreateDevice 函数。

如果供应商想要在这些情况下启用多处理器优化,应首先联系 Microsoft。