Bagikan melalui


Fungsi D3DKMTCreateAllocation (d3dkmthk.h)

Fungsi D3DKMTCreateAllocation membuat atau menambahkan alokasi memori sistem atau video. Driver klien grafis mode pengguna harus memanggil D3DKMTCreateAllocation2 sebagai gantinya (lihat Keterangan).

Sintaks

NTSTATUS D3DKMTCreateAllocation(
  D3DKMT_CREATEALLOCATION *unnamedParam1
);

Parameter

unnamedParam1

[in, out] pData: Penunjuk ke struktur D3DKMT_CREATEALLOCATION yang berisi informasi untuk membuat alokasi.

Nilai kembali

D3DKMTCreateAllocation mengembalikan STATUS_SUCCESS jika operasi berhasil. Jika tidak, mungkin mengembalikan kode NTSTATUS seperti salah satu nilai berikut:

Menampilkan kode Deskripsi
STATUS_DEVICE_REMOVED Adaptor grafis dihentikan atau perangkat tampilan direset.
STATUS_INVALID_PARAMETER Parameter divalidasi dan ditentukan salah.
STATUS_NO_MEMORY Rutinitas ini tidak dapat diselesaikan karena memori sistem tidak mencukup.
STATUS_NO_VIDEO_MEMORY Rutinitas ini tidak dapat diselesaikan karena memori video yang tidak mencukup. Manajer memori video mencoba memvirtualisasi memori video. Namun, jika virtualisasi gagal (seperti ketika ruang alamat virtual habis), manajer memori mungkin mengembalikan kode kesalahan ini.

Keterangan

Driver klien grafis mode pengguna harus memanggil D3DKMTCreateAllocation2 sebagai gantinya. Salah satu alasannya adalah bahwa Subsistem Windows untuk Linux (WSL) tidak mendukung D3DKMTCreateAllocation(nf-d3dkmthk-d3dkmtcreateallocation2.md).

Mode pengguna (dalam hal ini, runtime D3D) memanggil D3DKMTCreateAllocation untuk membuat alokasi dan sumber daya. Alokasi dapat dikaitkan dengan sumber daya atau dapat berdiri sendiri.

Saat mode pengguna memanggil D3DKMTCreateAllocation, UMD menyediakan data driver pribadi yang menjelaskan alokasi. Dxgkrnl mengambil data driver pribadi ini dan meneruskannya ke KMD yang kemudian mengisi deskripsi setiap alokasi dengan cara yang dipahami oleh VidMm. Data UMD berisi informasi seperti jenis sumber daya (tekstur, swapchain, dll). KMD menerjemahkan data ini ke hal-hal seperti ukuran, penyelarasan, sekumpulan segmen memori yang dapat dialokasikan, preferensi untuk segmen ini, dan sebagainya.

D3DKMTCreateAllocation juga dapat dipanggil untuk menambahkan alokasi tambahan ke sumber daya kapan saja. Satu-satunya batasan adalah bahwa semua alokasi bersama harus dikaitkan dengan sumber daya dan alokasi tambahan tidak dapat ditambahkan ke sumber daya bersama yang ada.

Contoh

Membuat alokasi mandiri dalam memori video yang tidak terkait dengan sumber daya

Contoh kode berikut menunjukkan bagaimana D3DKMTCreateAllocation dapat digunakan untuk membuat alokasi mandiri dalam memori video yang tidak terkait dengan sumber daya.

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;
}

Membuat sumber daya dengan alokasi memori sistem tunggal

Contoh kode berikut menunjukkan bagaimana D3DKMTCreateAllocation dapat digunakan untuk membuat sumber daya dengan alokasi memori sistem tunggal.

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;
}

Membuat alokasi standar dengan ExistingSysMem

Contoh kode berikut menunjukkan argumen untuk diteruskan ke D3DKMTCreateAllocation untuk membuat alokasi standar dengan ExistingSysMem. Buffer memori sistem yang ada yang disediakan runtime ke kernel harus selaras dengan halaman dan kelipatan ukuran halaman; jika tidak, kernel gagal dalam panggilan.

    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);

Batasan argumen untuk D3DKMTCreateAllocation:

  • ExistingSysMem (atau ExistingSection) hanya didukung dengan StandardAllocation dan sebaliknya.
  • NumAllocations yang didukung adalah 1.
  • Hanya salah satu ExistingSysMem atau ExistingSection yang dapat diatur.
  • Saat membuat StandardAllocation, bendera CreateShared dan CrossAdapter harus selalu diatur.
  • ExistingSysMem (atau ExistingSection) tidak dapat dibuat terhadap sumber daya yang ada (D3DKMT_CREATALLOCATION::hResource).

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista
Target Platform Universal
Header d3dkmthk.h (termasuk D3dkmthk.h)
Pustaka Gdi32.lib
DLL Gdi32.dll

Lihat juga

D3DKMT_CREATEALLOCATION

D3DKMTCreateAllocation2