DXGI_DDI_BASE_FUNCTIONS構造体 (dxgiddi.h)
DXGI_DDI_BASE_FUNCTIONS 構造体には、出力にレンダリングされたフレームの表示、ガンマの制御、全画面表示の切り替えの管理などの低レベルのタスクを実行するために、ユーザー モードディスプレイ ドライバーが実装できる関数が含まれています。
構文
typedef struct DXGI_DDI_BASE_FUNCTIONS {
HRESULT()(DXGI_DDI_ARG_PRESENT *) * pfnPresent;
HRESULT()(DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS *) * pfnGetGammaCaps;
HRESULT()(DXGI_DDI_ARG_SETDISPLAYMODE *) * pfnSetDisplayMode;
HRESULT()(DXGI_DDI_ARG_SETRESOURCEPRIORITY *) * pfnSetResourcePriority;
HRESULT()(DXGI_DDI_ARG_QUERYRESOURCERESIDENCY *) * pfnQueryResourceResidency;
HRESULT()(DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES *) * pfnRotateResourceIdentities;
HRESULT()(DXGI_DDI_ARG_BLT *) * pfnBlt;
} DXGI_DDI_BASE_FUNCTIONS;
メンバーズ
pfnPresent
PresentDXGI 関数へのポインター。アプリケーションがレンダリングを完了したことをユーザー モードのディスプレイ ドライバーに通知し、ドライバーが移動先画面に表示されるように要求します。
pPresentData パラメーターが指す DXGI_DDI_ARG_PRESENT 構造体の hDevice メンバーは、ドライバーの CreateDevice(D3D10) 関数が、D3D10DDIARG_CREATEDEVICE 構造体の hDrvDevice メンバーでランタイムに返されるのと同じハンドルです。 そのため、ドライバー ライターは、このハンドルの種類を慎重に定義する必要があります。 さらに、ドライバーは、CreateDevice(D3D10)への呼び出しを処理した DDI 実装に基づいて、PresentDXGI 関数のさまざまな実装を提供できます。 ランタイムでは、DDI 実装間でドライバー ハンドルが混在することはありません。 同様に、DXGI_DDI_ARG_PRESENT の hSurfaceToPresent および hDstResource メンバーは、ドライバーの CreateResource(D3D10) 関数の以前の呼び出しでドライバーがランタイムに返したドライバー定義のリソース ハンドルでもあります。
DXGI_DDI_ARG_PRESENT の pDXGIContext メンバーは、不透明な通信メカニズムです。 ランタイムは、この DXGI コンテキストをドライバーに渡します。 ドライバーは、pfnPresentCbDXGI 関数を呼び出すときに、DXGIDDICB_PRESENT 構造体の pDXGIContext メンバーに変更せずに、この DXGI コンテキストをコピーする必要があります。
ドライバーは、pfnRenderCb 関数を使用して、部分的に構築されたすべてのレンダー データ (コマンド バッファー) を送信する必要があります。 その後、ドライバーはリソース ハンドル パラメーターをカーネル ハンドルに変換し、pfnPresentCbDXGIをする呼び出しでこれらのカーネル ハンドルを使用する必要があります。
手記
ドライバーの PresentDXGI 関数がソース サーフェイスから sRGB 形式のコンテンツを非 sRGB 変換先サーフェイスにコピーする場合、ドライバーは sRGB コンテンツを変更せずにコピーする必要があります (つまり、ドライバーは sRGB から線形変換を実行しないでください)。
pPresentData
[in]宛先サーフェスに表示する方法を説明する DXGI_DDI_ARG_PRESENT 構造体へのポインター。
pfnGetGammaCaps
GetGammaCapsDXGI 関数はガンマ機能を取得します。
pGammaData
[in]ガンマ機能を含む DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS 構造体へのポインター。
pfnSetDisplayMode
ドライバーの SetDisplayModeDXGI 関数へのポインター。
pfnSetResourcePriority
SetResourcePriorityDXGI 関数は、リソースのメモリからの削除の優先順位を設定します。
Microsoft Direct3D ランタイム SetResourcePriorityDXGI を呼び出して、リソースの優先度レベルを設定します。 ユーザー モードディスプレイ ドライバーは、pPriorityData が指すDXGI_DDI_ARG_SETRESOURCEPRIORITY構造体の hResource メンバーで提供されるリソース ハンドルを割り当てハンドル 変換する必要があります。 ドライバーがこの変換を行った後、ドライバーは、pfnSetPriorityCb 関数への呼び出しで結果のハンドルを渡す必要があります。
pPriorityData
[in]リソースを設定する優先度レベルを記述する DXGI_DDI_ARG_SETRESOURCEPRIORITY 構造体へのポインター。
pfnQueryResourceResidency
この関数は、指定されたリソースの一覧の所在地を決定します。
Microsoft Direct3D ランタイムは、ユーザー モード ディスプレイ ドライバーの QueryResourceResidencyDXGI 関数を呼び出して、システムがリソースに GPU アクセス可能にする必要がある場合に、オペレーティング システムが描画時に大幅なストールを発生させるかどうかを判断します。 QueryResourceResidencyDXGI から返される情報は、アプリケーションがリソースを使用する前にリソースが降格される可能性があるため、リソースの所在地の近似値です。
QueryResourceResidencyDXGI 、pfnQueryResidencyCb 関数を呼び出す必要があります。 pfnQueryResidencyCb は、D3DDDICB_QUERYRESIDENCY 構造体の pResidencyStatus メンバーによって指定された配列の要素内のリソースの常駐状態を返します。 pfnQueryResidencyCb が任意のクエリのD3DDDI_RESIDENCYSTATUS_NOTRESIDENTを返す場合、queryResourceResidencyDXGI はS_NOT_RESIDENTを返す必要があります。 pfnQueryResidencyCb がクエリのD3DDDI_RESIDENCYSTATUS_RESIDENTINSHAREDMEMORYを返し、クエリのD3DDDI_RESIDENCYSTATUS_NOTRESIDENTを返さない場合は、queryResourceResidencyDXGI S_RESIDENT_IN_SHARED_MEMORYを返す必要があります。 queryResourceResidencyDXGI 、すべてのクエリに対して pfnQueryResidencyCb を するすべての呼び出しがD3DDDI_RESIDENCYSTATUS_RESIDENTINGPUMEMORYを返す場合にのみ、S_OKを返す必要があります。
QueryResourceResidencyDXGIの呼び出しを通じてランタイムがクエリを実行する各リソースについて、ユーザー モードディスプレイ ドライバーは、pfnQueryResidencyCbの呼び出しを介してクエリを実行するリソースに属する割り当てを決定必要があります。 1 つの割り当てを所有するリソースの場合、決定は単純であり、ドライバーはその割り当てを照会します。 ただし、リソースが複数の割り当てを所有している場合、決定はより困難になります。 ドライバーは、アプリケーションがレンダリングに使用する可能性が高い割り当てを決定する必要があり、ドライバーはそれらの割り当てにのみクエリを実行する必要があります。 たとえば、リソースがレンダリングに使用される割り当てと、ロック操作を処理するスクラッチ割り当てを所有している場合、ドライバーは最初の割り当ての常駐についてのみクエリを実行する必要があります。これは、アプリケーションがレンダリングに 2 番目の割り当てを使用しない可能性が高いためです。
手記
ランタイムはシステム メモリ リソースの常駐クエリをサポートしていないため、ランタイムは常にシステム メモリ リソースの常駐状態に関するアプリケーションからの要求を失敗させ、これらのシステム メモリ リソースに対してユーザー モード ディスプレイ ドライバーの QueryResourceResidencyDXGI 関数を呼び出すことはありません。
pResidencyData
[in]常駐が検証されるリソースの一覧を記述する DXGI_DDI_ARG_QUERYRESOURCERESIDENCY 構造体へのポインター。
pfnRotateResourceIdentities
リソースの一覧をローテーションします。
RotateResourceIdentitiesDXGI 関数は、pRotateData パラメーターが指す DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES 構造体のメンバー pResources で渡されるリソースの配列の ID を交換する必要があります。 たとえば、リソースの配列がリソース X、Y、Z を参照している場合、配列インデックスの順序を増やすと、RotateResourceIdentitiesDXGI 、配列インデックスの順序を増やして、Y、Z、X を参照するようにそれらのハンドルを回転させる必要があります。 特に、ユーザー モードのディスプレイ ドライバーは、対応するリソースのカーネル ハンドルを交換する必要があります。 ただし、ドライバーは、対応するランタイム (RT) ハンドルを交換しないでください。 ランタイムは、RotateResourceIdentitiesDXGI を呼び出して、プレゼンテーション中にバッファーを回転させます。 そのため、RotateResourceIdentitiesDXGI の呼び出しは頻繁に行われません。 ランタイムは、ランタイムがドライバーの CreateResource(D3D10) 関数を呼び出して、リソースが回転操作に参加できることを示すときに、D3D10DDIARG_CREATERESOURCE 構造体の BindFlags メンバーにD3D10_DDI_BIND_PRESENT フラグを指定できます。
ユーザー モードのディスプレイ ドライバーは、ID の交換の他の側面も処理する必要があります。 たとえば、Direct3D バージョン 10 では、ビューはリソースを参照できます。このようなビューにはリソース アドレスを埋め込むことができます。 そのため、ドライバーは、このようなビューを再作成する必要があります。 また、ドライバーは、現在バインドされているビューを再適用する必要があります。
Windows 8 以降では、ドライバーはステレオ バック バッファーの回転をサポートする必要があります。
pRotateData
[in]回転するリソースの一覧を記述する DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES 構造体へのポインター。
pfnBlt
コピー元サーフェスのコンテンツをコピー先サーフェスにコピーし、コンテンツを回転できます。
Direct3D ランタイムは、pBltData パラメーターが指す DXGI_DDI_ARG_BLT 構造体の Flags メンバーを設定して、複数サンプリングされたリソースを解決するビット ブロック転送 (bitblt) 操作を実行する BltDXGI 関数を要求し、色形式の変換を実行する場合があります。 一度にストレッチまたは縮小を実行します。 ただし、Direct3D ランタイムでは、DXGI_DDI_ARG_BLT の Flags メンバーを 0 に設定する (つまり、フラグが設定されていない) ことはありません。また、Rotate メンバーの DXGI_DDI_ARG_BLT で設定された DXGI_DDI_MODE_ROTATION_IDENTITY 値 (つまり、回転がないことを示す) を使用して、メモリの直接コピー操作を実行します。 代わりに、両方のリソースが複数サンプリングされない限り、Direct3D ランタイムはドライバーの ResourceCopy または ResourceCopyRegion 関数を呼び出して、メモリの直接コピー操作を実行します。
ユーザー モードのディスプレイ ドライバーが実行するストレッチまたは縮小の品質は、バイリニア フィルターが実行するストレッチまたは縮小と同じにする必要があります。
Direct3D ランタイムは、ドライバーの BltDXGI 関数を頻繁に呼び出しません。 つまり、ランタイムは主にプレゼンテーション をサポートするために BltDXGI 使用するため、BltDXGI をフレームごとに 1 回または 2 回以上呼び出す必要があります。
ランタイムがプレゼンテーション BltDXGI を呼び出すと、ランタイムは DXGI_DDI_ARG_BLTの Flags メンバーに Present ビット フィールド フラグを設定します。 ランタイムは Present ビット フィールド フラグを設定して、ビットブレットの追加要件があり、追加の同期が必要になる可能性があることをドライバーに通知します (たとえば、ランタイムは、ディスプレイの個別の部分を処理する 2 つのグラフィックス アダプターを含むコンピューター構成で追加の同期を実行する必要がある場合があります)。 Present ビット フィールド フラグが設定されている場合、ドライバーは、アプリケーションのバック バッファーから DWM の共有サーフェイスへのコピー操作を実行する必要があります。 この種類のコピー操作の同期は不正確であるため、成果物の破棄は、ユーザーが経験する最悪の種類の成果物である必要があります。 この種類のコピー操作の場合、ドライバーは、最初に変換先のサーフェスに解決し、次に結果をインプレースで色変換することで、マルチパス アプローチを使用しないでください。これは、発生する可能性のあるアーティファクトが大幅に悪化するためです。
ドライバーがプライマリ サーフェスの作成中に DXGI_DDI_ERR_UNSUPPORTED を返す (つまり、CreateResource(D3D10)D3D10_DDI_BIND_PRESENT 関数への呼び出しから DXGI_DDI_ERR_UNSUPPORTED を返す) 場合は、BindFlags メンバーに D3D10DDIARG_CREATERESOURCE の pPrimaryDesc メンバーが設定 D3D10DDIARG_CREATERESOURCEが NULL 以外の場合)、ドライバーはコピー操作中のローテーションもサポートする必要があります。 ドライバーが CreateResource(D3D10) 関数の呼び出しから DXGI_DDI_ERR_UNSUPPORTED を返さない場合、ランタイムは DXGI_DDI_MODE_ROTATION_ROTATE90、DXGI_DDI_MODE_ROTATION_ROTATE180、または DXGI_DDI_ARG_BLTの Rotate メンバーに値を DXGI_DDI_MODE_ROTATION_ROTATE270 しません。 そのため、このような状況では、ドライバーの BltDXGI 関数は回転をサポートする必要はありません。
ランタイムは、DXGI_DDI_ARG_BLT の Rotate メンバーの値を設定して、ドライバーがコンテンツをコピー先にコピーする前に、ソースの内容を反時計回りに回転させる度数を示します。 回転は 90 度単位で指定します。
手記
ドライバーの BltDXGI 関数がソース サーフェイスから sRGB 形式のコンテンツを非 sRGB 変換先サーフェイスにコピーする場合、ドライバーは sRGB コンテンツを変更せずにコピーする必要があります (つまり、ドライバーは sRGB から線形変換を実行しないでください)。
ソースの制限
BltDXGI 関数は、常にソース サブリソース全体 (一部のサブ四角形領域に対して) を使用してビットblt 操作を実行します。 さらに、ソースは D3D10DDIRESOURCE_TEXTURE2D 表現です (ユーザー モード ディスプレイ ドライバーの CreateResource(D3D10) 関数の呼び出しでソースが作成されるときに、D3D10DDIARG_CREATERESOURCE の ResourceDimension メンバーで指定されます)。 ランタイムが DXGI_DDI_ARG_BLTの Flags メンバーの Resolve ビットフィールドを設定すると、ソースはマルチサンプリング リソースになります。 ソース リソースは、BindFlagsD3D10DDIARG_CREATERESOURCEメンバーで D3D10_DDI_BIND_PRESENT フラグが設定されたリソースに制限されます。 ソースの形式 (D3D10DDIARG_CREATERESOURCEの Format メンバーで指定) は、DXGI_FORMAT 列挙体の次の値で指定された表示モード形式に制限されます。
- DXGI_FORMAT_B5G6R5_UNORM
- DXGI_FORMAT_B5G5R5A1_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM (下記の注を参照)。
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
手記
ドライバーがソース形式の DXGI_FORMAT_B8G8R8A8_UNORMをサポートしている場合は、次の制限が適用されます。
- ドライバーは、浮動小数点形式から整数形式 (BGRA8888など) にビットblt 操作を実行する場合、結果にガンマを暗黙的にエンコードする必要があります。
- 逆に、ドライバーが整数形式から浮動小数点形式へのビット演算を実行する場合、結果からガンマ エンコードを暗黙的に削除する必要があります。
宛先の制限
変換先は、D3D10DDIRESOURCE_TEXTURE2D 表現でもあります。 変換先の形式も表示モード形式に制限されます。 ターゲット リソースは、レンダー ターゲットとしてバインドされているリソースに制限されます (BindFlagsD3D10DDIARG_CREATERESOURCE または D3D11DDIARG_CREATERESOURCEのメンバーで設定D3D10_DDI_BIND_RENDER_TARGET)。
ステレオ バック バッファーの作成
Windows 8 以降では、ドライバーがステレオ バック バッファーを作成する必要がある場合は、CreateResource(D3D10) または CreateResource(D3D11) 関数の pCreateResource パラメーターによって指される、D3D10DDIARG_CREATERESOURCE または D3D11DDIARG_CREATERESOURCE 構造体のメンバーをそれぞれ設定する必要があります。 次のように:
- ArraySize メンバーの値を 2 に設定します。
- BindFlags メンバーに D3D10_DDI_BIND_PRESENT フラグ値を設定します。
さらに、ステレオ表示をサポートするには、BltDXGI 関数は、ソースリソースと転送先リソースの範囲内にある DXGI_DDI_ARG_BLT 構造のメンバー 、DstSubresource と SrcSubresource の値を許可する必要があります。
pBltData
[in]ビット ブロック転送 (bitblt) のパラメーターを記述する DXGI_DDI_ARG_BLT 構造体へのポインター。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows Vista |
ヘッダー | dxgiddi.h (D3d10umddi.h を含む) |
関連項目
BltDXGIの
GetGammaCapsDXGIをする
QueryResourceResidencyDXGIの
SetDisplayModeDXGIの
SetResourcePriorityDXGIの