当前位置: 首页 > ds >正文

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_COMBINEDWrite-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. 总结

  1. DxgkDdiCreateAllocation 是驱动程序影响内存分配的关键点,通过 DXGK_ALLOCATIONINFO 提供段信息。
  2. VidMM 综合考虑驱动偏好、内存压力、分页策略 来决定最终分配位置。
  3. 驱动程序必须适应不同段(如显存不足时回退到系统内存)。
  4. 典型段类型:显存(高性能)、系统内存(CPU 访问)、光圈段(DMA 缓冲区)、Write-Combined(优化 CPU 写)。

通过合理配置 SupportedSegments 和 PreferredSegment,驱动程序可以优化 GPU 资源的内存分配,平衡性能和兼容性。

http://www.xdnf.cn/news/5961.html

相关文章:

  • 块设备代码分析
  • 测试集群的功能-执行wordcount程序
  • uniapp|实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,拍照保存至相册,多端兼容(APP/微信小程序)
  • 什么情况会导致JVM退出?
  • 【机器学习赋能的智能光子学器件系统研究与应用】
  • 界面组件DevExpress WPF中文教程:Grid - 如何自定义Band Header外观?
  • 《内网渗透测试:绕过最新防火墙策略》
  • ZYNQ实战:可编程差分晶振Si570的配置与应用指南
  • 人工智能基础知识笔记九:模型评估的指标
  • OpenAI官方指南,详细解释了何时使用哪种AI模型
  • amd架构主机构建arm架构kkfileview
  • vue3学习——侦听器
  • 从零开始掌握FreeRTOS——目录
  • Java后端快速生成验证码
  • Python查询ES错误ApiError(406, ‘Content-Type ...is not supported
  • vr视频制作攻略(VR视频制作基础知识)
  • 漏桶算法的实际应用案例:数据库批量写入流量控制
  • 基于智能家居项目 解析DHT11温湿度传感器
  • hadoop中创建MySQL新数据库数据表
  • 数据库数据清洗、预处理与质量监控、 数据质量的核心概念
  • 《Effective Python》第1章 Pythonic 思维总结——编写优雅、高效的 Python 代码
  • 分布式任务调度XXL-Job
  • STM32 __main
  • 项目:博客系统——基于SSM框架Mybatis-plus
  • C++学习之路,从0到精通的征途:继承
  • hadoop3.x单机部署
  • 【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow
  • 工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
  • ubuntu20.04安装qtcreator并打开ros工程
  • CD3MN 双相钢 2205 材质保温 V 型球阀:恒温工况下复杂介质控制的高性能之选-耀圣