グラフィックス Low-Level クライアントのサポート

[これらの機能は、オペレーティング システムのリビジョンごとに変更される可能性があります。 代わりに、Microsoft DirectDraw と Microsoft Direct3DAPI を使用します。これらの API は、このようなオペレーティング システムの変更からアプリケーションを保護し、ディスプレイ ドライバーとの直接対話に関連する他の多くの困難を隠します。 詳細については、「 表示の概要」を参照してください。

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 に依存するアプリケーションをビルドすることはお勧めしません。lib for Windows 2000,000 Windows,000,000,000,000,000,000,000,000,000,000,000,000,00 オペレーティング システムの移植性を作成するためのメカニズムについては、次のセクションで説明します。

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 システムで使用できるようになり、アプリケーションで 1 つのコード パスが許可されます。これは、上記の Windows XP で説明したのと同じ手法を使用できるためです。

アプリケーションでは、独自の絶縁 DLL を構築し、上記の手法を使用して 2000 Windows 2000 用と D3D8THK.DLL を使用する Windows XP 用の 2 つのバージョンを実装することもできます。

デバイスの作成

DirectDraw と Direct3D は、まず、ドライバー オブジェクトのカーネルの抽象化のインスタンスを作成する必要があります。 Gdi32.dllとDdraw.dllでは、 これは DdCreateDirectDrawObjectDdQueryDirectDrawObjectDdReenableDirectDrawObject を呼び出すことによって実現されます。 Direct3D 8。x、これは NtGdiDdCreateDirectDrawObjectNtGdiDdQueryDirectDrawObjectおよび NtGdiDdReenableDirectDrawObject を呼び出すことによって実現されます。 GdiEntry* エントリ ポイントは、カーネル モード エントリ ポイントのマーシャラーにすぎません。

これらの関数を呼び出すと、DirectDraw デバイスのカーネル オブジェクトの抽象化を表すハンドルが返されます。 このカーネル オブジェクトは、ディスプレイ ドライバーが所有するドライバー インスタンスを表します。 このハンドルは、 DdCreateSurfaceObject (または Direct3D 8 の NtGdiDdCreateSurfaceObject ) などの後続の呼び出しで使用できます。x) を使用して、さらにオブジェクトをビルドします。

カーネル オブジェクト

いくつかのエントリ ポイントは、特定のオブジェクトのカーネル モード表現を管理するために使用されます。 DdCreateSurfaceObject (または Direct3D 8 の NtGdiDdCreateSurfaceObjectx) が適切な例です。 このエントリ ポイントは、システム メモリの一部を表すカーネル モード オブジェクトを作成します。 エントリ ポイントはハンドルを返し、このハンドルは後続の描画呼び出しで使用できます。 カーネルは、これらのハンドルから独自の構造体へのポインターを派生させ、そのポインターをディスプレイ ドライバーに渡し、操作を実行します。

関数

次の表は、カーネル モードのエントリ ポイントを表す関数と、これらのエントリ ポイントをラップするGdi32.dllのユーザー モード ヘルパー ルーチンの一覧です。

トピック 内容
DdAttachSurface DdAttachSurface 関数は、2 つのカーネル モードサーフェス表現をアタッチします。
DdCreateDIBSection デバイスとカラー テーブルを共有する DIBSECTION 構造体を作成します。
GdiEntry9 は、この関数のエイリアスとして#definedされます。
DdCreateDirectDrawObject NtGdiDdCreateDirectDrawObject 関数のラッパーで、DirectDraw オブジェクトのカーネル側表現を作成します。 この表現のハンドルは pDirectDrawGlobal-hDD> に格納されます。
GdiEntry1 は、この関数のエイリアスとして定義されます。
DdCreateSurfaceObject NtGdiDdCreateSurfaceObject 関数のラッパーで、カーネル モードの Surface オブジェクトを作成します。
GdiEntry4 は、この関数のエイリアスとして定義されます。
DdDeleteDirectDrawObject NtGdiDdDeleteDirectDrawObject 関数のラッパーと、DdCreateDirectDrawObject を使用して以前に作成されたカーネル モードの DirectDraw オブジェクトを削除します。
GdiEntry3 は、この関数のエイリアスとして定義されます。
DdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject 関数のラッパーで、以前に NtGdiDdCreateSurfaceObject によって作成されたカーネル モード の Surface オブジェクトを削除します。
GdiEntry5 は、この関数のエイリアスとして定義されます。
DdGetDC NtGdiDdGetDC 関数のラッパーで、示されている DirectDraw サーフェイスを表すWindowsグラフィックス デバイス インターフェイス (GDI) デバイス コンテキスト (DC) を返します。
GdiEntry7 は、この関数の別名として定義されます。
DdGetDxHandle DdGetDxHandle は、DirectX API メカニズムを制御するカーネル モード エントリ ポイントへの後続の呼び出しで使用するカーネル モードの Microsoft DirectX API ハンドルを返します。
DdQueryDirectDrawObject NtGdiDdQueryDirectDrawObject 関数のラッパーで、以前に作成したカーネル モード表現に対して機能のクエリを実行します。
GdiEntry2 は、この関数のエイリアスとして定義されます。
DdQueryDisplaySettingsUniqueness デスクトップ スイッチ、高速ユーザー スイッチ、全画面表示の Microsoft MS-DOS ボックスなど、モード スイッチが発生するたびにインクリメントされる整数の現在の値を返します。 アプリケーションはこの関数を繰り返し呼び出し、戻り値の古い値と新しい値を比較して、表示設定が変更されているかどうかを判断できます。
GdiEntry13 は、この関数のエイリアスとして定義されます。
DdReenableDirectDrawObject NtGdiDdReenableDirectDrawObject 関数のラッパー。 True モード スイッチ、全画面表示 MS-DOS ボックスの外観、ディスプレイ ドライバーの変更など、モード 切り替えスタイルのイベントの後に DirectDraw ドライバー インスタンスを再び有効にします。
GdiEntry10 は、この関数のエイリアスとして定義されます。
DdReleaseDC NtGdiDdReleaseDC 関数のラッパーで、DdGetDC または GdiEntry7 で以前に取得した DC を解放します。
GdiEntry8 は、この関数のエイリアスとして定義されます。
DdResetVisrgn NtGdiDdResetVisrgn 関数のラッパーであり、デスクトップ上のウィンドウのクリッピング領域に関するタイムリーなユーザー モード情報を有効にします。
GdiEntry6 は、この関数のエイリアスとして定義されます。
DdSetGammaRamp DdSetGammaRamp 関数は、デバイスのガンマ ランプを設定します。
DdSwapTextureHandles Microsoft DirectDraw 7.0 より前のデバイス ドライバー インターフェイス (DDI) 用に開発されており、Microsoft Windows NT システムでは何も行いません。 すべてのパラメーターは無視されます。
GdiEntry16 は、この関数のエイリアスとして定義されます。
DdUnattachSurface DdUnattachSurface 関数は、2 つのカーネル モード サーフェス オブジェクトの間に DdAttachSurface で作成された添付ファイルを削除します。
NtGdiD3DContextCreate コンテキストを作成します。
NtGdiD3DContextDestroy 指定したコンテキストを削除します。
NtGdiD3DContextDestroyAll ドライバーマネージド メモリ ヒープ内の空きメモリの量を照会します。
NtGdiD3DDrawPrimitives2 プリミティブをレンダリングし、更新されたレンダリング状態を返します。
NtGdiD3DGetDriverState DirectDraw ランタイムと Direct3D ランタイムの両方で、ドライバーから現在の状態に関する情報を取得するために使用されます。
NtGdiD3DValidateTextureStageState ハードウェアが現在の状態で指定されたブレンド操作を実行できるパスの数を返します。
NtGdiDdAddAlphaBlt 実装されていません。
NtGdiDdAddAttachedSurface サーフェスを別のサーフェスにアタッチします。
NtGdiDdAttachSurface 2 つのカーネル モードサーフェス表現をアタッチします。
NtGdiDdBeginMoCompFrame 新しいフレームのデコードを開始します。
NtGdiDdBlt ビット ブロック転送を実行します。
NtGdiDdCanCreateD3DBuffer ドライバーが、指定した説明のドライバー レベルのコマンドまたは頂点バッファーを作成できるかどうかを決定します。
NtGdiDdCanCreateSurface ドライバーが指定したサーフェスの説明のサーフェスを作成できるかどうかを示します。
NtGdiDdColorControl オーバーレイ サーフェスの輝度と明るさのコントロールを制御します。
NtGdiDdCreateD3DBuffer 指定した説明のドライバー レベルのコマンドまたは頂点バッファーを作成するために使用します。
NtGdiDdCreateDirectDrawObject DirectDraw オブジェクトのカーネル側表現を作成します。
NtGdiDdCreateMoComp ソフトウェア デコーダーが指定された GUID でモーション補正の使用を開始することをドライバーに通知します。
NtGdiDdCreateSurface サーフェスを別のサーフェスにアタッチします。
NtGdiDdCreateSurfaceEx DirectDraw サーフェスから Direct3D サーフェスを作成し、要求されたハンドル値をそれに関連付けます。
NtGdiDdCreateSurfaceObject puSurfaceLocal によって参照されるユーザー モードサーフェスオブジェクトを表すカーネルモードサーフェスオブジェクトを作成します。
NtGdiDdDeleteDirectDrawObject 以前に作成したカーネル モード DirectDraw デバイス オブジェクトを破棄します。
NtGdiDdDeleteSurfaceObject NtGdiDdDeleteSurfaceObject は、以前に作成したカーネル モードサーフェイス オブジェクトを削除します。
NtGdiDdDestroyD3DBuffer DDSCAPS_EXECUTEBUFFERに設定された DDSCAPS 構造体の dwCaps メンバーで作成された、以前に割り当てられたカーネル モード DirectDraw サーフェス オブジェクトを破棄します。
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 を使用して作成された添付ファイルを、2 つのカーネル モードサーフェイス オブジェクトの間で削除します。
NtGdiDdUnlock 指定したサーフェスに保持されているロックを解放します。
NtGdiDdUnlockD3D バッファー メモリの指定された領域に保持されているロックを解放するために使用されます。
NtGdiDdUpdateOverlay オーバーレイ サーフェスの視覚的属性を再配置または変更します。
NtGdiDdWaitForVerticalBlank デバイスの垂直空の状態を返します。

 

コマンド バッファーと頂点バッファーの割り当て

ディスプレイの概要