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 |