DXGKDDI_CREATEALLOCATION callback function
该DDI创建了系统内存或视频内存资源。
Syntax
DXGKDDI_CREATEALLOCATION DxgkddiCreateallocation;
NTSTATUS DxgkddiCreateallocation(
IN_CONST_HANDLE hAdapter,
INOUT_PDXGKARG_CREATEALLOCATION pCreateAllocation
)
{...}
Parameters
hAdapter
[in] 关联着显卡的context的句柄。KMD之前DxgkDdiAddDevice函数中通过MiniportDeviceContext参数传给了DXGK。
pCreateAllocation
[in/out] 指向包含创建资源的信息的 DXGKARG_CREATEALLOCATION 结构的指针。
Return Value
DxgkDdiCreateAllocation returns one of the following values:
Return code | Description |
---|---|
STATUS_SUCCESS | DxgkDdiCreateAllocation successfully created the allocation. |
STATUS_INVALID_PARAMETER | Parameters that were passed to DxgkDdiCreateAllocation contained errors that prevented it from completing. |
STATUS_NO_MEMORY | DxgkDdiCreateAllocation could not allocate memory that was required for it to complete. |
STATUS_GRAPHICS_DRIVER_MISMATCH | The display miniport driver is not compatible with the user-mode display driver that initiated the call to DxgkDdiCreateAllocation. |
Remarks
在UMD调用pfnAllocateCb之后,DXGK调用KMD的 DxgkDdiCreateAllocation 函数来创建allocation。KMD必须解释由UMD传下来的私有数据(该数据保存在每个allocation的DXGK_ALLOCATIONINFO结构的pPrivateDriverData成员中),并确定通过VMM创建每个allocation所需要的参数列表。更多关于KMD如何提供这些参数给VMM,参见Specifying Segments When Creating Allocations.
KMD必须返回一个allocation句柄,通常这个指针会指向驱动的私有数据结构,其中包含了allocation的信息。KMD会在任何调用DxgkCbGetHandleData获得handle相关的私有数据。因此KMD不需要维护一个私有的allocation句柄表。事实上,我们强烈不建议使用私有句柄表,因为这会显得易用性低,并且容易造成在显示mode切换时与DXGK中状态不一致,例如用户快速的切换mode,热插拔等等。
UMD为每个resource或device指定一个allocation。KMD能够检查是否Resource位被设置确定一个allocation是否属于一个resource,该位属于DXGKARG_CREATEALLOCATION类型pCreateAllocation的Flags成员。如果allocation属于一个resource,KMD能返回一个资源句柄(不是必须的),通常其中包含一个指向描述该资源的驱动私有数据。如果DXGK调用DxgkDdiCreateAllocation为一个已经存在的资源创建allocation,DXGKARG_CREATEALLOCATION的hResource成员会包含之前调用DxgkDdiCreateAllocation 时所返回的那个资源的allocation。如果有需要,KMD能够在两次调用DxgkDdiCreateAllocation之间改变资源句柄。
如果UMD在一个Command buffer中使用了一个resource句柄,KMD能够通过调用DxgkCbGetHandleData来获得相关的私有数据。KMD也能通过调用DxgkCbEnumHandleChildren够枚举所有的资源的子allocation。
从Win7开始,在为了GDI硬件加速时调用KMD的DxgkDdiCreateAllocation时,驱动应该设置allocation的大小pCreateAllocation->pAllocationInfo->Size(包括CPU可见allocation的pitch值)。
在DxgkDdiCreateAllocation中创建得资源属于整个显卡而不是其中得device。KMD不应该在私有allocation或resource数据中引用device数据,因为UMD可能会在device数据销毁之后使用resource。
DxgkDdiCreateAllocation should be made pageable.
Allocating history buffers
从Win8.1开始,当DxgkDdiCreateAllocation被调用时,KMD能够设置DXGK_ALLOCATIONINFOFLAGS.HistoryBuffer来标识UMD能够管理创建和销毁的history buffer。
Requirements
Minimum supported client | Available in Windows Vista and later versions of the Windows operating systems. |
Target Platform | Desktop |
Header | d3dkmddi.h |
IRQL | PASSIVE_LEVEL |