window显示驱动开发—在 Direct3D 10 基础上的更改

Kernel-Mode服务的驱动程序回调函数

当运行时调用用户模式显示驱动程序的 CreateDevice (D3D10) 函数时,Direct3D 版本 11 运行时在 D3DDDI_DEVICECALLBACKS 结构中提供的特定于设备的回调函数将驱动程序与内核句柄和内核函数签名隔离开来。 Direct3D 版本 11 运行时更改了回调语义,因此,回调函数的实现支持自由线程操作模式,而以前的 Direct3D 版本运行时不支持自由线程操作模式。 在驱动程序指示它支持自由线程模式 (D3D11DDICAPS_FREETHREADED) 后,适用于自由线程模式操作的规则;否则,将应用以前严格限制的规则。 有关驱动程序如何指示对自由线程模式的支持的信息,请参阅 线程和命令列表。 Direct3D 版本 11 仍存在以下限制:

  • 一次只能有一个线程对 HCONTEXT 工作。 当前使用 HCONTEXT 的现有回调函数是 pfnPresentCb、 pfnRenderCb、 pfnEscapeCb、 pfnDestroyContextCb、 pfnWaitForSynchronizationObjectCb 和 pfnSignalSynchronizationObjectCb。 因此,如果多个线程调用这些回调函数并使用相同的 HCONTEXT,则驱动程序必须同步对回调函数的调用。 满足此要求是很自然的,因为这些回调函数可能仅从操作即时上下文的线程调用。
  • 驱动程序必须仅在调用以下驱动程序函数期间使用调用这些驱动程序函数的相同线程来调用以下回调函数:
  1. pfnAllocateCb:创建共享资源时,驱动程序必须在调用驱动程序的 CreateResource (D3D11) 函数的线程上调用 pfnAllocateCb。 设备的常规非共享分配是完全自由线程的。
  2. pfnPresentCb:驱动程序只能在调用驱动程序的 PresentDXGI 函数期间调用 pfnPresentCb。
  3. pfnSetDisplayModeCb:驱动程序必须在调用驱动程序的 SetDisplayModeDXGI 函数期间调用 pfnSetDisplayModeCb。
  4. pfnRenderCb:驱动程序必须在调用驱动程序的 Flush (D3D10) 函数的线程上调用 pfnRenderCb。 由于 HCONTEXT 限制,此限制非常自然。
  • pfnDeallocateCb 回调函数应具有特殊提及,因为驱动程序不需要在驱动程序从其 DestroyResource (D3D10) 函数返回之前调用 pfnDeallocateCb,适用于大多数资源类型。 由于 DestroyResource (D3D10) 是一个自由线程函数,因此驱动程序必须推迟对对象的销毁,直到驱动程序可以有效地确保没有现有即时上下文引用保留 (也就是说,驱动程序必须在 pfnDeallocateCb) 之前调用 pfnRenderCb。 此限制甚至适用于共享资源或使用 HRESOURCE 来补充 pfnAllocateCb 的 HRESOURCE 用法的任何其他回调函数。 但是,此限制不适用于主数据库。 有关主要异常的详细信息,请参阅 主要异常。 由于某些应用程序可能需要同步销毁的外观,因此驱动程序必须确保在调用其 Flush (D3D10) 函数期间,针对以前销毁的任何共享资源调用 pfnDeallocateCb。 驱动程序还必须清除以前销毁的任何对象, (那些在调用其 Flush (D3D10) 函数期间不会停止管道) 的对象;驱动程序必须这样做,以确保运行时调用 Flush (D3D10) 作为官方机制来清理可能需要此类机制的少数应用程序的延迟销毁对象。 有关此机制的详细信息,请参阅 延迟销毁和刷新 (D3D10) 。 驱动程序还必须确保在驱动程序的 DestroyDevice (D3D10) 函数在清理期间返回之前完全销毁延迟销毁的任何对象。

你可能感兴趣的:(windows图形显示驱动开发,驱动开发,java,开发语言)