用户模式显示驱动程序的线程模型

用户模式显示驱动程序不会同时加载到多个进程中,用户模式显示驱动程序 DLL 单独加载到每个进程的地址空间中。 不过,多个线程可以同时在用户模式显示驱动程序中运行。 但是,在用户模式显示驱动程序中运行的每个线程都必须访问不同的显示设备,该设备是通过调用用户模式显示驱动程序的 CreateDevice 函数创建的。 例如:

  • 创建两个 Microsoft Direct3D 设备的应用程序可以有两个单独访问这些设备的线程。

  • 应用程序可以在两个不同的线程上使用 Microsoft DirectX 9.0 Direct3D 运行时创建的 Direct3D 设备以及 DirectX 5.0 运行时创建的 Microsoft DirectDraw 设备。

注意 使用同一显示设备的两个或多个线程永远无法在用户模式显示驱动程序中同时运行。

与显示微型端口驱动程序一样,用户模式显示驱动程序不需要使用任何全局数据结构,因为 Direct3D 设备是独立的,并且每个设备的状态和资源不会影响其他设备。 如果用户模式显示驱动程序必须维护全局跨设备数据结构 (例如,对于自定义系统内存堆管理器) ,它必须使用自己的机制来仲裁访问。 强烈建议不要使用驱动程序管理的此类全局数据结构。 由于 Direct3D 运行时在必须访问资源的每个用户模式显示设备中打开共享资源的独立“视图”,因此跨进程或跨设备资源的处理方式不应不同于单个进程或设备使用的资源。 生存期和其他管理由 DirectX 图形内核子系统 (Dxgkrnl.sys) 处理。

在多处理器计算机上,Direct3D 运行时可能从工作线程而不是从main应用程序线程调用用户模式显示驱动程序。 这种多处理器优化对用户模式显示驱动程序是透明的。 当运行时使用多处理器优化时,它仍然确保在任何给定时间,只有一个引用特定设备的线程在驱动程序中运行。