專利名稱:完整獲取GDI和DirectX數(shù)據(jù)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機圖形及圖像處理領(lǐng)域,具體涉及一種在保持 DirectX功能可用的同時完整獲取Windows GDI和DirectX數(shù)據(jù)的方法。
背景技術(shù):
在3D和視頻處理納入計算機的常規(guī)計算能力后,在實時遠程應(yīng) 用中出現(xiàn)了對GDI數(shù)據(jù)和3D、視頻等DirectX數(shù)據(jù)同步截獲的需求。 現(xiàn)有獲取計算機屏幕的數(shù)據(jù)的方法有如下幾種-(1) 在用戶態(tài)采用掛鉤的方式掛接到系統(tǒng)存在的每個應(yīng)用程序, 過濾與屏幕變化有關(guān)的操作并進行處理。由于圖形系統(tǒng)的操作數(shù)據(jù)量 很大,使得這種方法的效率較低,難以快速同步獲取圖形輸出。而且, 由于掛接到每個進程,使得同步復(fù)雜。遠程工具VNC的早期版本釆 用了這種方式。(2) 采用Windows定義的Mirror體系,可以高效獲取同步變化。 但是這種方法的缺點是系統(tǒng)自動禁止DirectX應(yīng)用,無法獲取DirectX 數(shù)據(jù)。(3 )釆用用戶態(tài)截獲DirectX COM接口的方式獲取DirectX數(shù)據(jù), 但是這種方法又無法處理GDI數(shù)據(jù)。(4)通過過濾驅(qū)動獲取GDI數(shù)據(jù),可以保持DirectX接口的可用 性,與方法(3)配合可以完整截獲GDI和DirectX數(shù)據(jù)。雖然方法(3) 和(4)結(jié)合后可以截獲GDI和DirectX數(shù)據(jù),但使用煩瑣,且方法3 工作在DirectX COM接口上,接口復(fù)雜,對通過DirectX直接操作顯 存的截獲很難判斷。因此,需要一種在單一平臺下在保持DirectX功能可用的同時完
整獲取Windows GDI和DirectX數(shù)據(jù)的技術(shù)。
發(fā)明內(nèi)容
鑒于上述問題,提出了本發(fā)明。本發(fā)明的目的是提供一種在保持 DirectX功能可用的同時完整獲取Windows GDI和DirectX數(shù)據(jù)的方法。在本發(fā)明的一個方面,提出了一種采用過濾驅(qū)動獲取圖形設(shè)備接 口數(shù)據(jù)和DirectX數(shù)據(jù)的方法,所述過濾驅(qū)動對圖形設(shè)備接口引擎和 DirectX內(nèi)核與真實顯示驅(qū)動是透明的,所述方法包括步驟對圖形設(shè) 備接口更新,在過濾驅(qū)動中通過對應(yīng)的圖形設(shè)備接口函數(shù)獲取圖形設(shè) 備接口數(shù)據(jù);對DirectX中的DirectDraw,通過截獲DirectDraw部分的 幀切換和位塊傳遞操作,來獲取DirectDraw應(yīng)用和視頻更新數(shù)據(jù);對 DirectX中的Direct3D,通過截獲Direct3D部分的更新接口 ,來獲取 Direct3D應(yīng)用的數(shù)據(jù)。優(yōu)選地,該方法還包括在獲取之前以靜態(tài)方式或者動態(tài)方式加 載顯示過濾驅(qū)動。優(yōu)選地,在顯示緩沖之前,解碼數(shù)據(jù)/變換緩沖之后的位置,執(zhí)行 對DirectX中的DirectDraw部分的截獲。優(yōu)選地,在顯示緩沖之前,變換緩沖之后的位置,執(zhí)行對DirectX 中的Direct3D部分的截獲。優(yōu)選地,通過截獲更新接口 Flip和Blit來實現(xiàn)對DirectX中的 DirectDraw部分的截獲。優(yōu)選地,通過截獲更新接口 DDFlip和DDBlit來實現(xiàn)對DirectX 中的Direct3D部分的截獲。優(yōu)選地,該方法還包括將圖形設(shè)備接口的更新、DirectX中的 DirectDraw的更新和DirectX中的Direct3D的更新存儲在更新緩沖區(qū) 中。優(yōu)選地,對圖形設(shè)備接口的更新進行無損壓縮,而對DirectX中 的DirectDraw的更新和DirectX中的Direct3D的更新進行有損壓縮。 利用本發(fā)明的方法,定義虛擬的圖形過濾,該顯示過濾驅(qū)動對圖
形系統(tǒng)提供了 GDI和DirectX功能,并將其中涉及本地屏幕更新的接 口進行截獲,當(dāng)截獲的接口被調(diào)用時先根據(jù)是否需要本地顯示調(diào)用真 實驅(qū)動實現(xiàn)本地更新,然后將更新記錄在更新表中進行后繼處理。采 用這種方式保留了顯卡的DirectX功能,并使得系統(tǒng)的DirectX應(yīng)用可 以正常運行。另外,對GDI功能通過位塊傳遞、位塊復(fù)制等接口截獲處理,對 DirectX通過幀切換和幀繪制接口進行截獲,圖形系統(tǒng)的本地更新就是 通過這些接口完成,所以截獲這兩類接口后就可以同步截獲GDI和 DirectX更新。由于截獲的所有接口處在同一個模塊,所以截獲完整, 處理簡單,GDI和DirectX部分同步性好,效率高。
從下面結(jié)合附圖的詳細描述中,本發(fā)明的上述特征和優(yōu)點將更明顯,其中圖1示出了根據(jù)本發(fā)明實施例的方法中所使用的顯示過濾驅(qū)動與 GDI引擎、真實顯示驅(qū)動以及DirectX內(nèi)核之間的邏輯關(guān)系; 圖2示出了根據(jù)本發(fā)明的方法的總體流程圖; 圖3示出了在DirectDraw的情況下如何截獲顯示數(shù)據(jù)的示意圖; 圖4示出了在Direct3D的情況下如何截獲顯示數(shù)據(jù)的示意圖;以及圖5示出了以DDBlit為例用來說明在DDI情況下的處理流程圖。
具體實施方式
以下對照附圖詳細說明本發(fā)明的具體實施方式
。在下面的說明中 省略了本領(lǐng)域公知的一些技術(shù)的細節(jié),因為對這些公知技術(shù)的詳細描 述將會導(dǎo)致本發(fā)明的一些特點和優(yōu)點變得不清楚。圖1示出了根據(jù)本發(fā)明實施例的方法中所使用的顯示過濾驅(qū)動 150與GDI引擎100、真實顯示驅(qū)動200以及DirectX內(nèi)核500之間的 邏輯關(guān)系。如圖1所示,本發(fā)明在GDI引擎100和DirectX內(nèi)核500與真實
顯示驅(qū)動200之間加入了一個過濾層,稱為顯示過濾驅(qū)動150。該過 濾驅(qū)動實現(xiàn)當(dāng)前桌面顯示系統(tǒng)支持的兩大類接口,即顯示DDI和顯示 DirectX,通過安裝該顯示過濾驅(qū)動150并對系統(tǒng)進行初始化,該過濾 層對Windows GDI引擎100和DirectX內(nèi)核500表現(xiàn)為真實顯示驅(qū)動 200,而對真實顯示驅(qū)動200則表現(xiàn)為Windows GDI引擎100和DirectX 內(nèi)核500。也就是說,這里的顯示過濾驅(qū)動150對GDI引擎100和真 實顯示驅(qū)動200是透明的。圖2示出了根據(jù)本發(fā)明的方法的總體流程圖。如圖2所示,首先 加載顯示過濾驅(qū)動150 (SllO)。然后,在操作系統(tǒng)的運行過程中實時 截獲DDI、 DirectDraw和Direct3D下的顯示數(shù)據(jù)(S120),并進行更 新處理(S130)。該顯示過濾驅(qū)動150安裝時在系統(tǒng)配置中被設(shè)置為當(dāng)前物理顯卡 的驅(qū)動程序,或者截獲系統(tǒng)的模塊加載入口。在運行時刻發(fā)現(xiàn)加載模 塊為物理顯卡驅(qū)動時首先加載該顯示過濾驅(qū)動150,系統(tǒng)加載顯示過 濾驅(qū)動150后后截獲真實驅(qū)動的接口。具體來說,對Windows GDI 更新,該顯示過濾驅(qū)動150通過對應(yīng)的DDI進行截獲;對DirectX中 的DirectDraw,該顯示過濾驅(qū)動150通過截獲顯示驅(qū)動核心的 DirectDraw部分的幀切換和位塊傳遞操作,實現(xiàn)截獲DirectDraw應(yīng)用 和視頻更新數(shù)據(jù);對DirectX的Direct3D,則通過截獲顯示驅(qū)動核心 的Direct3D部分的表示(Present)等更新接口 ,實現(xiàn)截獲Direct3D應(yīng) 用的數(shù)據(jù)。在配置系統(tǒng)使得系統(tǒng)為當(dāng)前顯卡加載顯示過濾驅(qū)動150的過程 中,可以采用兩種方法配置系統(tǒng),即靜態(tài)方法和動態(tài)方法。靜態(tài)方法安裝程序獲取當(dāng)前系統(tǒng)的主顯示設(shè)備的PND DeviceID(即插即用 設(shè)備標(biāo)識),枚舉并匹配顯卡注冊項 {4d36e968-e325-11 ce-bfc 1 -08002be 10318}下每個注冊項的DeviceID。 對于匹配的注冊項,修改其Settings (設(shè)置)鍵下的 InstalledDisplayDrivers注冊項,將該Key的值修改為顯示過濾驅(qū)動150 的名字。操作系統(tǒng)通過該名字獲得顯卡驅(qū)動的模塊名并加載到系統(tǒng)中,
這樣顯示過濾驅(qū)動150就被加載到系統(tǒng)中。動態(tài)方法截獲系統(tǒng)的模塊加載功能,在發(fā)現(xiàn)正在加載的模塊為顯卡驅(qū)動時, 首先加載該顯示過濾驅(qū)動150,然后由顯示過濾驅(qū)動150加載顯卡驅(qū) 動。下面分別描述如何截獲DDI、 DirectDraw和Direct3D下的顯示數(shù)據(jù)。系統(tǒng)統(tǒng)加載顯示過濾驅(qū)動150后,在驅(qū)動入口函數(shù) DrvEnableDriver中,顯示過濾驅(qū)動150加載真實驅(qū)動,并將真實驅(qū)動 返回的DDI接口函數(shù)表復(fù)制一份,對需要截取屏幕更新的DDI函數(shù), 將其在函數(shù)表中的值修改成指向過濾驅(qū)動對應(yīng)函數(shù)的指針,同時保存 原始函數(shù)指針。這樣,顯示過濾驅(qū)動150實現(xiàn)了對真實顯示驅(qū)動200 調(diào)用的過濾功能。圖3示出了在DirectDraw的情況下如何截獲顯示數(shù)據(jù)的示意圖。 如圖3所示,在視頻和游戲中常見的處理過程中本發(fā)明的方法要進行 截獲的截獲點處于顯示緩沖之前,解碼數(shù)據(jù)/變換緩沖之后。而解碼數(shù) 據(jù)/變換緩沖中的數(shù)據(jù)是視頻數(shù)據(jù)和/或游戲場景。對DirectDraw來說,顯示數(shù)據(jù)的截獲是通過修改DirectDraw函數(shù) 表指針來實現(xiàn)的。DirectDraw作為擴充集合,在DDI函數(shù)表中, DrvEnableDirectDraw是DirectDraw功能的,在Z>v£wa6/eZ)/re"Z>cw 調(diào)用中,將DD—CALLBACKS 、 DD—SURFACECALLBACKS和 DD—PALETTECALLBACKS結(jié)構(gòu)中的回調(diào)函數(shù)指針指向本發(fā)明提供 的函數(shù),從而在相應(yīng)的Surface創(chuàng)建、顯示和管理接口處獲得調(diào)用, 并在調(diào)色板變化時也獲得調(diào)用。具體而言,要截獲的的兩個關(guān)鍵更新 接口為Flip和Blit,對應(yīng)的DDI接口名字是DDFlip和DDBlit。在圖3中,視頻和游戲程序會將要顯示的內(nèi)容進行處理,比如對 壓縮的視頻數(shù)據(jù)進行解碼,對游戲中的下一個場景進行計算,然后將 數(shù)據(jù)生成到緩沖中。如果當(dāng)前的游戲或者視頻是全屏模式,會調(diào)用 DirectDraw的flip函數(shù)進行屏幕數(shù)據(jù)更新。如果為窗口模式則調(diào)用blit 進行更新。這兩種用戶程序的輸出處理最終會調(diào)用到顯示驅(qū)動提供的
DDFlip和DDBlit接口中,此時過濾驅(qū)動會獲得調(diào)用,顯示過濾驅(qū)動 150將本次更新調(diào)用記錄在更新調(diào)用表300中,以便進行后繼處理400。圖4示出了在Direct3D的情況下如何截獲顯示數(shù)據(jù)的示意圖。圖 4中的處理過程與DirectDraw的情況類似,3D物體的復(fù)雜過程,例如 對材質(zhì)、形狀和紋理進行變換后最終也表現(xiàn)為一個輸出緩沖,即變換 緩沖。在這種情況下,顯示數(shù)據(jù)的截獲點處于顯示緩沖之前,變換緩 沖之后的位置。只要截獲了 DirectDraw的DDFlip和DDBlit接口 ,就 可以實現(xiàn)Direct3D的截獲。Direct3D的處理與此類似。Direct3D允許對組成3D物體的模型進行材質(zhì)、紋理的疊加處理,并進行坐標(biāo)、位置等變換和進行陰影處 理,這些復(fù)雜的操作結(jié)果最終表現(xiàn)為一個緩沖區(qū),等待顯示。與DirectX應(yīng)用程序接口 (API)不同的是,在Direct3D應(yīng)用程序中統(tǒng)一使用 Present接口緩沖區(qū)的顯示,但在真實驅(qū)動中并不存在這個Present接 口 ,而是仍然使用DDFlip和DDBlt進行輸出。所以,只要截獲了 DDFlip 和DDBlt,可以不截獲其它涉及3D模型變換的接口,就可以截獲 Direct3D輸出。在處理更新過程中,當(dāng)需要本地屏幕時,顯示過濾驅(qū)動150的截 獲接口首先獲得調(diào)用。對于GDI和DirectX數(shù)據(jù),由于它們明顯不同, 所以需要進行不同的更新處理和后繼處理。處理GDI更新GDI是一種累計更新方式,即只對變化的部分進行更新,所以處 理GDI的更新方式就是記錄引起GDI屏幕變化的區(qū)域和進行的操作, 并備份操作需要的源數(shù)據(jù), 一起保存到更新表中。由于GDI總的更新 量較少,通??梢赃B續(xù)保存多個變化。處理DirectDraw和Direct3D更新與GDI更新不同的是,DirectDraw和Direct3D的更新通常是整幀 更新,即變化區(qū)內(nèi)的整個數(shù)據(jù)都會得到完整刷新,即使許多部分與上 一幀完全相同。這是因為這種更新的畫面通常由多部分組成,在輸出 前需要進行某些實現(xiàn)特效的變換合成。這種應(yīng)用的數(shù)據(jù)通常是視頻或 者3D游戲的整屏更新,以幀為基礎(chǔ)。這種更新也保存到更新表300
中。但是,通常在系統(tǒng)資源和帶寬限制下,只保存最新的一個或者幾 個更新,如果來不及處理通常會用后來的更新覆蓋前面的。根據(jù)一種實現(xiàn),將保存的GDI更新和DirectX更新同步保存在更 新表中,而且對每個更新進行時序編號。對GDI更新進行無損壓縮, 同時對DirectX更新進行快速有損壓縮。例如,通過網(wǎng)絡(luò)將壓縮的數(shù) 據(jù)發(fā)送到一個或者多個遠端,并將遠端的鼠標(biāo)反饋回來,就可以實現(xiàn) 遠程投影或者遠程控制。圖5示出了以DDBlit函數(shù)為例說明在DDI的情況下的處理流程圖。首先調(diào)用DDBlit函數(shù)(S110)。然后,判斷工作模式是否需要本 地顯示(S120)。如果當(dāng)前的工作模式是需要本地顯示(S120:是),調(diào)用真實驅(qū) 動的更新函數(shù),在某些應(yīng)用中可能不需要本地顯示(S120:否),則 跳過調(diào)用真實驅(qū)動的DDBlit的過程。然后,判斷更新緩沖區(qū)300的目標(biāo)是否為物理顯示區(qū)(S140)。 如果更新緩沖區(qū)的目標(biāo)不是物理顯示區(qū)(S140:否), 一定是中間步 驟的操作,流程返回。否則(S140:是),復(fù)制點陣數(shù)據(jù)到更新緩沖 區(qū)(S150),并在更新表中進行記錄。接下來,對獲得的點陣進行后繼處理400 (S160),這個步驟可以 同步在DDBlit的調(diào)用中執(zhí)行,也可以根據(jù)需要進行異步處理。以上所述,僅為本發(fā)明中的具體實施方式
,但本發(fā)明的保護范圍 并不局限于此,任何熟悉該技術(shù)的人在本發(fā)明所揭露的技術(shù)范圍內(nèi), 可輕易想到的變換或替換,都應(yīng)涵蓋在本發(fā)明的包含范圍之內(nèi)。因此, 本發(fā)明的保護范圍應(yīng)該以權(quán)利要求書的保護范圍為準(zhǔn)。
權(quán)利要求
1. 一種采用過濾驅(qū)動獲取圖形設(shè)備接口數(shù)據(jù)和DirectX數(shù)據(jù)的方法,所述過濾驅(qū)動對圖形設(shè)備接口引擎和DirectX內(nèi)核與真實顯示驅(qū)動是透明的,所述方法包括步驟對圖形設(shè)備接口更新,在過濾驅(qū)動中通過對應(yīng)的圖形設(shè)備接口函數(shù)獲取圖形設(shè)備接口數(shù)據(jù);對DirectX中的DirectDraw,通過截獲DirectDraw部分的幀切換和位塊傳遞操作,來獲取DirectDraw應(yīng)用和視頻更新數(shù)據(jù);對DirectX中的Direct3D,通過截獲Direct3D部分的更新接口,來獲取Direct3D應(yīng)用的數(shù)據(jù)。
2. 如權(quán)利要求1所述的方法,其特征在于,還包括在獲取之前以靜態(tài)方式或者動態(tài)方式加載顯示過濾驅(qū)動。
3. 如權(quán)利要求1所述的方法,其特征在于,在顯示緩沖之前, 解碼數(shù)據(jù)/變換緩沖之后的位置,執(zhí)行對DirectX中的DirectDraw部分的截獲。
4. 如權(quán)利要求1所述的方法,其特征在于,在顯示緩沖之前, 變換緩沖之后的位置,執(zhí)行對DirectX中的Direct3D部分的截獲。
5. 如權(quán)利要求3所述的方法,其特征在于,通過截獲更新接口 Flip和Blit來實現(xiàn)對DirectX中的DirectDraw部分的截獲。
6. 如權(quán)利要求4所述的方法,其特征在于,通過截獲更新接口 DDFlip和DDBlit來實現(xiàn)對DirectX中的Direct3D部分的截獲。
7. 如權(quán)利要求1所述的方法,其特征在于,還包括將圖形設(shè)備接口的更新、DirectX中的DirectDraw的更新和DirectX中的 Direct3D的更新存儲在更新緩沖區(qū)中。
8. 如權(quán)利要求7所述的方法,其特征在于,對圖形設(shè)備接口的 更新進行無損壓縮,而對DirectX中的DirectDraw的更新和DirectX 中的Direct3D的更新進行有損壓縮。
全文摘要
公開了一種采用過濾驅(qū)動獲取圖形設(shè)備接口數(shù)據(jù)和DirectX數(shù)據(jù)的方法,所述過濾驅(qū)動對圖形設(shè)備接口引擎和DirectX內(nèi)核與真實顯示驅(qū)動是透明的,所述方法包括步驟對圖形設(shè)備接口更新,在過濾驅(qū)動中通過對應(yīng)的圖形設(shè)備接口函數(shù)獲取圖形設(shè)備接口數(shù)據(jù);對DirectX中的DirectDraw,通過截獲DirectDraw部分的幀切換和位塊傳遞操作,來獲取DirectDraw應(yīng)用和視頻更新數(shù)據(jù);對DirectX中的Direct3D,通過截獲Direct3D部分的更新接口,來獲取Direct3D應(yīng)用的數(shù)據(jù)。利用本發(fā)明的方法,在保持DirectX功能可用的同時完整獲取Windows GDI和DirectX數(shù)據(jù)。
文檔編號G06F9/44GK101211258SQ20061016975
公開日2008年7月2日 申請日期2006年12月28日 優(yōu)先權(quán)日2006年12月28日
發(fā)明者孫成昆, 彭紹平, 李洪偉, 蔣曉華, 顏毅強 申請人:聯(lián)想(北京)有限公司