次の方法で共有


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

[これらの機能は、オペレーティング システムのリビジョンごとに変更される可能性があります。 代わりに、Microsoft DirectDraw と Microsoft Direct3DAPIs を使用します。これらの 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。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 で説明したのと同じ手法を使用できるため、アプリケーションで 1 つのコード パスを使用できるようになります。

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

デバイスの作成

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

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

カーネル オブジェクト

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

関数

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

話題 内容
DdAttachSurface DdAttachSurface 関数は、2 つのカーネル モードサーフェス表現をアタッチします。
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 グラフィックス デバイス インターフェイス (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 関数は、DdAttachSurfaceで作成された添付ファイルを、2 つのカーネル モードサーフェス オブジェクト間で削除します。
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 デバイスの垂直空の状態を返します。

 

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

表示 の概要