次の方法で共有


Direct3D バージョン 10 ランタイムおよびドライバー ハンドル

Direct3D バージョン 10 のランタイム ハンドルとドライバー ハンドルの有効期間は同じです。 Direct3D ランタイムは、create-type 関数 (例: CreateResource(D3D10)) の呼び出しから destroy-type 関数 (例: DestroyResource(D3D10)) の呼び出しまでの間の、オブジェクトの有効期間を指定します。 ランタイムは、ドライバー ハンドル値とランタイム ハンドル値を提供します。 これらのハンドルは、基本的に、操作対象のオブジェクトを識別するために厳密な型でラップされるポインターです。 リソースのランタイム ハンドルとドライバー ハンドルの例を以下に示します。

// Strongly typed handle to identify a resource object to the driver: 
typedef struct D3D10DDI_HRESOURCE
{
    void* pDrvPrivate; // Pointer to memory location as large as the driver requested.
} D3D10DDI_HRESOURCE;

// Strongly typed handle to identify a resource object to the runtime:
typedef struct D3D10DDI_HRTRESOURCE
{
    void* handle;
} D3D10DDI_HRTRESOURCE;

レンダリング デバイス オブジェクトとその子オブジェクトのすべてのドライバー ハンドルは、次の 2 パス作成メカニズムを経由します。

  1. ドライバー ハンドル ポインターの値を判別するために、ランタイムは最初に CalcPrivateObjTypeSize 関数 (例: CalcPrivateResourceSize 関数) を呼び出します。 この呼び出しでは、ランタイムは作成パラメーター (たとえば D3D10DDIARG_CREATERESOURCE 構造体へのポインター) を渡します。 ランタイムは、CreateObjType 関数の呼び出しで、作成パラメーターも渡します。

    ユーザー モード ディスプレイ ドライバーは通常、CalcPrivateObjTypeSize の呼び出し中に何も割り当てる必要はありません。 ただし、ドライバーが割り当てを実行して失敗した場合、または他の種類のエラー状態を示す必要がある場合、ドライバーは SIZE_T( -1 ) を返して、ハンドルの作成を防ぐことができます。 その後でランタイムは、呼び出し元のアプリケーションに E_OUTOFMEMORY エラー状態を返します。

    ドライバーは、CalcPrivateObjTypeSize の呼び出しから、最小限でも sizeof( void*) を返す必要があります。

  2. ユーザー モード ディスプレイ ドライバーで必要なサイズを満たすのに十分な領域をランタイムが割り当てることができる場合、同じ作成パラメーターを、ドライバー ハンドルの新しい一意の値と共に使用して、CreateObjType 関数 (例: CreateResource(D3D10)) を呼び出します。 ドライバー ハンドルのポインター値は、CalcPrivateObjTypeSize によって返されたサイズのメモリ領域をポイントしているため、ハンドルの有効期間の間、一意かつ一貫した値になります。 ユーザー モード ディスプレイ ドライバーは、必要に応じてメモリのこの領域を使用できます。 ドライバーは、ランタイムによって提供されるメモリの領域に、アクセス頻度の高いデータを配置することによって、効率の向上を得る必要があります。