Direct3D 版本 10 运行时和驱动程序句柄

Direct3D 版本 10 运行时和驱动程序句柄共享相同的生命周期。 Direct3D 运行时指定对象在调用 create-type 函数(例如 CreateResource ( (D3D10 ) ) )和调用 destroy-type 函数 ((例如 DestroyResource (D3D10) ) )之间对象的生存期。 运行时提供驱动程序句柄值以及运行时句柄值。 这些句柄本质上是用强类型包装的指针,用于标识正在操作的对象。 下面是资源的运行时和驱动程序句柄的示例:

// Strongly typed handle to identify a resource object to the driver: 
typedef struct D3D10DDI_HRESOURCE
{
    void* pDrvPrivate; // Pointer to memory location as large as the driver requested.
} D3D10DDI_HRESOURCE;

// Strongly typed handle to identify a resource object to the runtime:
typedef struct D3D10DDI_HRTRESOURCE
{
    void* handle;
} D3D10DDI_HRTRESOURCE;

呈现设备对象及其子对象的所有驱动程序句柄都采用以下双传递创建机制:

  1. 为了确定驱动程序句柄指针的值,运行时首先调用 CalcPrivateObjTypeSize 函数 (例如 CalcPrivateResourceSize 函数) 。 在此调用中,运行时传入创建参数 (例如,指向 D3D10DDIARG_CREATERESOURCE 结构的指针) 。 运行时还会在调用 CreateObjType 函数时传入创建参数。

    在调用 CalcPrivateObjTypeSize 期间,通常不需要用户模式显示驱动程序来分配任何内容。 但是,如果驱动程序确实失败或必须指示任何其他类型的故障条件,则驱动程序可以返回SIZE_T ( -1 ) 以防止创建句柄。 然后,运行时会向调用应用程序返回E_OUTOFMEMORY错误条件。

    驱动程序应至少从调用 CalcPrivateObjType Size 返回 size ( void*)

  2. 如果运行时可以分配足够的空间来满足用户模式显示驱动程序所需的大小,则运行时将调用 CreateObjType 函数 (例如 CreateResource (D3D10) ) ,以及驱动程序句柄的新唯一值。 驱动程序句柄的指针值在句柄的生命周期内是唯一且恒定的,因为它指向 CalcPrivateObjTypeSize 返回的内存区域。 用户模式显示驱动程序可以根据需要使用此内存区域。 驱动程序应通过将任何经常访问的数据定位到运行时提供的内存区域中来提高效率。