window 显示驱动开发-创建分配时指定段
显示微型端口驱动程序指定并返回有关其内存段的信息,当视频内存管理器调用驱动程序的 DxgkDdiCreateAllocation 函数时,它更喜欢视频内存管理器使用这些信息。 在调用 DxgkDdiCreateAllocation 时,驱动程序为视频资源创建分配。 驱动程序在描述分配的 DXGK_ALLOCATIONINFO 结构中返回支持的段和段首选项的标识符。
从返回的段信息中,视频内存管理器确定为给定操作分页的相应内存段。
1. 驱动程序如何指定内存段信息
当 VidMM 调用驱动程序的 DxgkDdiCreateAllocation 来创建新的 GPU 资源(如纹理、缓冲区)时:
1.1驱动程序填充 DXGK_ALLOCATIONINFO 结构:
- 该结构包含 支持的段(SupportedSegments) 和 段首选项(PreferredSegment) 的信息。
- VidMM 使用这些信息来决定资源应该分配在哪个内存段(如 本地显存、系统内存、光圈段 等)。
1.2关键字段:
- SupportedSegments:一个位掩码,表示该分配可以放在哪些段(例如,DXGK_SEGMENT_VIDEO_MEMORY | DXGK_SEGMENT_SYSTEM_MEMORY)。
- PreferredSegment:驱动程序建议的首选段(如 DXGK_SEGMENT_VIDEO_MEMORY 表示优先放在显存)。
- Flags:可选标志,如 DXGK_ALLOCATIONFLAG_CACHED(是否可缓存)、DXGK_ALLOCATIONFLAG_CONTIGUOUS(是否需要连续内存)等。
2. VidMM 如何决定使用哪个段
2.1VidMM 根据以下因素选择最终的内存段:
驱动程序的 SupportedSegments 和 PreferredSegment:
- 如果 PreferredSegment 可用(如显存足够),VidMM 会优先使用它。
- 否则,VidMM 会回退到其他支持的段(如系统内存)。
2.2内存压力(Memory Pressure):
- 如果显存不足,VidMM 可能会选择系统内存(即使 PreferredSegment 是显存)。
- 如果资源需要频繁 CPU 访问(如动态缓冲区),VidMM 可能直接选择系统内存。
2.3分页策略(Paging Policy):
- VidMM 可能会动态迁移资源(如从显存逐出到系统内存),而驱动程序无需感知。
3. 典型内存段类型
段类型 | 描述 | 适用场景 |
---|---|---|
DXGK_SEGMENT_VIDEO_MEMORY | 本地显存(GPU 专用) | 高性能渲染目标、纹理 |
DXGK_SEGMENT_SYSTEM_MEMORY | 系统内存(可分页) | CPU 频繁访问的资源(如 staging buffers) |
DXGK_SEGMENT_APERTURE | 光圈段(PCIe 映射内存) | DMA 缓冲区、共享内存 |
DXGK_SEGMENT_WRITE_COMBINED | Write-Combined 内存(优化 CPU 写) | CPU 频繁写入的资源(如动态顶点缓冲区) |
4. 驱动程序的职责
4.1正确设置 SupportedSegments 和 PreferredSegment:
- 例如,一个 渲染目标 应该优先放在 DXGK_SEGMENT_VIDEO_MEMORY,而一个 staging buffer 可能更适合 DXGK_SEGMENT_SYSTEM_MEMORY。
4.2处理内存不足情况:
- 如果 VidMM 无法满足首选段(如显存不足),驱动程序必须能适应其他段(如回退到系统内存)。
4.3支持分页操作:
- 如果资源被逐出(evicted),驱动程序可能需要处理 数据迁移(如 DxgkDdiBuildPagingBuffer 生成 GPU 命令来移动数据)。
5. 示例场景
场景 1:创建纹理
驱动程序行为:
- 设置 SupportedSegments = DXGK_SEGMENT_VIDEO_MEMORY | DXGK_SEGMENT_SYSTEM_MEMORY。
- 设置 PreferredSegment = DXGK_SEGMENT_VIDEO_MEMORY(优先放显存)。
VidMM 决策:
- 如果显存足够 → 分配在显存。
- 如果显存不足 → 分配在系统内存(可能稍后分页回显存)。
场景 2:创建 CPU 可写缓冲区
驱动程序行为:
- 设置 SupportedSegments = DXGK_SEGMENT_SYSTEM_MEMORY | DXGK_SEGMENT_WRITE_COMBINED。
- 设置 PreferredSegment = DXGK_SEGMENT_WRITE_COMBINED(优化 CPU 写入性能)。
VidMM 决策:优先分配 WRITE_COMBINED 内存,如果不可用则回退到普通系统内存。
6. 总结
- DxgkDdiCreateAllocation 是驱动程序影响内存分配的关键点,通过 DXGK_ALLOCATIONINFO 提供段信息。
- VidMM 综合考虑驱动偏好、内存压力、分页策略 来决定最终分配位置。
- 驱动程序必须适应不同段(如显存不足时回退到系统内存)。
- 典型段类型:显存(高性能)、系统内存(CPU 访问)、光圈段(DMA 缓冲区)、Write-Combined(优化 CPU 写)。
通过合理配置 SupportedSegments 和 PreferredSegment,驱动程序可以优化 GPU 资源的内存分配,平衡性能和兼容性。