グラフィックス低レベル クライアントのサポート

[これらの関数は、オペレーティング システムのリビジョンごとに変更される可能性があります。 代わりに、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 における理想的な呼び出しメカニズムです。 カーネル モードへの移行を行うメカニズムは、テーブルの順序に依存しています。 この順序は、オペレーティング システムのリビジョンごとに変わります。 そのため、Windows 2000 の W2KUMODE.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);

ポータブル アプリケーションの記述

オペレーティング システム間でアプリケーションを移植可能にするには、いくつかの手法を使用できます。 最も堅牢な方法は、独自のアプリケーションのインストール プロセスの一環として、Microsoft DirectX 8.x 再頒布可能パッケージを Windows 2000 にインストールする方法です。 これにより、D3D8THK.DLL が Windows 2000 システムで使用可能になることが保証されます。上記の Windows XP で説明したのと同じ手法を使用できるため、アプリケーションで単一コード パスを使用可能になります。

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

デバイスの作成

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

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

カーネル オブジェクト

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

関数

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

トピック 内容
DdAttachSurface DdAttachSurface 関数は、2 つのカーネル モードのサーフェス表現をアタッチします。
DdCreateDIBSection カラー テーブルをデバイスと共有する DIBSECTION 構造を作成します。
GdiEntry9 は、この関数のエイリアスとして定義されます。
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 関数は、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 構造の dwCaps メンバーを DDSCAPS_EXECUTEBUFFER に設定して作成された、以前に割り当てられたカーネル モードの 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 2 つのカーネル モードのサーフェス オブジェクト間で、NtGdiDdAttachSurface で作成された添付ファイルを削除します。
NtGdiDdUnlock 指定されたサーフェスに保持されているロックを解除します。
NtGdiDdUnlockD3D バッファー メモリの指定された領域に保持されているロックを解放するために使用されます。
NtGdiDdUpdateOverlay オーバーレイ サーフェスのビジュアル属性を位置変更または修正します。
NtGdiDdWaitForVerticalBlank デバイスの垂直方向の空のステータスを返します。

 

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

ディスプレイの概要