- 博客(743)
- 收藏
- 关注
原创 window 显示驱动开发-GPU 抢占(一)
Windows 8(WDDM1.2)对GPU抢占模型进行了重要更新,核心改进包括操作系统强制启用抢占、保证在TDR(超时检测和恢复)前发送抢占请求,以及优先调度高优先级任务(如DWM渲染)。这些变化旨在减少窗口切换和动画中的卡顿,并防止TDR频繁触发导致的系统崩溃。尽管WDDM1.2要求驱动程序支持新模型,但仍允许通过注册表设置回退到Windows 7(WDDM1.1)的行为。驱动程序必须无条件响应抢占请求,并确保在2秒内完成,否则将触发TDR。此外,驱动程序需优化任务分块和GPU状态保存,以提升系统响应速
2025-05-25 00:15:00
206
原创 window 显示驱动开发-GPU 抢占(二)
在Windows 8中,GPU抢占模型的实现依赖于KMD(内核模式驱动程序)通过一系列DDI(设备驱动程序接口)来管理GPU资源。关键步骤包括:编译支持WDDM1.2抢占模型的驱动程序,声明对Windows 8 GPU抢占模型的支持,设置抢占粒度级别,支持延迟上下文切换,管理GPU上下文分配,以及在分页缓冲区中初始化上下文资源。通过这些步骤,驱动程序能够有效地管理GPU资源,确保在抢占发生时能够平滑地切换上下文,避免撕裂和呈现伪影,从而提升系统的整体性能和稳定性。
2025-05-25 00:15:00
205
原创 window 显示驱动开发-视频内存供应和回收(二)
从Windows 8开始,用户模式驱动程序引入了新的函数来提供或回收内存分配,以动态管理GPU内存,特别是在共享系统内存的集成显卡上。这些函数包括pfnOfferAllocationsCb和pfnReclaimAllocationsCb,驱动程序调用这些函数来提供或回收内存。对于支持Microsoft Direct3D 10和Direct3D 9硬件的驱动程序,分别需要实现pfnOfferResources、pfnReclaimResources和OfferResources、ReclaimResource
2025-05-24 00:15:00
475
原创 window 显示驱动开发-视频内存供应和回收(三)
WHCK(Windows Hardware Compatibility Kit)对图形设备的Offer/Reclaim功能提出了严格的认证要求,确保驱动程序在内存管理、数据一致性和多线程安全等方面符合标准。测试核心包括验证驱动程序正确实现OfferResources和ReclaimResources接口,确保GPU内存释放、数据一致性、优先级处理和多线程安全性。驱动程序需支持应用显式请求、系统内存压力和后台应用场景下的Offer/Reclaim操作。认证关键检查点包括资源释放、Reclaim状态处理、优先级
2025-05-24 00:15:00
492
原创 window 显示驱动开发-指定 GDI 硬件加速渲染操作
在调用DxgkDdiRenderKm函数时,操作系统通过pRenderKmArgs参数指定GDI硬件加速呈现操作的类型。DirectX图形内核子系统的显示端口驱动程序(Dxgkrnl.sys)将pRenderKmArgs-pCommand指向包含DXGK_RENDERKM_COMMAND结构数组的命令缓冲区,并设置pRenderKmArgs-pCommandLength为缓冲区大小。驱动程序需将DXGK_RENDERKM_COMMAND命令缓冲区转换为DMA缓冲区命令,并生成修补程序位置列表。DXGK_RE
2025-05-23 00:15:00
976
原创 window 显示驱动开发-视频内存供应和回收(一)
Windows显示驱动程序模型(WDDM)1.2及更高版本引入了内存套餐和回收功能,旨在优化系统内存使用,特别是在移动设备中。这些功能通过动态回收临时表面的内存,减少显示驱动程序的内存占用,从而在多应用高负载情况下避免内存耗尽导致的性能下降。驱动程序必须实现特定的接口和数据结构,以支持内存的Offer(标记为可回收)和Reclaim(尝试收回)操作。此外,驱动程序还需处理优先级和回收策略,确保在资源回收失败时能优雅重建。这些功能对于通过WHQL认证至关重要,并显著提升了集成GPU在多任务环境下的性能。
2025-05-23 00:15:00
784
1
原创 window 显示驱动开发-支持内核模式命令缓冲区
在Windows显示驱动模型中,显示微型端口驱动程序需通过DxgkDdiRenderKm函数处理并提交命令缓冲区。该函数的核心任务包括解析来自内核模式的命令缓冲区、生成GPU可执行的DMA缓冲区,并使用MultipassOffset成员跟踪处理进度。MultipassOffset的高16位记录已处理的命令缓冲区偏移量,低16位用于内部状态跟踪,支持多阶段处理。驱动程序需处理错误状态码,如STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER,并优化硬件加速性能,如批处理命令和异步提交
2025-05-22 01:11:36
714
原创 window 显示驱动开发-报告渲染操作的可选支持
从Windows 7开始,显示微型端口驱动程序通过DXGK_PRESENTATIONCAPS结构声明其支持的呈现功能,直接影响DirectX图形子系统的优化。该结构允许驱动程序明确支持的技术(如翻转模型、DirectFlip、MPO)和硬件限制(如最大平面数),并影响DWM的合成策略、Direct3D的呈现模式选择及GDI硬件加速的兼容性。关键成员包括支持内核模式命令缓冲区、软件模拟设备、最大平面数、垂直同步翻转等。正确配置可启用现代合成技术,但需注意性能权衡和版本适配。该结构适用于WDDMv1.2+驱动程
2025-05-22 01:11:21
640
原创 window 显示驱动开发-初始化和 DMA 缓冲区创建
为了确保GPU支持GDI硬件加速,显示微型端口驱动程序的DriverEntry函数必须通过填充DRIVER_INITIALIZATION_DATA结构的DxgkDdiRenderKm成员来声明支持。DxgkDdiRenderKm函数由DirectX图形内核子系统调用,用于将操作系统提供的命令缓冲区转换为GPU可执行的DMA缓冲区。此外,在创建上下文和设备时,驱动程序需处理GdiContext和GdiDevice标志,以配置GDI兼容的资源和设备特性。正确实现这些功能可以显著提升GDI/DWM渲染效率,而错误
2025-05-21 07:59:07
1044
原创 window 显示驱动开发-设置内存分配的大小和间距
支持GDI硬件加速的显示微型端口驱动程序在处理内存分配时,需确保正确设置系统或视频内存的大小和音调(Pitch),以支持GDI和桌面窗口管理器(DWM)的高效访问。关键函数包括DxgkDdiCreateAllocation和DxgkDdiGetStandardAllocationDriverData。前者用于创建GPU或CPU可见的内存分配,需根据图面宽度和像素格式计算音调,并设置总大小;后者用于配置GDI/DWM可用的图面属性,如音调、像素格式等。CPU可见的内存分配必须包含音调值,以确保内存对齐和访问效
2025-05-21 07:58:47
1132
原创 window 显示驱动开发-GDI 硬件加速
Windows 7的GDI硬件加速功能通过GPU加速图形设备接口操作,提升图形处理效率。为实现此功能,显示微型端口驱动程序需将DXGKDDI_INTERFACE_VERSION设置为至少DXGKDDI_INTERFACE_VERSION_WIN7,并配置DXGK_PRESENTATIONCAPS以支持GDI硬件加速命令缓冲区处理。驱动程序在确保GPU光圈段缓存一致且CPU访问GPU内存不显著影响性能时,应报告支持此功能。关键步骤包括在DriverEntry中声明接口版本,在DxgkDdiQueryAdapt
2025-05-20 09:53:58
827
原创 window 显示驱动开发-准备 DMA 缓冲区
显示微型端口驱动程序在GPU处理DMA缓冲区时,需及时准备下一个DMA缓冲区以防止GPU耗尽。为此,驱动程序准备和提交DMA缓冲区的时间必须少于GPU处理当前缓冲区的时间。文章详细介绍了DMA缓冲区高效准备的规范,包括实时性保障架构、关键性能指标、环形缓冲区实现、延迟优化技术、错误恢复机制、性能分析工具和多引擎协同。通过无锁提交算法、预编译命令模板、零拷贝提交路径等技术,确保DMA缓冲区的高效准备和提交。同时,文章还提供了错误处理机制和性能分析工具,以应对缓冲区耗尽等异常情况,并通过WHQL DMA压力测试
2025-05-20 09:53:27
425
原创 window 显示驱动开发-请求重命名分配
动态缓冲区:启用重命名(Discard)并设置合理列表长度静态资源:禁用重命名以节省内存内存敏感场景:监控!dxgkd_ext.vidmm输出调整策略多线程优化:结合NO_OVERWRITE锁模式实现高效流式传输。
2025-05-19 00:15:00
512
原创 window 显示驱动开发-修补 DMA 缓冲区
最小化修补点:合并资源绑定操作预计算偏移量:UMD应在生成命令时记录精确修补位置处理多引擎:为3D/计算/拷贝引擎维护独立修补逻辑监控修补开销:通过!dxgkd_ext.patchstats分析性能瓶颈。
2025-05-19 00:15:00
307
原创 window 显示驱动开发-提交命令缓冲区
该流程体现了WDDM如何平衡安全隔离(用户/内核模式分离)、资源虚拟化和硬件加速,是现代Windows图形栈的核心支柱。(2) 内核验证与DMA生成(KMD)(1) DMA缓冲区头部格式(示例)(1) 用户模式触发点(UMD)(4) GPU 提交与完成处理。(3) 分页与地址修补。(2) 修补位置描述符。(3) 异步提交管道。
2025-05-18 00:15:00
1865
原创 window 显示驱动开发-拆分 DMA 缓冲区
同样,如果新的补丁位置拆分部分条目引用相同的 SlotId,则以前的分配将替换为新的分配,并且不再需要以前的分配 (即,以前的分配可以分页)。但是,应在拆分的 DMA 缓冲区的各部分之间提交分页缓冲区,因为在 DMA 缓冲区的拆分部分之间需要进行分页操作。在计算拆分点的状态时,视频内存管理器将确定正在该拆分点重新编程的槽标识符 (SlotId) , (即,每个与) 的其他元素共享相同 SplitOffset 值的修补程序位置列表元素,并忽略此拆分点上的放置限制。
2025-05-18 00:15:00
458
原创 window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型
固定大小预分配 确保确定性严格空间强制 维护系统稳定性物理地址重定向 实现内存虚拟化UMD 严格遵守大小限制KMD 确保转换绝不溢出利用修补列表处理资源迁移这种设计平衡了性能、安全与灵活性,是 Windows 图形栈稳定性的基石。
2025-05-17 00:15:00
1464
原创 window 显示驱动开发-分页视频内存资源
与 Microsoft Windows 2000 显示驱动程序模型不同,Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源,然后根据需要分页进出视频内存。换句话说,并非所有视频内存资源都同时位于视频内存中。GPU 的管道中可以有多个 DMA 缓冲区。这些活动 DMA 缓冲区引用的视频内存资源必须位于视频内存中。其他空闲视频内存资源可以分页到系统内存。
2025-05-17 00:15:00
1577
原创 window 显示驱动开发-报告图形内存(四)
创建图形应用程序的软件开发人员可以使用从 Windows Vista 开始的 Microsoft DirectX 版本 10 API 在运行 Windows 显示驱动程序模型 (WDDM) 显示驱动程序的计算机上检索准确的图形内存数集。以下步骤演示如何检索图形内存编号:由于新的图形内存报告仅在运行 Windows 显示驱动程序模型 (WDDM) 显示驱动程序的计算机上可用,因此应用程序必须首先调用以下函数以确认驱动程序模型。
2025-05-16 00:15:00
1258
原创 window 显示驱动开发-命令和 DMA 缓冲区简介
命令和 DMA 缓冲区非常相似。但是,命令缓冲区由用户模式显示驱动程序使用,DMA 缓冲区由显示微型端口驱动程序使用。命令缓冲区具有以下特征:它永远不会由 GPU 直接访问。硬件供应商控制格式。它从呈现应用程序的专用地址空间中的常规可分页内存中为用户模式显示驱动程序分配。DMA 缓冲区具有以下特征:它基于命令缓冲区的已验证内容。它由显示微型端口驱动程序从内核可分页内存中分配。
2025-05-16 00:15:00
786
原创 window 显示驱动开发-报告图形内存(三)
此例展示了 WDDM 如何 虚拟化图形内存,将专用显存与系统内存统一管理。共享内存的引入使得低显存设备(如集成 GPU)能更灵活地处理图形任务。开发者需适配动态内存模型,用户需理解“总内存”并非实际性能指标。类似配置常见于轻薄本,适合日常办公和轻度图形负载,而非高性能游戏或渲染。如需进一步验证,可通过 GPU-Z 或 Windows 任务管理器(性能选项卡) 查看实时显存占用情况。
2025-05-15 00:53:15
1246
原创 window 显示驱动开发-报告图形内存(二)
WDDM 的 VidMm 提供了细粒度的图形内存管理,取代了旧模型的静态报告。WinSAT、DWM、DirectX 应用依赖实时内存数据 以优化用户体验。驱动程序必须准确报告内存信息,并支持动态调整(如显存不足时的逐出)。开发者应使用 IDXGIAdapter3 等 API 获取最新内存状态,而非依赖硬编码值。这种机制确保了 Windows 图形子系统在高负载、多任务环境下的稳定性和性能,同时为应用提供了更可靠的内存信息。
2025-05-15 00:53:03
1115
原创 window 显示驱动开发-创建分配时指定段
DxgkDdiCreateAllocation 是驱动程序影响内存分配的关键点,通过 DXGK_ALLOCATIONINFO 提供段信息。VidMM 综合考虑驱动偏好、内存压力、分页策略 来决定最终分配位置。驱动程序必须适应不同段(如显存不足时回退到系统内存)。典型段类型:显存(高性能)、系统内存(CPU 访问)、光圈段(DMA 缓冲区)、Write-Combined(优化 CPU 写)。
2025-05-14 00:15:00
1206
原创 window 显示驱动开发-报告图形内存(一)
此值是 KMD 在 DXGK_SEGMENTFLAGS 结构中指定 PopulatedFromSystemMemory 成员的所有内存段的大小之和。默认情况下,特定光圈段的提交限制是该段的大小。例如,一台具有 1 GB DIMM (1,024 MB) 的计算机,其 BIOS 保留了 1 MB 的内存,似乎有 1,023 MB 的系统内存。如果特定段的提交限制为 1 GB,但全局提交限制为 256 MB,则 VidMm 不允许 KMD 将超过 256 MB 的系统内存映射到该段。此值是视频内存总量。
2025-05-14 00:15:00
482
原创 window 显示驱动开发-将虚拟地址映射到内存段(二)
在将虚拟地址映射到段的一部分之前,视频内存管理器调用显示微型端口驱动程序的 DxgkDdiAcquireSwizzlingRange 函数,以便驱动程序可以设置用于访问可能重排的分配位的光圈。驱动程序既不能将偏移量更改为访问分配的 PCI 光圈,也不能更改分配在光圈中占用的空间量。例如,如果驱动程序无法在给定这些约束 (的情况下使分配 CPU 可访问,则硬件可能耗尽) 不显眼的光圈,则视频内存管理器会将分配逐出到系统内存,并允许应用程序访问其中的位。
2025-05-13 00:15:00
837
原创 window 显示驱动开发-指定 DMA 缓冲区的段
显示微型端口驱动程序可以指定可从中分配 DMA 缓冲区的光圈段。DMA 缓冲区也可以分配为连续锁定的系统内存。当应用程序需要 DMA 缓冲区时,视频内存管理器会分配和销毁这些缓冲区。因此,视频内存管理器需要一组可以分配 DMA 缓冲区的段。请注意,段集可能只包含一个段。当 Microsoft DirectX 图形内核子系统调用显示微型端口驱动程序的 DxgkDdiCreateDevice 函数来创建图形上下文设备时,显示微型端口驱动程序可以指定视频内存管理器可从中分配 DMA 缓冲区的段集。
2025-05-13 00:15:00
1431
原创 window 显示驱动开发-将内存空间段分割成内存库
分库是显存管理的高级特性,适用于复杂硬件或性能敏感场景。在 DXGK_SEGMENTDESCRIPTOR 中设置 USE_BANKING。通过 HintedBank 提供分配建议。适用场景:多 GPU 系统、显存碎片优化、硬件内存控制器对齐。通过合理配置分库,驱动程序可以显著提升显存利用率,满足高性能图形应用的需求。
2025-05-12 00:15:00
555
原创 window 显示驱动开发-将虚拟地址映射到内存段(一)
CpuVisible 段的核心价值:通过 PCI 光圈实现 CPU 直接访问显存,避免数据复制,提升性能。地址必须线性对齐 PCI 光圈。驱动需处理缓存一致性和多线程安全。现代 GPU 趋势:随着 PCIe 带宽提升和 Resizable BAR 技术普及,CpuVisible 段的适用性进一步增强。正确配置 CpuVisible 段可显著优化 CPU-GPU 数据交互,是高性能图形开发的关键技术之一。
2025-05-12 00:15:00
839
原创 window 显示驱动开发-线性伸缩空间段
线性光圈空间段 = 虚拟地址 + 动态物理页绑定,适用于需灵活内存管理的场景。处理 DXGK_OPERATION_MAP_APERTURE_SEGMENT/UNMAP 操作。维护 GPU 页表,确保地址转换正确。支持 CPU 高效读写。实现按需分页和资源共享。通过合理使用光圈段,驱动程序可以在保证功能性的同时,优化复杂应用场景下的内存利用率。
2025-05-11 00:15:00
1919
原创 window 显示驱动开发-AGP 类型伸缩空间段
但是,内核模式显示微型端口驱动程序(KMD)不会通过 AGP 类型的光圈空间段公开 dxgkDdiBuildPagingBuffer 回调函数的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMENT操作类型。非一致性内存架构(NUMA):物理内存分散在多个位置(如部分在显存、部分在系统内存)。优先使用线性光圈段:除非硬件明确要求,否则应选择线性光圈段(更灵活、性能更高)。(2) 物理页映射(由 GART 驱动完成)
2025-05-11 00:15:00
1058
原创 window 显示驱动开发-配置内存段类型
内存空间段:直接管理物理内存(显存/系统内存),适合高性能需求。光圈空间段:虚拟地址映射,灵活支持动态资源和 CPU 访问。KMD 配置规则:必须根据硬件能力选择段类型。显存段优先用于 GPU 高频访问资源。通过合理配置段类型,驱动程序可以平衡性能与灵活性,满足复杂图形应用的需求。
2025-05-10 00:15:00
1495
原创 window 显示驱动开发-线性内存空间段
线性内存空间段是显存管理的核心机制,提供高效、连续的 GPU 直接访问。通过 Flags 控制 CPU 可见性和 Banking。确保 BaseAddress 和 Size 符合硬件规范。渲染目标、纹理等高性能需求资源。需 CPU-GPU 共享的动态数据(如流式顶点缓冲区)。正确配置线性段可最大化 GPU 显存利用率,是 WDDM 驱动开发的基础环节。
2025-05-10 00:15:00
889
原创 window 显示驱动开发-处理内存段(一)
硬件无关性:VidMm 通过抽象段统一管理不同 GPU 的内存。多进程安全:段隔离避免应用程序相互干扰。灵活扩展:支持未来内存技术(如 CXL 共享内存)。通过内存段机制,WDDM 实现了高效的 GPU 内存虚拟化和资源共享,为复杂图形与计算负载奠定基础。
2025-05-09 00:15:00
1110
原创 window 显示驱动开发-处理内存段(二)
KMD 选择性暴露段:仅需管理多进程竞争的动态资源(如纹理),静态资源(如微代码)可保留在非段区域。VidMm 的职责:在已注册的段内实现公平分配、虚拟化和隔离。
2025-05-09 00:15:00
1582
原创 window 显示驱动开发-视频内存管理和 GPU 计划
VidMm 是 WDDM 的内存管理核心,统一管理 GPU 显存和系统内存。驱动开发者需通过标准接口交互(如 DXGKDDI 回调),避免直接操作硬件。系统文件(dxgkrnl.sys 等)不可修改,必须依赖 OS 原生版本。通过 VidMm 的协调,Windows 实现了高效的 GPU 内存虚拟化、多进程共享和错误恢复,为复杂图形应用(如游戏、AI 计算)提供了稳定基础。
2025-05-08 00:17:10
1041
原创 window 显示驱动开发-用户模式显示驱动程序的线程模型
用户模式显示驱动程序不会同时加载到多个进程中,用户模式显示驱动程序 DLL 单独加载到每个进程的地址空间中。不过,多个线程可以同时在用户模式显示驱动程序中运行。但是,在用户模式显示驱动程序中运行的每个线程都必须访问不同的显示设备,该设备是通过调用用户模式显示驱动程序的 CreateDevice 函数创建的。注意 使用同一显示设备的两个或多个线程永远无法在用户模式显示驱动程序中同时运行。
2025-05-08 00:17:01
1111
1
原创 window 显示驱动开发-线程和同步级别一级(二)
每个子设备同步子 I/O 类函数 (也就是说,允许) 同时调用多个子设备。WDDM 不允许以可重入的方式调用某个子 I/O 类函数。也就是说,在给定的时间,每个子设备最多可以在以下函数之一内运行一个线程。WDDM 不允许以可重入的方式调用其中一个显示类函数。功能:管理内存的 Swizzling Range(一种优化内存访问的机制,常见于纹理或图形数据布局)。功能:管理子设备的 I/O 操作(如多显示器环境下的单个显示设备)。规则:同一时间只能有一个线程执行覆盖类的任一函数。
2025-05-07 00:15:00
521
原创 window 显示驱动开发-线程和同步级别为零级
特性零级(Level 0)一级(Level 1)二级(Level 2)三级(Level 3)可重入性✅ 允许(跨进程)❌ 类内禁止❌ 单线程❌ 单线程默认级别✅ 是❌ 否❌ 否❌ 否IRQL 限制大多数任意 IRQL通常硬件空闲时硬件空闲时同步要求驱动自行管理类内互斥WDDM 保证单线程WDDM 保证单线程零级同步适用于大多数常规操作,但驱动程序必须自行处理线程安全!
2025-05-07 00:15:00
796
原创 window 显示驱动开发-线程同步和 TDR
下图显示了 Windows 显示驱动程序模型 (WDDM) 中显示微型端口驱动程序的线程同步的工作原理如果发生硬件超时,则会启动 超时检测和恢复 (TDR) 进程。GPU 计划程序调用驱动程序的 DxgkDdiResetFromTimeout 函数,这将重置 GPU。
2025-05-06 15:37:41
1089
原创 window 显示驱动开发-线程和同步级别一级(一)
在级别 1 线程和同步中,WDDM 不允许在特定函数类中重新进入。也就是说,只有一个线程可以进入特定类中的驱动程序。但是,可以同时输入来自多个一级类和 零级 调用的调用。尽管来自不同第一级类的两个或多个线程和 来自零级 调用的线程可以同时在驱动程序中运行,但不能有两个线程属于单个进程。WDDM 将线程处理级别 1 下对显示微型端口驱动程序的调用分类为非实体类,例如以下类。其他类包括 VidMm、虚拟机和 vGPU。
2025-05-06 00:15:00
626
A*算法解决八数码问题
2025-03-26
windows USB 驱动,用于PL2303芯片上报GPS信息使用
2024-12-22
pl2303-linux.zip
2024-12-19
基于win 10的 NDIS 6.0 Filter 驱动,新增加了收发数据包以及查询网卡Mac地址的代码
2024-10-27
基于NDIS 6.x的Filter生成代码
2024-10-12
LUA脚本工具在windows平台下编译的版本
2024-10-02
基于windows 的日志串口驱动案例
2024-10-01
基于UMDF 2.15版本的VirtualSerial(虚拟串口)驱动程序代码
2024-09-22
UnderConstructionSolution.zip
2024-08-18
ASimpleClassSolution: windows C++ team code
2024-08-18
微软提供的关于鼠标驱动的案例
2024-01-01
基于ADNS-2620的光学鼠标方案
2023-12-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人