请求和使用图面内存

当 Microsoft Direct3D 运行时需要创建图面列表时,用户模式显示驱动程序接收对其 CreateResource 函数的调用。 Direct3D 运行时指定用户模式显示驱动程序用于回调运行时的图面列表的资源句柄。 用户模式显示驱动程序创建一个资源对象来表示图面列表,生成此对象的唯一句柄,并将该句柄返回给 Direct3D 运行时。 运行时在后续驱动程序调用中使用此唯一句柄来标识图面列表。 运行时通过在 D3DDDIARG_CREATERESOURCE 结构的 pSurfList 成员中包含的数组中指定图面的索引来标识特定 面。

由于用户模式显示驱动程序在引用资源的调用中接收驱动程序定义的资源句柄,因此驱动程序不需要执行成本高昂的句柄查找来查找驱动程序定义的资源对象。 同样,为了不要求运行时执行句柄查找,当用户模式显示驱动程序调用回运行时时,用户模式显示驱动程序将使用 Direct3D 运行时定义的资源句柄。

用户模式显示驱动程序调用 pfnAllocateCb 函数为图面分配内存。 在 pfnAllocateCb 调用中,用户模式显示驱动程序可以分别为D3DDDICB_ALLOCATED3DDDI_ALLOCATIONINFO结构的 pPrivateDriverData 成员的图面列表和每个图面传递专用数据。 但是,用户模式显示驱动程序无法从 pPrivateDriverData 成员接收私有数据。 用户模式显示驱动程序可以为此专用数据分配内存,并且可以在 pfnAllocateCb 调用返回后释放内存,也可以使用堆栈内存传递此专用数据。 pfnAllocateCb 函数向用户模式显示驱动程序返回每个分配图面的每个分配的句柄。

注意 用户模式显示驱动程序必须为每个设备的每个共享图面调用 一次 pfnAllocateCb 函数。 例如,如果设备 1 创建的共享图面也由设备 2、3 和 4 使用,则设备 2、3 和 4 还必须为共享图面调用 一次 pfnAllocateCb ,以便检索分配句柄。

用户模式显示驱动程序必须跟踪每个图面到每个分配句柄,通常通过维护图面到分配句柄表。 用户模式显示驱动程序应将每个分配句柄存储在驱动程序定义的资源对象中。

例如,当 Direct3D 运行时对以前分配的图面 (执行操作时,在调用用户模式显示驱动程序的 Blt 函数) 时,用户模式显示驱动程序接收资源的句柄,可能具有图面索引。 用户模式显示驱动程序使用此资源句柄来检索驱动程序定义的资源对象。 驱动程序获取资源对象中存储的分配句柄,并将其组合在命令缓冲区中。 在调用 pfnRenderCb 函数时,用户模式显示驱动程序使用与图面对应的分配句柄将命令缓冲区提交到显示微型端口驱动程序。 显示微型端口驱动程序可以调用 DxgkCbGetHandleData 函数,以确定用户模式显示驱动程序引用的图面分配。