驅動開發之六 --- 一個簡單的顯示驅動之六 【譯文】

原文鏈接:http://blog.sina.com.cn/s/blog_6ef955fa0100m4f9.html

這個系列的文章在網上到處都是 這裏也不清楚誰纔是原文作者 我這裏做個整理,標註一下希望大家能看的更加舒服一點

目錄

(一)驅動開發一個簡單的顯示驅動

(二)驅動開發一個簡單的顯示驅動

(三)驅動開發一個簡單的顯示驅動

(四)驅動開發一個簡單的顯示驅動

(五)驅動開發一個簡單的顯示驅動

(六)驅動開發一個簡單的顯示驅動

 

先後順序

現在,讓我們清楚地回顧下的這個步驟:

  • DrvEnableDriver:加載驅動
  • DrvGetModes:獲取緩衝尺寸,來存放所有支持的顯示模式。
  • DrvGetModes: 得到顯示模式
  • DrvEnablePDEV: 通知顯示驅動在DEVMODE數據結構中初始化一個選中的模式,並且返回一個實例句柄。
  • DrvCompletePDEV: 通知驅動,設備初始化已經完成。  
  • DrvEnableSurface:得到驅動來提供一個繪畫表面。
  • <GDI 調用。。。>
  • DrvDisableSurface: 刪除繪畫表面
  • DrvDisablePDEV: 刪除實例結構
  • DrvDisableDriver: 卸載顯示驅動

怎樣進行繪製?

像"BitBlt"這樣的“GDI調用”在你的顯示驅動中實際上使用DrvBitBlt。你可能注意到,我們的驅動自身沒有實現任何繪畫命令。這是因爲我們沒有硬件來加速繪畫特性,所以我決定只是調用WINDOWS提供的,已經在軟件中實現的例程。示例中,DrvBitBlt簡單的轉向EngBitBlt。這些將直接渲染到我們的視頻緩衝,這裏的視頻緩衝,我們使用的是內存映像文件。

你可能對“我怎樣從Drv*的調用中得到我的PDEV或者我的表面對象”產生疑惑。好的,傳遞給這些API的SURFOBJ包含了一個指向表面對象的指針。Dhsurf成員是一個設備創建的提供給SURFOBJ的句柄,用來代表一個設備管理的表面。這個可以通過檢查設置於SURFOBJ 上的STYPE_DEVICE標誌位來決定。

顯示驅動escape codes

前面的設備驅動中,我們知道了使用"DeviceIoControl"可以實現從用戶模式應用與驅動程序之間的通訊。對於顯示驅動,這也是可以的。然而這裏有一點不同,他們不再被叫作"IOCTLs",他們被稱作"Escape Codes"

在用戶模式下,你可以使用兩種方法中的一種發送"Escape Codes"到顯示驅動。第一種是ExtEscape,它可以簡單的發送你提供的數據給驅動。你的顯示驅動隨後將在DrvEscape例程中處理它。

第二種辦法是DrawEscape,它可以在你驅動的DrvDrawEscape中處理。不同的是,DrawEscape允許你提供一個包含你的數據的窗口DC和這個窗口的裁剪區域,提供給你的驅動。這允許你簡單的實現擴展的繪畫命令。你的驅動將通知正確的裁剪區域使這些命令在windows環境中運轉正常。

OpenGL支持

在Windows中,通過使用一個可安裝用戶驅動包(ICD:Installable Client Driver)來實現OpenGL支持,這個概念最初由SGI提出,通過讓製造商完全地實現圖形管道來提高OpenGL的性能。當OpenGL32.DLL被加載時,它會向視頻驅動詢問它的ICD,如果有,就會被加載到進程空間,OpenGL的API就是由ICD提供。ICD完全控制着圖形管道,因而每個製造商和驅動版本都有不同的實現。

通常的做法是緩衝OpenGL命令,然後使用ExtEscape這個api將他們從緩衝刷新到圖形加速卡。ICD包現在是由微軟維護的,如果你想爲它開發,但它不是免費的。

 

另有一種支持OpenGL辦法是通過小型用戶驅動包(MCD:Mini Client Driver)實現的。這是微軟最早爲提供OpenGL 支持而使用的辦法,類似於ICD,但是MCD位於內核中。據我所知這種辦法非常慢,沒有被任何的驅動製造商使用。

DirectX支持

 

在XPDM下, GDI驅動通過DrvEnableDirectDraw接口提供了DirectDraw的支持。由微軟公司提供的系統元件實現了DirectX圖形管道的用戶模式部分和一些內核部分。這些API簡單的返回一系列回調接口,內核中的DirectDraw層將用來在硬件中執行特殊的動作。

 

Direct3D通過DrvGetDirectDrawInfo來完成初始化,在DrvGetDirectDrawInfo 中GDI驅動要求支持Direct3D。提供的回調將被調用幾次來得到恰當的進入驅動的接口,這些接口實現了Direct3D不同的特徵。這些在MSDN中作了描寫。

什麼是鏡像驅動?

鏡像驅動並不像字面意思那樣,你可以加載一個視頻驅動,這個視頻驅動鏡像另一個顯示驅動。他們會收到同他們鏡像的顯示驅動一樣的調用。鏡像驅動不支持DrvGetModes,然而如果你實現它,返回的顯示模式將會被緩存,你不能動態的改變這些模式。儘管我聽說在模式切換上,實現DrvGetModes能幫助加載和卸載顯示驅動,但是我沒有能得到證實。

 

爲了加載鏡像驅動,這個設備的註冊表鍵需要設置"Attach.ToDesktop"的值爲1。然後你可以在鏡像驅動上使用參數"CDS_UPDATEREGISTRY"調用ChangeDisplaySettingsEx。然後設置你希望切換的顯示模式,再在鏡像驅動上調用一次ChangeDisplaySettingsEx。

鏡像驅動在模式切換時不會完全地卸載。通常如果有繪製表面的引用,驅動將不會卸載。所以,從我的經驗來看,得到鏡像驅動,爲了模式切換,你需要一個應用程序來檢測WM_DISPLAYCHANGE消息。你也可以在加載顯示驅動後,設置"Attach.ToDesktop“爲0。這將有助於你卸載顯示驅動,對於WM_DISPLAYCHANGE,你可以仔細檢查這個卸載鏡像驅動的過程。

如果你希望立即卸載鏡像驅動,而不需要顯示驅動改變,你需要遵循同加載一樣的步驟。設置"Attach.ToDesktop"爲0,然後執行"CDS_UPDATEREGISTRY"。然後不帶參數再調用"ChangeDisplaySettingsEx"一次來強制卸載。儘管這看上去像是再運行一遍,所有的事情都通過引用顯示錶面完成。所以如果有對於顯示錶面顯著的引用,驅動將不會被卸載。DDK中鏡像驅動的例子沒有全部實現這些,有一些缺少部分,正如在加載鏡像驅動後,沒有實現WM_DISPLAYCHANGE,也沒有重新設置"Attach.ToDesktop"爲0。

 

例子

 

本篇示例驅動在應用程序和顯示驅動之間簡單共享了一個內存映像文件。顯示驅動寫圖形命令給內存映像文件,應用程序作爲監視器執行,每秒鐘大約刷新自己70次。儘管這不是是非常有效,但這僅僅是一個例子。顯示驅動象一個常規硬件驅動一樣的安裝,看上去類似於ATI或者NVIDIA驅動。

爲了安裝這個示例,你需要使用控制面板中的"Add New Hardware" 。你必須選擇"Hardware is already installed"和"Manually select hardware from a list"。下面的圖片顯示了設備列表,你需要滾動到最後,選擇"Add a new hardware device"

 

 

 

然後,你選擇"Have Disk"找這個工程提供的.INF文件。然後,向下滾動到新的列表,找出如下圖所示的"Toby Opferman Sample Video Display"

 

 

除非你不想安裝這個驅動,不然你會看到下面的對話框,你選擇"Continue Anyway"來安裝。下一步要做的就是使用顯示設置和第三個選項卡激活第二個監視器。運行本篇提供的鏡像程序,你會在應用窗口中看到第二個監視器。

 

 

結論:

本篇展示瞭如何創建一個簡單的顯示驅動來處理GDI命令。本篇提及的顯示驅動體系結構僅僅適用於XPDM,不適用於windows vista中新的LDDM.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章