window顯示驅動開發—流輸出階段

流輸出 (SO) 階段可以在這些頂點到達光柵器之前將頂點流式傳輸到內存。 流輸出的運行方式類似于管道中的點擊。 即使數據繼續向下流向光柵器,也可以打開此點擊。 通過流輸出發送的數據連接到緩沖區。 這些緩沖區可以在后續傳遞上作為管道輸入進行循環。

流輸出的一個約束是,它與幾何著色器相關聯,因為它們必須一起創建, (兩者可以是“NULL”/“off”) 。 不過,流出到的特定內存緩沖區不會綁定到特定的幾何著色器和流輸出對。 僅描述要饋送給流輸出的頂點數據部分與幾何著色器相關聯。

流輸出可用于保存將重復使用的有序管道數據。 例如,一批頂點可以通過將頂點傳入管道來“皮膚化”,就好像它們是獨立的點 (只是) 訪問所有這些點,對每個頂點應用“皮膚化”操作,并將結果流式傳輸到內存。 保存的“皮膚化”頂點隨后可用作輸入。

由于通過流輸出寫入的輸出量是動態的,因此需要一種新型的 Draw ,DrawAuto 才能允許流輸出緩沖區與輸入匯編程序一起重復使用,而無需 CPU 參與來確定實際寫入的數據量。 此外,需要查詢來緩解流輸出溢出,以及檢索寫入流輸出緩沖區的數據量 (D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE和 D3D10DDI_QUERY_STREAMOUTPUTSTATS D3D10DDI_QUERY 枚舉) 。

Direct3D 運行時調用以下驅動程序函數來創建和設置流輸出:

  • CalcPrivateGeometryShaderWithStreamOutput
  • CreateGeometryShaderWithStreamOutput
  • SoSetTargets

?1. 核心功能與設計理念

流輸出 (SO) 是 Direct3D 10 引入的數據回寫機制,允許在幾何著色器 (GS) 處理后,將頂點數據直接寫入GPU緩沖區,而非僅傳遞到光柵化階段。其核心特性包括:

  • 數據持久化:將處理后的頂點保存到緩沖區,供后續渲染循環使用。
  • GPU閉環:實現完全在GPU內部的數據復用(如粒子系統更新)。
  • 動態數據量:支持可變長度輸出(需配合 DrawAuto 和查詢機制)。

類比:SO 如同在渲染管線中插入一個“T型閥門”,既可流向光柵器,也可分流到內存。

2. 流輸出與幾何著色器的關系

  1. 強耦合性:SO 必須與 GS 同時創建(兩者可同時為NULL關閉)。
  2. 分離綁定:
  • GS+SO創建時:定義哪些頂點屬性輸出到緩沖區(如僅位置+速度)。
  • 運行時綁定:實際緩沖區(D3D10DDI_HRESOURCE)通過 SoSetTargets 動態指定。

示例:創建帶SO的GS:

D3D10DDIARG_STAGE_IO_SIGNATURES soSignatures;
soSignatures.NumEntries = 2;
soSignatures.pOutputSignature = { "POSITION", "VELOCITY" }; // 輸出到緩沖區的屬性pDeviceFuncs->CreateGeometryShaderWithStreamOutput(hDevice, pGSBytecode, &soSignatures, hGS, hRTGS
);

3. 關鍵驅動函數與實現

(1) 函數列表

函數職責
CalcPrivateGeometryShaderWithStreamOutput計算GS+SO私有數據所需內存。
CreateGeometryShaderWithStreamOutput創建帶SO的GS對象,指定輸出屬性和格式。
SoSetTargets綁定SO目標緩沖區(支持多緩沖區,需匹配創建時的聲明)。

(2) SoSetTargets 實現示例

void APIENTRY SoSetTargets(D3D10DDI_HDEVICE hDevice,UINT NumBuffers,const D3D10DDI_HRESOURCE* phBuffers,  // SO緩沖區資源句柄const UINT* pOffsets                  // 各緩沖區的寫入起始偏移
) {MyDeviceContext* pCtx = (MyDeviceContext*)hDevice.pDrvPrivate;for (UINT i = 0; i < NumBuffers; ++i) {pCtx->soBuffers[i] = phBuffers[i];pCtx->soOffsets[i] = pOffsets ? pOffsets[i] : 0;// 標記SO緩沖區為臟(需GPU同步)pCtx->dirtyFlags |= SO_TARGETS_DIRTY;}
}

4. 數據流控制與高級特性

(1) 流輸出工作流程

  • GS處理頂點:輸出到SO緩沖區的屬性由創建時的簽名定義。

數據寫入緩沖區:

  • 每個頂點按聲明順序寫入綁定的緩沖區。
  • 支持多緩沖區交錯寫入(如位置和速度分開存儲)。

后續渲染循環:

  • 綁定SO緩沖區作為輸入裝配器 (IA) 的輸入(需兼容格式)。
  • 使用 DrawAuto 自動確定繪制數量。

(2) DrawAuto 機制

  • 用途:在不知道SO輸出數據量的情況下,自動繪制所有有效頂點。
  • 驅動實現:

需內部記錄SO寫入的頂點數,并在 DrawAuto 時回傳給IA。

void APIENTRY DrawAuto(D3D10DDI_HDEVICE hDevice) {MyDeviceContext* pCtx = (MyDeviceContext*)hDevice.pDrvPrivate;UINT vertexCount = pCtx->soStats.NumPrimitivesWritten * 3; // 假設三角形列表pDeviceFuncs->Draw(hDevice, vertexCount, 0);
}

(3) 溢出查詢與統計
通過查詢對象監測SO狀態:

查詢類型用途
D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE檢測SO緩沖區是否溢出(返回TRUE/FALSE)。
D3D10DDI_QUERY_STREAMOUTPUTSTATS獲取寫入的圖元/頂點數(用于調試或邏輯控制)。

示例:檢查溢出:

BOOL overflow = FALSE;
pDeviceFuncs->QueryGetData(hQuery, &overflow, sizeof(BOOL));
if (overflow) {// 處理緩沖區擴容或數據截斷
}

5. 典型應用場景

(1) GPU粒子系統

  • 初始化:創建帶SO的GS,輸出位置+速度。

更新循環:

  • 綁定SO緩沖區,用GS計算粒子運動。
  • 通過 DrawAuto 繪制更新后的粒子。
  • 渲染循環將SO緩沖區作為IA輸入,渲染粒子。

(2) 幾何變形緩存

  • 預處理:使用GS+SO將復雜變形(如曲面細分)結果存入緩沖區。
  • 復用數據:后續幀直接讀取緩存,跳過重復計算。

6. 性能優化與注意事項

(1) 優化建議

  • 緩沖區復用:使用雙緩沖或環形緩沖避免GPU停滯。
  • 對齊寫入:確保SO輸出格式符合硬件要求(如4字節對齊)。
  • 查詢最小化:僅在必要時檢查 STREAMOVERFLOWPREDICATE。

(2) 限制與兼容性

限制解決方案
SO緩沖區必須綁定為無序訪問視圖 (UAV)創建資源時指定?D3D10_DDI_BIND_STREAM_OUTPUT
輸出數據量不可預測預分配足夠大的緩沖區,或動態調整。
僅支持頂點數據(非結構化)需通過GS組織輸出結構。

7. 驅動調試與驗證

  • 驗證SO簽名匹配:確保 CreateGeometryShaderWithStreamOutput 聲明的輸出格式與 SoSetTargets 綁定的緩沖區兼容。
  • 檢查溢出查詢:在復雜場景中強制觸發溢出,驗證驅動正確處理。
  • 性能分析:使用GPU Profiler(如PIX)監測SO帶寬占用。

總結

流輸出 (SO) 是 Direct3D 10 實現 GPU數據閉環 的關鍵技術,其核心價值包括:

  • 數據持久化:避免CPU-GPU通信開銷。
  • 動態處理:支持可變長度輸出與自動繪制(DrawAuto)。
  • 高效復用:適用于粒子系統、幾何變形等場景。

開發者需關注:

  • GS與SO的協同設計:明確定義輸出屬性。
  • 緩沖區管理:防止溢出并優化內存訪問。
  • 查詢機制:確保動態數據量可控。

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

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

相關文章

備份docker desktop中的opengauss數據庫

文章目錄 備份docker desktop中的opengauss數據庫一、前提條件二、備份步驟三、注意事項四、自動化備份&#xff08;可選&#xff09;五、驗證備份 備份docker desktop中的opengauss數據庫 ? 以下是在 Docker Desktop 中備份 OpenGauss 數據庫&#xff08;以你的環境為例&…

實時中值濾波 + 低通濾波 示例程序(STM32環境)

一、功能概述 本示例實現兩個濾波器&#xff1a; 中值濾波器&#xff08;Median Filter&#xff09;&#xff1a;對短期異常值&#xff08;如尖峰噪聲&#xff09;有良好的抑制能力&#xff1b;低通濾波器&#xff08;Low-Pass Filter&#xff09;&#xff1a;對數據進行平滑…

AtCoder Beginner Contest 409 題解

本文為AtCoder Beginner Contest 409 的詳細題解 目錄 題目A: 題目大意: 解題思路: 代碼(C): 題目B: 題目大意: 解題思路: 代碼(C): 題目C: 題目大意: 解題思路: 代碼(C): 題目D: 題目大意: 解題思路: 代碼(C): 題目E: 題目大意: 解題思路: 代碼(C): 題目A…

Spring @Environment 典型用法

簡單說&#xff1a;Spring 里沒有直接叫 Environment 的注解&#xff0c;更準確說常用的是 Autowired 注入 Environment 對象&#xff0c;或者結合 Value 配合 Environment 讀取配置 。 支持從以下來源讀取&#xff1a; 1、application.properties / .yaml 2、JVM 參數&#xf…

【集合與結構體】5.2(課本題)總結代碼

ds老師產物&#xff0c;純為期末復習&#xff0c;自用。 題目1 編寫程序&#xff0c;將一個整型變量右移 4 位&#xff0c;并以二進制數形式輸出該整數在移位前和移位后的數值。 //觀察系統填補空缺的數位情況 代碼解答 #include <iostream>//編寫程序&#xff0c;將一個…

16.max/min最大最小值函數

1.基本使用 max/min函數返回滿足where條件的一列的最大/最小值。 select max(column_name)|min(column_name) from table_namewhere where_definition 示例&#xff1a; ①求班級總分的最高分 #求班級總分的最高分 SELECT MAX(math_scorechinese_scoreenglish_score)AS 總分…

需要做一款小程序,用來發券,后端如何進行設計能夠保證足夠安全?

溫馨提示&#xff1a;本文由ai生成&#xff0c;請辨別閱讀&#xff0c;本文僅提供一種思考的方式和設計思路 設計一個安全的后端系統&#xff0c;用于發放優惠券的小程序&#xff0c;需要考慮多個安全層面&#xff0c;包括身份驗證、數據安全、API 安全、以及防止常見攻擊&…

ACM設計平臺-核心模塊解析-趙家康

負責模塊解析-趙家康 一、Login.vue 功能邏輯、數據綁定、表單驗證、與后端交互 Vue 登錄頁面的代碼設計 代碼功能概覽 代碼實現了一個典型的登錄頁功能&#xff0c;核心包括&#xff1a; 表單輸入&#xff08;學號、用戶名、密碼、驗證碼&#xff09; 驗證碼生成與校驗 勾…

在 VMware (WM) 虛擬機上安裝的 Ubuntu 22.04 分配了 20GB 磁盤,但僅使用 10GB 就顯示 “空間已滿“

可能原因及解決方案 虛擬機磁盤未實際擴容&#xff08;僅調整了虛擬大小&#xff09; 現象&#xff1a;在 VMware 里調整了磁盤大小&#xff08;如 20GB → 50GB&#xff09;&#xff0c;但 Ubuntu 內部仍只識別 10GB。 原因&#xff1a;VMware 調整的是虛擬磁盤上限&#xf…

初學STM32全功能按鍵非阻塞式實現和強化

其實筆者以前學51的時候按鍵功能就包含非阻塞式的&#xff0c;而且還包括矩陣按鍵的非組塞式按鍵實現。開關的長短鍵功能筆者在之前的51博文中筆者自己嘗試寫過&#xff0c;功能是有了但寫的其實很混亂&#xff0c;幾乎沒有移植的價值。這次江科大剛好出了新的教程&#xff0c;…

【網絡原理】網絡原理簡單認識 —— 內含網絡通信基礎、五元組、網絡協議(OSI 七層協議、TCP/IP 五層(或四層)協議)、封裝和分用

目錄 1. 網絡互連 1.1 局域網LAN 1.2 廣域網WAN 2 網絡通信基礎 2.1 IP地址 2.2 端口號 2.3 網絡協議 3. 五元組 4. 協議分層 4.1 OSI 七層網絡模型 4.2 TCP/IP 五層&#xff08;或四層&#xff09;網絡模型 4.3 網絡設備所在分層(經典筆試題) 5. 網絡數據傳輸的基…

嵌入式之硬件學習(三)通信方式、串口通信

目錄 一、通信種類 1、并行通信 2、串行通信 3、單工模式(Simplex Communication) 4、半雙工通信(Half-Duplex Communication) 5、全雙工通信(Full-Duplex Communication) 6、串行的異步通信與同步通信 &#xff08;1&#xff09;異步通信 &#xff08;2&#xff09;同…

【微信小程序】3、SpringBoot整合WxJava發送訂閱消息

1、創建消息模板 在公共模板庫里面選擇符合自己業務場景的消息模板&#xff0c;例如&#xff1a; 每個消息模板最多選擇5項&#xff0c;可根據自己業務需求自行選擇&#xff0c;順序也可以自己決定。提交后&#xff0c;我們就得到了屬于自己的消息模板ID 2、文檔閱讀 官方文…

Flask 快速精通:從入門到實戰的輕量級 Web 框架指南

Flask 作為 Python 生態中最受歡迎的輕量級 Web 框架&#xff0c;以其簡潔靈活的設計理念贏得了開發者的青睞。本文將系統梳理 Flask 的核心概念與實戰技巧&#xff0c;幫助你快速掌握這一強大框架。 一、Flask 框架概述 1.1 輕量級框架的核心特性 Flask 誕生于 2010 年&…

Python爬取豆瓣短評并生成詞云分析

一、項目概述 本項目的目標是爬取豆瓣上某部電影的短評數據&#xff0c;并生成詞云進行情感分析。我們將使用Python編程語言&#xff0c;借助爬蟲技術獲取數據&#xff0c;并利用自然語言處理和數據可視化工具進行分析。具體步驟包括&#xff1a; 爬取豆瓣短評數據。數據清洗…

Controller Area Network (CAN) 通信機制簡介

目錄 1. CAN 概述 2. 物理結構與傳輸機制 3. 消息格式與仲裁機制 4. 錯誤檢測與總線狀態 5. 工業用 CAN 接口 6. 本講總結 1. CAN 概述 CAN&#xff08;Controller Area Network&#xff09;是由德國博世&#xff08;Bosch&#xff09;公司于 1983 年提出的串行通信協議…

我有一個想法

我有一個想法 我想為家鄉做點事情&#xff0c;但是又不知道從哪里開始。 也許為家鄉的教育做點事情是比較靠譜的。 于是&#xff0c;我就想到了&#xff0c;是不是可以在高中學校&#xff0c;設立一個“鴻鵠”獎學金&#xff1f; 這個獎學金怎么使用呢&#xff1f; 在每年9月份…

【Pandas】pandas DataFrame stack

Pandas2.2 DataFrame Reshaping sorting transposing 方法描述DataFrame.droplevel(level[, axis])用于**從 DataFrame 的索引&#xff08;行或列&#xff09;中刪除指定層級&#xff08;level&#xff09;**的方法DataFrame.pivot(*, columns[, index, values])用于重塑 Dat…

Java 自動關閉資源語法糖 - try-with-resources

文章目錄 Java 自動關閉資源語法糖 - try-with-resources前言優勢1、自動資源管理2、處理多重資源3、異常處理更健壯4、適用條件 總結 Java 自動關閉資源語法糖 - try-with-resources 前言 日常開發中&#xff0c;我們經常會看到如下代碼&#xff1a; try (InputStream is …

MyBatis中的動態SQL是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【MyBatis中的動態SQL是什么&#xff1f;】面試題。希望對大家有幫助&#xff1b; MyBatis中的動態SQL是什么&#xff1f; 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; MyBatis中的動態SQL指的是根據不同的條件&#x…