圖形低階客戶端支援
[這些函式可能會隨著每個操作系統修訂而變更。 請改用 Microsoft DirectDraw 和 Microsoft Direct3DAPIs;這些 API 會將應用程式與這類作業系統變更隔離,並隱藏與顯示驅動程式直接互動的許多其他困難。 如需詳細資訊,請參閱 Display 簡介。]
DirectDraw 和 Direct3D 會使用一些內核模式例程來與作業系統和顯示驅動程序通訊。
從使用者模式元件的觀點來看,操作系統核心似乎是 DirectDraw/Direct3D 顯示驅動程式。 不過,核心和顯示驅動程序之間的一些差異確實存在。 核心模式元件會保留代表 DirectDraw/Direct3D 對象的結構複本,例如裝置和表面。 DirectDraw/Direct3D 的使用者模式元件會要求建立這些結構,這些結構會參考核心模式所傳回的句柄。 因此,差異主要在於傳遞至例程的自變數:核心接受句柄,而驅動程式通常接受指標。
核心模式進入點的演進
DirectDraw 會使用數個進入點,透過Gdi32.dll,將其所有連線到核心模式。 這些進入點通常只是封送處理參數。 在建立裝置時,Gdi32.dll會傳回本身內例程的指標,然後由 DirectDraw 和 Direct3D 7.0 使用。
Direct3D 8。x 會中斷Gdi32.dll,並直接呼叫內核模式進入點。
呼叫核心
這些進入點很類似,而且在許多情況下,與顯示驅動程式本身的進入點相同,因此瞭解 DirectDraw 和 Direct3D 的驅動程序開發工具包 (DDK) 材質是使用這些函式的必要條件。
呼叫這些函式時,操作系統會有所不同。 在 Windows 2000 上,W2KUMODE。LIB 連結庫包含可讓呼叫線程轉換至內核模式的例程。 這些例程不會執行參數封送處理,而且是 Windows 2000 上理想的呼叫機制。 轉換至核心模式的機制仰賴數據表的順序。 此順序將會在作業系統修訂之間變更。 因此,不建議建置依賴W2KUMODE的應用程式。適用於 Windows 2000 的 LIB,並預期它會在 Windows XP 上執行未修改。 下一節將說明建立操作系統可移植性的機制。
在 Windows XP 上,D3D8THK.DLL匯出所有核心模式函式,但具有稍微裝飾的名稱。 下列範例示範應用程式如何使用預處理器來別名低階用戶端函式。 執行此動作之前,請動態連結至D3D8THK.DLL。
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
撰寫可攜式應用程式
有數種技術可用來讓應用程式跨操作系統移植。 最強固的是,在 Windows 2000 上安裝 Microsoft DirectX 8.x 可轉散發套件,作為您自己應用程式安裝程式的一部分。 這可確保D3D8THK.DLL可在 Windows 2000 系統上使用,並允許應用程式中的單一程式碼路徑,因為您可以使用上述 Windows XP 所述的相同技術。
應用程式也可以建置自己的隔離 DLL,並實作該 DLL 的兩個版本,一個用於 Windows 2000,使用上述技術,另一個用於使用D3D8THK.DLL的 Windows XP。
裝置建立
DirectDraw 和 Direct3D 必須先建立驅動程序物件核心抽象概念的實例。 在Gdi32.dll和Ddraw.dll中,呼叫 DdCreateDirectDrawObject、DdQueryDirectDrawObject 和 DdReenableDirectDrawObject 來達成此目的。 在 Direct3D 8 中。x,這是藉由呼叫 NtGdiDdCreateDirectDrawObject、NtGdiDdQueryDirectDrawObject 和 NtGdiDdReenableDirectDrawObject 來達成此目的。 請注意,GdiEntry* 進入點只是內核模式進入點的封送器。
呼叫這些函式之後,會傳回句柄,代表 DirectDraw 裝置的核心物件抽象概念。 此核心物件代表顯示驅動程式所擁有的驅動程序實例。 此句柄可用於後續呼叫,例如 Direct3D 8 中的 DdCreateSurfaceObject (或 NtGdiDdCreateSurfaceObject。x) 以建置進一步的物件。
核心物件
有幾個進入點可用來管理特定物件的核心模式表示法。 DdCreateSurfaceObject (或 Direct3D 8 中的 NtGdiDdCreateSurfaceObject。x) 是一個很好的範例。 此進入點會建立代表系統記憶體片段的核心模式物件。 進入點會傳回句柄,而且此句柄可用於後續的繪圖呼叫中。 核心會從這些句柄衍生其本身結構的指標,並將該指標傳遞至顯示驅動程式,然後執行作業。
函式
下表列出代表內核模式進入點的函式,以及包裝這些進入點之Gdi32.dll的使用者模式協助程式例程。
主題 | 目錄 |
---|---|
DdAttachSurface | DdAttachSurface 函式會附加兩個內核模式介面表示法。 |
DdCreateDIBSection | 建立 DIBSECTION 結構,其與裝置共用其色彩數據表。 GdiEntry9 #defined 為此函式的別名。 |
DdCreateDirectDrawObject | NtGdiDdCreateDirectDrawObject 函式的包裝函式,並建立 DirectDraw 物件的內核端表示法。 此表示法的句柄會儲存在 pDirectDrawGlobal-hDD> 中。 GdiEntry1 定義為此函式的別名。 |
DdCreateSurfaceObject | NtGdiDdCreateSurfaceObject 函式的包裝函式,並建立內核模式介面物件。 GdiEntry4 定義為此函式的別名。 |
DdDeleteDirectDrawObject | NtGdiDdDeleteDirectDrawObject 函式的包裝函式,並刪除先前使用 DdCreateDirectDrawObject 建立的核心模式 DirectDraw 物件。 GdiEntry3 定義為此函式的別名。 |
DdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject 函式的包裝函式,並刪除 NtGdiDdCreateSurfaceObject 先前建立的核心模式介面物件。 GdiEntry5 定義為此函式的別名。 |
DdGetDC | NtGdiDdGetDC 函式的包裝函式,並傳回代表 DirectDraw 介面的 Windows Graphics Device Interface (GDI) 裝置內容 (DC)。 GdiEntry7 定義為此函式的別名。 |
DdGetDxHandle | DdGetDxHandle 會傳回核心模式 Microsoft DirectX API 句柄,以在控制 DirectX API 機制的核心模式進入點後續呼叫中使用。 |
DdQueryDirectDrawObject | NtGdiDdQueryDirectDrawObject 函式的包裝函式,並查詢先前建立的功能內核模式表示法。 GdiEntry2 定義為此函式的別名。 |
DdQueryDisplay 設定 Uniqueness | 傳回每當模式切換發生時遞增的整數值,例如當有桌面交換器、快速用戶切換或全螢幕 Microsoft MS-DOS 方塊時。 應用程式可以重複呼叫此函式,並比較傳回值的舊值和新值,以判斷顯示設定是否已變更。 GdiEntry13 定義為此函式的別名。 |
DdReenableDirectDrawObject | NtGdiDdReenableDirectDrawObject 函式的包裝函式。 它會在模式切換樣式事件之後重新啟用 DirectDraw 驅動程式實例,例如 true 模式切換、全螢幕 MS-DOS 方塊的外觀,或變更顯示驅動程式。 GdiEntry10 定義為此函式的別名。 |
DdReleaseDC | NtGdiDdReleaseDC 函式的包裝函式,並釋放先前透過 DdGetDC 或 GdiEntry7 取得的 DC。 GdiEntry8 定義為此函式的別名。 |
DdResetVisrgn | NtGdiDdResetVisrgn 函式的包裝函式,並針對桌面上視窗的裁剪區域啟用及時的使用者模式資訊。 GdiEntry6 定義為此函式的別名。 |
DdSetGammaRamp | DdSetGammaRamp 函式會設定裝置的伽瑪坡道。 |
DdSwapTextureHandles | 針對 Microsoft DirectDraw 7.0 之前的設備驅動器介面 (DIS) 開發,在 Microsoft Windows NT 系統上不會執行任何動作。 會忽略所有參數。 GdiEntry16 定義為此函式的別名。 |
DdUnattachSurface | DdUnattachSurface 函式會移除兩個內核模式介面對象之間以 DdAttachSurface 建立的附件。 |
NtGdiD3DContextCreate | 建立內容。 |
NtGdiD3DContextDestroy | 刪除指定的內容。 |
NtGdiD3DContextDestroyAll | 查詢驅動程式管理的記憶體堆積中的可用記憶體數量。 |
NtGdiD3DDrawPrimitives2 | 轉譯基本類型,並傳回更新的轉譯狀態。 |
NtGdiD3DGetDriverState | DirectDraw 和 Direct3D 運行時間都用來從驅動程式取得其目前狀態的相關信息。 |
NtGdiD3DValidateTextureStageState | 傳回硬體可以執行目前狀態所指定混合作業的傳遞數目。 |
NtGdiDdAddAlphaBlt | 未實作。 |
NtGdiDdAddAttachedSurface | 將表面連接到另一個表面。 |
NtGdiDdAttachSurface | 附加兩個內核模式介面表示法。 |
NtGdiDdBeginMoCompFrame | 開始譯碼新的框架。 |
NtGdiDdBlt | 執行位區塊傳輸。 |
NtGdiDdCanCreateD3DBuffer | 判斷驅動程式是否可以建立指定描述的驅動程式層級命令或頂點緩衝區。 |
NtGdiDdCanCreateSurface | 指出驅動程式是否可以建立指定介面描述的介面。 |
NtGdiDdColorControl | 控制重疊表面的亮度和亮度控件。 |
NtGdiDdCreateD3DBuffer | 用來建立指定描述的驅動程式層級命令或頂點緩衝區。 |
NtGdiDdCreateDirectDrawObject | 建立 DirectDraw 物件的核心端表示法。 |
NtGdiDdCreateMoComp | 通知驅動程式軟體譯碼器會開始搭配指定的 GUID 使用動作補償。 |
NtGdiDdCreateSurface | 將表面連接到另一個表面。 |
NtGdiDdCreateSurfaceEx | 從 DirectDraw 介面建立 Direct3D 表面,並將要求的句柄值與它產生關聯。 |
NtGdiDdCreateSurfaceObject | 建立核心模式介面物件,代表 puSurfaceLocal 所參考的使用者模式介面物件。 |
NtGdiDdDeleteDirectDrawObject | 終結先前建立的核心模式 DirectDraw 裝置物件。 |
NtGdiDdDeleteSurfaceObject | NtGdiDdDeleteSurfaceObject 會刪除先前建立的核心模式介面物件。 |
NtGdiDdDestroyD3DBuffer | 終結先前配置的核心模式 DirectDraw 介面物件,該物件是以設定為 DDSCAPS_EXECUTEBUFFER 之 DDSCAPS 結構的 dwCaps 成員所建立。 |
NtGdiDdDestroyMoComp | 通知驅動程式,此動作補償物件將不再使用。 驅動程式現在必須執行任何必要的清除。 |
NtGdiDdDestroySurface | 終結先前配置的內核模式 DirectDraw 介面物件。 |
NtGdiDdEndMoCompFrame | 完成已譯碼的框架。 |
NtGdiDdFlip | 讓與目標與目前介面相關聯的介面記憶體交換。 |
NtGdiDdFlipToGDISurface | 當 DirectDraw 翻轉至 GDI 介面或從 GDI 介面翻轉時通知驅動程式。 |
NtGdiDdGetAvailDriverMemory | 查詢所有視訊記憶體堆積中的可用記憶體數量。 |
NtGdiDdGetBltStatus | 查詢指定介面的blit狀態。 |
NtGdiDdGetDC | 建立指定介面的DC。 |
NtGdiDdGetDriverInfo | 查詢驅動程式是否有驅動程序支援的其他 DirectDraw 和 Direct3D 功能。 |
NtGdiDdGetDxHandle | 傳回核心模式 DirectX API 句柄,以用於控制 DirectX API 機制之核心模式進入點的後續呼叫。 |
NtGdiDdGetFlipStatus | 判斷介面上最近要求的翻轉是否已經發生。 |
NtGdiDdGetInternalMoCompInfo | 可讓驅動程式報告它在內部配置顯示記憶體以執行動作補償。 |
NtGdiDdGetMoCompBuffInfo | 允許驅動程式指定支援指定 GUID 所需的過渡介面數目,以及每個介面的大小、位置和格式。 |
NtGdiDdGetMoCompFormats | 指出硬體可以譯碼數據的未壓縮格式。 |
NtGdiDdGetMoCompGuids | 擷取驅動程序支援的 GUID 數目。 |
NtGdiDdGetScanLine | 傳回目前實體掃描行的數目。 |
NtGdiDdLock | 鎖定表面記憶體的指定區域,並提供與表面相關聯之內存區塊的有效指標。 |
NtGdiDdLockD3D | 用來鎖定緩衝區內存的指定區域,並提供與緩衝區相關聯之內存區塊的有效指標。 |
NtGdiDdQueryDirectDrawObject | 查詢先前建立的 DirectDraw 物件核心模式表示,以取得其功能。 |
NtGdiDdQueryMoCompStatus | 查詢最近轉譯作業的狀態至指定的表面。 |
NtGdiDdReenableDirectDrawObject | 在模式切換之後,重新啟用 DirectDraw 核心模式裝置物件。 |
NtGdiDdReleaseDC | 釋放先前為指示的核心模式 DirectDraw 介面物件建立的DC。 |
NtGdiDdRenderMoComp | 指定包含宏區塊的介面、宏區塊存在之每個表面的位移,以及要轉譯之宏區塊數據的大小,告訴驅動程式要轉譯哪些宏區塊。 |
NtGdiDdResetVisrgn | 用來讓使用者模式能夠有效瞭解桌面上視窗的裁剪區域。 此裁剪可以從使用者模式線程的觀點異步變更。 |
NtGdiDdSetColorKey | 設定指定介面的色彩索引鍵值。 |
NtGdiDdSetExclusiveMode | 當 DirectDraw 應用程式切換至獨佔模式或從獨佔模式切換時,通知驅動程式。 |
NtGdiDdSetGammaRamp | 設定裝置的伽瑪坡道。 |
NtGdiDdSetOverlayPosition | 設定重疊的位置。 |
NtGdiDdUnattachSurface | 拿掉使用 NtGdiDdAttachSurface 在兩個內核模式介面物件之間建立的附件。 |
NtGdiDdUnlock | 釋放指定介面上保留的鎖定。 |
NtGdiDdUnlockD3D | 用來釋放在緩衝區內存指定區域上保留的鎖定。 |
NtGdiDdUpdateOverlay | 重新定位或修改重疊表面的視覺屬性。 |
NtGdiDdWaitForVerticalBlank | 傳回裝置的垂直空白狀態。 |
相關主題