支持 GDI 硬件加速的显示微型端口驱动程序应在处理以下分配调用时设置系统或视频内存分配的大小和音调。
DxgkDdiCreateAllocation
当驱动程序处理对 DxgkDdiCreateAllocation 的调用时,它应设置系统或视频内存分配的大小(以字节为单位)。 分配的大小是通过 pCreateAllocation-> pAllocationInfo-Size> 成员设置的。 如果分配对 CPU 可见,则大小应包括间距值,即图面的宽度(包括填充)(以字节为单位)。
如果 pGetStandardAllocationDriverData pCreateGdiSurfaceData-Type>>- 成员设置为D3DKMDT_GDISURFACE_STAGING_CPUVISIBLE或D3DKMDT_GDISURFACE_EXISTINGSYSMEM,则分配对 CPU 可见。 有关这些图面类型的属性,请参阅D3DKMDT_GDISURFACETYPE中的说明。
DxgkDdiGetStandardAllocationDriverData
当驱动程序处理对 DxgkDdiGetStandardAllocationDriverData 的调用,以获取对 CPU 可见的分配时,它应:
将 pGetStandardAllocationDriverData->StandardAllocationType 成员设置为D3DKMDT_STANDARDALLOCATION_GDISURFACE。
通过 pGetStandardAllocationDriverData pCreateGdiSurfaceData-> 成员指向的D3DKMDT_GDISURFACEDATA结构,设置 GDI 硬件加速和桌面 Windows 管理器(DWM)可用于重定向的图面的说明。 例如,通过 D3DKMDT_GDISURFACEDATA的“间距 ”成员设置分配的间距。
1. 核心目标
- 确保驱动程序正确处理 系统内存和显存分配,以支持 GDI 硬件加速 和 DWM(桌面窗口管理器)合成。
- 管理 CPU 可见的内存分配,使其能被 GDI/DWM 直接访问,并优化内存布局(如音调/Pitch 计算)。
2. 关键函数及实现要求
(1) DxgkDdiCreateAllocation(分配内存)
- 作用:创建 GPU 或 CPU 可见的内存分配。
- 关键设置:分配大小:通过 pCreateAllocation->pAllocationInfo->Size 设置(单位:字节)。
- CPU 可见性:如果分配需要 CPU 访问,必须包含 音调(Pitch) 值(即每行字节数,含填充)。
- 判定条件(CPU 可见):
pGetStandardAllocationDriverData->pCreateGdiSurfaceData->Type == D3DKMDT_GDISURFACE_STAGING_CPUVISIBLE // 暂存表面(CPU 可写) || pGetStandardAllocationDriverData->pCreateGdiSurfaceData->Type == D3DKMDT_GDISURFACE_EXISTINGSYSMEM // 现有系统内存(CPU 可访问)
计算方式:
Size = SurfaceHeight * Pitch; // 总大小 = 高度 × 每行字节数(含填充)
(2) DxgkDdiGetStandardAllocationDriverData(获取标准分配数据)
- 作用:配置 GDI/DWM 可用的图面属性(如音调、像素格式等)。
- 关键设置:
标准分配类型:
pGetStandardAllocationDriverData->StandardAllocationType =
D3DKMDT_STANDARDALLOCATION_GDISURFACE;
GDI 表面数据(D3DKMDT_GDISURFACEDATA):
Pitch:设置每行字节数(含填充),影响内存对齐和访问效率。
其他可能字段:
- 像素格式(如 DXGI_FORMAT_B8G8R8A8_UNORM)
- 尺寸(Width/Height)
- 旋转支持(如 D3DKMDT_WSR_IDENTITY 表示无旋转)
3. 关键概念
术语 | 说明 |
---|---|
CPU 可见内存 | 可被 CPU 直接读写,通常用于 GDI 渲染或 DWM 合成。 |
音调(Pitch) | 每行像素占用的字节数(含填充),用于内存对齐优化。 |
GDI 表面类型 | D3DKMDT_GDISURFACE_STAGING_CPUVISIBLE (暂存)、D3DKMDT_GDISURFACE_EXISTINGSYSMEM (系统内存)。 |
DWM 兼容性 | 确保分配的内存能被 DWM 用于窗口合成(如 Aero |
4. 实现示例(伪代码)
// 在 DxgkDdiCreateAllocation 中处理 CPU 可见分配
if (IsCpuVisible(pCreateAllocation)) {
UINT pitch = CalculatePitch(surfaceWidth, pixelFormat);
pAllocInfo->Size = surfaceHeight * pitch; // 包含音调的总大小
}
// 在 DxgkDdiGetStandardAllocationDriverData 中配置 GDI 表面
if (requestType == GDI_SURFACE) {
pSurfaceData->Pitch = CalculateOptimalPitch(width, format);
pSurfaceData->Format = DXGI_FORMAT_B8G8R8A8_UNORM; // 示例:32 位 ARGB
pSurfaceData->Rotation = D3DKMDT_WSR_IDENTITY; // 无旋转
}
5. 总结
核心任务:正确设置 内存大小 和 音调,确保 GDI/DWM 能高效访问。
关键点:
- CPU 可见分配必须包含音调计算。
- DxgkDdiGetStandardAllocationDriverData 负责提供 GDI 兼容的表面属性。
影响:错误的音调或大小设置可能导致渲染错误、性能下降或 DWM 合成失败。
适用于 WDDM 显示驱动程序开发,特别是在 混合渲染(GDI + D3D) 场景下。