window 顯示驅動開發-分頁視頻內存資源

與 Microsoft Windows 2000 顯示驅動程序模型不同,Windows Vista 顯示驅動程序模型允許創建比可用物理視頻內存總量更多的視頻內存資源,然后根據需要分頁進出視頻內存。 換句話說,并非所有視頻內存資源都同時位于視頻內存中。

GPU 的管道中可以有多個 DMA 緩沖區。 這些活動 DMA 緩沖區引用的視頻內存資源必須位于視頻內存中。 其他空閑視頻內存資源可以分頁到系統內存。

在 GPU 計劃程序調用顯示微型端口驅動程序的 DxgkDdiSubmitCommand 函數以將 DMA 緩沖區提交到 GPU 之前,計劃程序必須確保 DMA 緩沖區使用的所有視頻內存資源實際上都在視頻內存中。 如果某些資源不在視頻內存中,則必須從系統內存中分頁。 GPU 計劃程序必須調用視頻內存管理器來查找視頻內存中的空間,以便將必要的視頻內存資源數據從系統內存傳輸到視頻內存。 當視頻內存需求較高時,GPU 計劃程序必須調用視頻內存管理器,以將空閑視頻內存資源數據傳輸到系統內存,以便為所需的視頻內存資源數據騰出空間。 包含用于在視頻和系統內存之間傳輸數據的命令的特殊用途 DMA 緩沖區稱為分頁緩沖區。 視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiBuildPagingBuffer 函數來創建分頁緩沖區,驅動程序將硬件特定的數據傳輸命令寫入該緩沖區。

1. 內存虛擬化架構對比

Windows 2000 (XPDM) 模型

  1. 靜態分配:資源一旦創建即永久占用顯存
  2. 硬性限制:總資源大小 ≤ 物理顯存容量
  3. 問題:多應用競爭顯存時需頻繁切換上下文

Windows Vista+ (WDDM) 模型

  1. 虛擬化池:所有應用共享的虛擬顯存空間(物理顯存 + 系統內存)
  2. 按需分頁:僅活躍資源占用物理顯存
  3. 優勢:支持的總資源量 >> 物理顯存容量

2. 關鍵組件協作流程

(1) 分頁觸發條件
當 GPU 調度器準備提交 DMA 緩沖區時:

BOOL CheckResourceResidency(DMA_BUFFER* dmaBuffer) {foreach (Resource* res in dmaBuffer->ReferencedResources) {if (!res->IsResidentInVRAM()) {  // 檢查物理顯存駐留TriggerPaging(res);          // 觸發分頁操作return FALSE;}}return TRUE;
}

(2) 分頁緩沖區構建

(3) 分頁緩沖區示例內容

// AMD GPU 的分頁命令示例
struct PAGE_COMMAND {uint64_t srcSysMemAddr;  // 系統內存源地址uint64_t dstVramAddr;    // 顯存目標地址uint32_t size;           // 傳輸數據大小uint32_t tilingFlags;    // 塊狀排列參數
};void BuildPagingBuffer(PAGE_COMMAND* buffer, Resource* res) {buffer->srcSysMemAddr = res->sysMemBacking;buffer->dstVramAddr = VidMmAllocVram(res->size);buffer->size = res->size;buffer->tilingFlags = res->tilingMode;
}

3. 內存管理策略

(1) 駐留集管理

  • 活動集(Working Set):當前 DMA 緩沖區引用的資源必須駐留
  • LRU 策略:非活躍資源按最近使用時間排序逐出
void VidMmEvictResources(uint64_t requiredSize) {while (freeVram < requiredSize) {Resource* victim = FindLRUResource();CopyToSystemMemory(victim);  // 回寫系統內存FreeVram(victim->vramAddr);}
}

(2) 并發控制
柵欄(Fence)同步:確保分頁操作完成前 GPU 不訪問資源

void SubmitPagingBuffer(DMA_BUFFER* pagingBuf) {uint64_t fenceVal = InsertFence();QueueToGpu(pagingBuf, fenceVal);WaitForFence(fenceVal);  // 等待傳輸完成
}

4. 開發者注意事項

用戶模式驅動(UMD)

// 創建資源時應考慮分頁開銷
HRESULT CreateTexture(UINT size, bool isFrequentlyUsed) {D3DDDI_ALLOCATIONINFO info = {0};if (isFrequentlyUsed) {info.Flags.PreferContiguous = 1;  // 提示VidMm優先駐留}return pfnAllocateCb(&info);
}

內核模式驅動(KMD)

// 必須正確處理分頁失敗
NTSTATUS DxgkDdiBuildPagingBuffer(IN_PDXGKARG_BUILDPAGINGBUFFER pArgs)
{if (!CheckHwCapability(pArgs->SizeRequired)) {return STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER;}// ...生成硬件命令
}

5. 性能優化技巧

技術適用場景實現方式
預加載(Preload)關鍵幀資源加載在Present前異步提交分頁請求
批量傳輸大量小資源遷移合并多個資源到單個分頁緩沖區
壓縮分頁帶寬受限系統實現驅動級內存壓縮/解壓
智能駐留開放世界游戲地形使用D3DDDI_ALLOCATIONFLG_PERSISTENT標記

6. 調試與問題排查

常見問題癥狀

  1. GPU 掛起:分頁操作未完成導致依賴等待
  2. 幀率驟降:頻繁分頁引發帶寬瓶頸
  3. 紋理閃爍:分頁同步錯誤導致部分更新

診斷工具

# Windows Performance Analyzer (WPA)
wpaexporter.exe -d Graphics.gpuperf -o trace.csv# WinDbg 命令
!dxgkd_ext.vidmm -stats  # 顯示內存分布統計
!dxgkd_ext.resource 0xADDR  # 檢查資源狀態

演進與現狀
Windows 10+ 改進:

  1. 內存優先級:支持資源優先級分層管理
  2. 直接存儲:繞過CPU直接分頁(GPU←→NVMe)
  3. UMA優化:統一內存架構下的零拷貝分頁

開發者適配建議:

// 使用DX12內存池提示
D3D12_HEAP_PROPERTIES heapProps = {.Type = D3D12_HEAP_TYPE_DEFAULT,.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE,.MemoryPoolPreference = D3D12_MEMORY_POOL_L1  // 顯存優先
};

WDDM 的內存虛擬化機制通過精細的分頁策略和硬件加速,實現了 GPU 內存資源的彈性管理,為現代圖形應用提供了更大的資源池和更高的內存利用率,同時也對驅動開發者的內存管理能力提出了更高要求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《C 語言指針高級指南:字符、數組、函數指針的進階攻略》

目錄 一. 字符指針變量 二. 數組指針變量 三. 二維數組傳參 3.1 二維數組的本質 3.2 訪問方式與地址計算 3.3 二維數組的傳參方式 3.4 深入解析 *(*(arri)j) 與 arr[i][j] 的等價性 四. 函數指針變量 4.1 函數指針變量的創建 4.2 函數指針變量的使用 4.3 兩段"…

Unity:場景管理系統 —— SceneManagement 模塊

目錄 &#x1f3ac; 什么是 Scene&#xff08;場景&#xff09;&#xff1f; Unity 項目中的 Scene 通常負責什么&#xff1f; &#x1f30d; 一個 Scene 包含哪些元素&#xff1f; Scene 的切換與管理 &#x1f4c1; 如何創建與管理 Scenes&#xff1f; 什么是Scene Man…

內容中臺重構企業知識管理路徑

智能元數據驅動知識治理 現代企業知識管理的核心挑戰在于海量非結構化數據的有效治理。通過智能元數據分類引擎&#xff0c;系統可自動識別文檔屬性并生成多維標簽體系&#xff0c;例如將技術手冊按產品版本、功能模塊、適用場景進行動態標注。這種動態元數據框架不僅支持跨部…

Vue3:腳手架

工程環境配置 1.安裝nodejs 這里我已經安裝過了&#xff0c;只需要打開鏈接Node.js — Run JavaScript Everywhere直接下載nodejs&#xff0c;安裝直接一直下一步下一步 安裝完成之后我們來使用電腦的命令行窗口檢查一下版本 查看npm源 這里npm源的地址是淘寶的源&#xff0…

悅數圖數據庫一體機發布,讓復雜關聯計算開箱即用

在金融風控、政務治理、能源監測等關鍵領域&#xff0c;復雜數據關聯分析已成為業務決策的核心需求。然而&#xff0c;信創場景的特殊性——全棧自主可控、海量實時計算、系統高可用性——對傳統技術架構提出了近乎苛刻的要求。悅數圖數據庫一體機應運而生&#xff0c;以軟硬協…

收放卷“材料停機減速距離“計算FC(算法公式+ST源代碼+C++代碼)

PLC運動控制基礎系列之梯形速度曲線 PLC運動控制基礎系列之梯形速度曲線_三菱運動控制模塊梯形加減速-CSDN博客文章瀏覽閱讀3.2k次,點贊3次,收藏7次。本文是關于PLC運動控制的基礎教程,重點介紹了梯形速度曲線的概念、計算和應用。討論了梯形加減速在啟動和停止階段的作用,…

Centos7系統(最小化安裝)安裝zabbix7版本詳細文章、nginx源代碼配置、php源代碼、mysql-yum安裝

zabbix官網鏈接下載zabbix源代碼安裝包 選擇zabbix版本&#xff08;此文章使用zabbix7.0版本&#xff09; 安裝之前由于是最小化安裝centos7安裝一些開發環境和工具包 文章使用國內阿里源 cd /etc/yum.repos.d/;curl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -…

描述性統計圖表

一、核心圖表類型與用途 1、直方圖(Histogram) (1)定義:用連續矩形表示數據分布,橫軸為數據區間,縱軸為頻數或頻率。 (2)用途:展示數據分布形態(對稱、偏態)、識別離群值。 (3)適用場景:分析連續型變量的分布特征,如收入分布、考試成績分布。 2、箱線圖(Box P…

ThinkPad X250電池換電池芯(理論技術儲備)

參考&#xff1a;筆記本電池換電芯的經驗與心得分享 - 經典ThinkPad專區 - 專門網 換電池芯&#xff0c;需要克服以下問題&#xff1a; 1 拆電池。由于是超聲波焊接&#xff0c;拆解比較費力&#xff0c;如果暴力撬&#xff0c;有可能導致電池殼變形... 2 替換電池芯的時候如…

Java(基礎) day01 初識Java

目錄 一、運行Java程序 二、基本數據類型 1、整數類型 ?編輯2、浮點型 3、字符型 4、布爾類型 一、運行Java程序 Java是一門半編譯型、半解釋型語言。先通過javac編譯程序把xxx.java源文件進行編譯&#xff0c;編譯后生成的.class文件是由字節碼組成的平臺無關、面向JVM的文…

【美團】Java后端一面復盤|網絡+線程+MySQL+Redis+設計模式+手撕算法

&#x1f4cd; 面試公司&#xff1a;美團 &#x1f3af; 面試崗位&#xff1a;Java后端開發工程師 &#x1f4de; 面試形式&#xff1a;電話面試 &#x1f552; 面試時長&#xff1a;約 50 分鐘 &#x1f501; 面試輪次&#xff1a;第一輪技術面 ? 面試整體節奏&#xff1a; …

Go語言八股文之Mysql鎖詳解

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 非常期待和您一起在這個小…

實戰案例:采集 51job 企業招聘信息

本文將帶你從零開始&#xff0c;借助 Feapder 快速搭建一個企業級招聘信息數據管道。在“基礎概念”部分&#xff0c;我們先了解什么是數據管道和 Feapder&#xff1b;“生動比喻”用日常場景幫助你快速理解爬蟲組件&#xff1b;“技術場景”介紹本項目中如何使用代理等采集策略…

GMT之Bash語言使用

GMT的操作有自己的邏輯和“命令”&#xff0c;但GMT是可以用Bash語言控制的&#xff0c;所以常常以.sh為后綴寫GMT程序。 GMT程序運行步驟如下&#xff1a; 采用cd &#xff0c;定位到指定文件夾&#xff1b;以sh ***.sh運行GMT&#xff0c;得到結果。 另外&#xff0c;遇到…

整合Redis

整合Redis 引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><art…

Vue3——Watch偵聽器

目錄 手動指定監聽對象 偵聽ref對象 偵聽ref對象中的某個屬性 reactive寫法 watchEffect 自動偵聽 多源偵聽 一次性偵聽器 watch 是?個?于觀察和響應Vue響應式系統中數據變化的?法。它允許你指定?個數據源&#xff08;可以是 響應式引?、計算屬性、組件的屬性等&#xf…

1、數據結構與算法(Python版-啃書)-緒論

1.1 計算機問題求解 一般而言&#xff0c;人們需要的不是解決一個具體問題的程序&#xff0c;而是解決一類問題的程序。 對于求平方根這樣的簡單問題&#xff0c;人們希望的也不是專用于求某個數(例如2)的平方根的函數&#xff0c;而是能求任何數的平方根的函數。 用計算機解…

微信小程序之將輪播圖設計為組件

在components文件夾上點右鍵&#xff0c;新建component&#xff0c;命名為swiper 然后將我們之前的代碼都拷貝到對應文件中&#xff0c; 然后我們的頁面要引用這個組件&#xff0c; 在pages\index\index.json中引入&#xff1a; { "usingComponents": {"van…

【視頻】解決FFmpeg將RTSP轉RTMP流時,出現的卡死、出錯等問題

【視頻】郭老二博文之:圖像視頻匯總 1、簡述 如果不修改圖像內容,可以使用FFmpeg命令來將RTSP轉RTMP流。 SRS視頻服務器就是這么干的,它沒有使用FFmpeg接口,而是直接使用FFmpeg命令來轉流。 但是在使用中,約到了一些問題,比如轉流時卡死、轉流出錯等等,下面描述怎么解…

報銷單業務筆記

文章目錄 業務點業務點-對公對私業務點-多系統標志 特殊業務入參入參報文 出參出參報文中間的邏輯多對多關系 其他應該是整體成功還是可以部分成功這種多對多關多關系有沒有優雅的判斷方式 報銷單是個通用場景&#xff0c;有通用邏輯&#xff0c;在此基礎上進行適度定制&#x…