次の方法で共有


D3DKMTCreateAllocation 関数 (d3dkmthk.h)

D3DKMTCreateAllocation 関数は、システムまたはビデオ メモリの割り当てを作成または追加します。 ユーザー モードのグラフィックス クライアント ドライバーでは、代わりに D3DKMTCreateAllocation2 を呼び出す必要があります (「解説」を参照)。

構文

NTSTATUS D3DKMTCreateAllocation(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

パラメーター

unnamedParam1

[入力、出力] pData: 割り当てを作成するための情報を含む D3DKMT_CREATEALLOCATION 構造体へのポインター。

戻り値

操作が成功した場合、D3DKMTCreateAllocation はSTATUS_SUCCESSを返します。 それ以外の場合は、次のいずれかの値などの NTSTATUS コードを返す場合があります。

リターン コード 説明
STATUS_DEVICE_REMOVED グラフィックス アダプターが停止したか、ディスプレイ デバイスがリセットされました。
STATUS_INVALID_PARAMETER パラメーターが検証され、正しくないと判断されました。
STATUS_NO_MEMORY システム メモリが不足しているため、このルーチンを完了できませんでした。
STATUS_NO_VIDEO_MEMORY ビデオ メモリが不足しているため、このルーチンを完了できませんでした。 ビデオ メモリ マネージャーは、ビデオ メモリの仮想化を試みます。 ただし、仮想化が失敗した場合 (仮想アドレス空間が不足した場合など)、メモリ マネージャーはこのエラー コードを返す可能性があります。

注釈

ユーザー モードのグラフィックス クライアント ドライバーでは、代わりに D3DKMTCreateAllocation2 を呼び出す必要があります。 その理由の 1 つは、Linux 用 Windows サブシステム (WSL) が D3DKMTCreateAllocation(nf-d3dkmthk-d3dkmtcreateallocation2.md) をサポートしていないためです。

ユーザー モード (この場合は D3D ランタイム) は 、D3DKMTCreateAllocation を呼び出して割り当てとリソースを作成します。 割り当ては、リソースに関連付けるか、スタンドアロンにすることができます。

ユーザー モードが D3DKMTCreateAllocation を呼び出すと、UMD は割り当てを説明するプライベート ドライバー データを提供します。 Dxgkrnl はこのプライベート ドライバー データを受け取り、それを KMD に渡し、 VidMm が理解する方法で各割り当ての説明を入力します。 UMD データには、リソースの種類 (テクスチャ、スワップチェーンなど) などの情報が含まれています。 KMD は、このデータをサイズ、アラインメント、割り当て可能なメモリ セグメントのセット、これらのセグメントの基本設定などに変換します。

D3DKMTCreateAllocation を呼び出して、いつでもリソースに割り当てを追加することもできます。 唯一の制限は、すべての共有割り当てをリソースに関連付ける必要があり、追加の割り当てを既存の共有リソースに追加できないことです。

リソースに関連付けられていないスタンドアロン割り当てをビデオ メモリに作成する

次のコード例では、 D3DKMTCreateAllocation を使用して、リソースに関連付けられていないスタンドアロン割り当てをビデオ メモリに作成する方法を示します。

D3DKMT_HANDLE CreateStandAloneAllocation(D3DKMT_HANDLE hDevice, VOID* pPrivateAllocationInfo, UINT Size)
{
    D3DKMT_CREATEALLOCATION CreateAllocation;
    D3DDDI_ALLOCATIONINFO AllocationInfo;

    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    CreateAllocation.hDevice = hDevice;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo = &AllocationInfo;

    AllocationInfo.hAllocation = NULL;
    AllocationInfo.pSystemMem = NULL;  // Vidmem allocation
    AllocationInfo.pPrivateDriverData = pPrivateAllocationInfo;  // Contains format, size, and so on.
    AllocationInfo.PrivateDriverDataSize = Size;

    if (NT_SUCCESS((*pfnKTCreateAllocation)(&CreateAllocation))) {
        return AllocationInfo.hAllocation;
    }
    return 0;
}

1 つのシステム メモリ割り当てでリソースを作成する

次のコード例では、 D3DKMTCreateAllocation を使用して、単一のシステム メモリ割り当てでリソースを作成する方法を示します。

HRESULT CreateSysmemResource(D3DKMT_HANDLE hDevice, 
                             UINT AllocationSize, 
                             VOID* pResourceData, 
                             UINT ResourceDataSize,
                             VOID* pAllocationData, 
                             UINT AllocationDataSize,
                             D3DKMT_HANDLE* phResource,
                             D3DKMT_HANDLE* phAllocation)
{
    D3DKMT_CREATEALLOCATION CreateAllocation;
    D3DDDI_ALLOCATIONINFO AllocationInfo;
    VOID* pSysMem;

    *phResource = NULL;
    *phAllocation = NULL;

    // For a sysmem allocation, preallocate the memory.
    pSysMem = MemAlloc(AllocationSize);
    if (pSysMem == NULL) {
        return E_OUTOFMEMORY;
    }
 
    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    CreateAllocation.hDevice = hDevice;
    CreateAllocation.Flags.CreateResource = TRUE;
    CreateAllocation.pPrivateDriverData = pResourceData;
    CreateAllocation.PrivateDriverDataSize = ResourceDataSize;
    CreateAllocation.NumAllocations = 1;
    CreateAllocation.pAllocationInfo = &AllocationInfo;

    AllocationInfo.hAllocation = NULL;
    AllocationInfo.pSystemMem = pSysMem;
    AllocationInfo.pPrivateDriverData = pAllocationData;
    AllocationInfo.PrivateDriverDataSize = AllocationDataSize;

    if (NT_SUCCESS((*pfnKTCreateAllocation)(&CreateAllocation))) {
        *phResource = CreateAllocation.hResource;
        *phAllocation = AllocationInfo.hAllocation;
        return S_OK;
    }
    MemFree(pSysMem);
    return E_FAIL;
}

ExistingSysMem を使用した標準割り当ての作成

次のコード例は、ExistingSysMem を使用して標準割り当てを作成するために D3DKMTCreateAllocation に渡す引数を示しています。 ランタイムがカーネルに提供する既存のシステム メモリ バッファーは、ページアラインとページ サイズの倍数である必要があります。それ以外の場合、カーネルは呼び出しに失敗します。

    UINT PrivateDriverDataEstimate = 2048;

    D3DDDI_ALLOCATIONINFO2 AllocInfo = {};
    AllocInfo.pSystemMem = SomeValidPageAlignedSysMem;
    AllocInfo.VidPnSourceId = SomeVidPnSourceId;

    D3DKMDT_CREATESTANDARDALLOCATION StandardAlloc = {};
    StandardAlloc.Type = D3DKMT_STANDARDALLOCATIONTYPE_EXISTINGHEAP;
    StandardAlloc.ExistingHeapData.Size = SizeOfSystemMemBuffer; // Multiple of PAGE SIZE

    D3DKMT_CREATEALLOCATION CreateAlloc = {};
    CreateAlloc.hDevice = SomeDevice;
    CreateAlloc.NumAllocations = 1;
    CreateAlloc.pAllocationInfo2 = &AllocInfo;
    CreateAlloc.pStandardAllocation = &StandardAlloc;
    CreateAlloc.Flags.ExistingSysMem = TRUE;

    ntStatus = D3DKMTCreateAllocation(&CreateAlloc);

D3DKMTCreateAllocation の引数の制限事項:

  • ExistingSysMem (または ExistingSection) は StandardAllocation でのみサポートされ、その逆もサポートされます。
  • サポートされている NumAllocations は 1 です。
  • 設定できるのは、ExistingSysMem または ExistingSection のいずれか 1 つだけです。
  • StandardAllocation を作成するときは、CreateShared フラグと CrossAdapter フラグを常に設定する必要があります。
  • 既存のリソース (D3DKMT_CREATALLOCATION::hResource) に対して ExistingSysMem (または ExistingSection) を作成することはできません。

要件

要件
サポートされている最小のクライアント Windows Vista
対象プラットフォーム ユニバーサル
Header d3dkmthk.h (D3dkmthk.h を含む)
Library Gdi32.lib
[DLL] Gdi32.dll

こちらもご覧ください

D3DKMT_CREATEALLOCATION

D3DKMTCreateAllocation2