D3DKMTCreateAllocation-Funktion (d3dkmthk.h)
Die D3DKMTCreateAllocation Funktion erstellt oder fügt Zuordnungen des System- oder Videospeichers hinzu. Grafikclienttreiber im Benutzermodus sollten stattdessen D3DKMTCreateAllocation2 aufrufen (siehe Hinweise).
Syntax
NTSTATUS D3DKMTCreateAllocation(
D3DKMT_CREATEALLOCATION *unnamedParam1
);
Parameter
unnamedParam1
[in, out] pData-: Ein Zeiger auf eine D3DKMT_CREATEALLOCATION Struktur, die Informationen zum Erstellen von Zuordnungen enthält.
Rückgabewert
D3DKMTCreateAllocation gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls kann ein NTSTATUS- Code zurückgegeben werden, z. B. einen der folgenden Werte:
Rückgabecode | Beschreibung |
---|---|
STATUS_DEVICE_REMOVED | Der Grafikkarte wurde beendet, oder das Anzeigegerät wurde zurückgesetzt. |
STATUS_INVALID_PARAMETER | Parameter wurden überprüft und ermittelt, dass sie falsch sind. |
STATUS_NO_MEMORY | Diese Routine konnte aufgrund unzureichendem Systemspeicher nicht abgeschlossen werden. |
STATUS_NO_VIDEO_MEMORY | Diese Routine konnte aufgrund unzureichendem Videospeicher nicht abgeschlossen werden. Der Videospeicher-Manager versucht, den Videospeicher zu virtualisieren. Wenn die Virtualisierung jedoch fehlschlägt (z. B. wenn der virtuelle Adressraum ausläuft), gibt der Speicher-Manager möglicherweise diesen Fehlercode zurück. |
Bemerkungen
Grafikclienttreiber im Benutzermodus sollten stattdessen D3DKMTCreateAllocation2- aufrufen. Ein Grund dafür ist, dass das Windows-Subsystem für Linux (WSL) D3DKMTCreateAllocation(nf-d3dkmthk-d3dkmtcreateallocation2.md) nicht unterstützt.
Der Benutzermodus (in diesem Fall die D3D-Laufzeit) ruft D3DKMTCreateAllocation- auf, um Zuordnungen und Ressourcen zu erstellen. Eine Zuordnung kann einer Ressource zugeordnet werden, oder sie kann eigenständig sein.
Wenn der Benutzermodus D3DKMTCreateAllocationaufruft, stellt die UMD private Treiberdaten bereit, die die Zuordnung beschreiben. Dxgkrnl übernimmt diese privaten Treiberdaten und übergibt sie an die KMD, die dann eine Beschreibung der einzelnen Zuordnungen auf eine Weise ausfüllt, die von VidMmverstanden wird. Die UMD-Daten enthalten Informationen wie den Ressourcentyp (Textur, Swapchain usw.). Der KMD übersetzt diese Daten in Elemente wie Größe, Ausrichtung, eine Reihe von Speichersegmenten, die die Zuordnung befinden kann, Einstellungen für diese Segmente usw.
D3DKMTCreateAllocation kann auch aufgerufen werden, um jederzeit zusätzliche Zuordnungen zu einer Ressource hinzuzufügen. Die einzigen Einschränkungen sind, dass alle freigegebenen Zuordnungen einer Ressource zugeordnet werden müssen, und zusätzliche Zuordnungen können keiner vorhandenen freigegebenen Ressource hinzugefügt werden.
Beispiele
Erstellen einer eigenständigen Zuordnung im Videospeicher, die keiner Ressource zugeordnet ist
Im folgenden Codebeispiel wird veranschaulicht, wie D3DKMTCreateAllocation- verwendet werden kann, um eine eigenständige Zuordnung im Videospeicher zu erstellen, die keiner Ressource zugeordnet ist.
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;
}
Erstellen einer Ressource mit einer einzigen Systemspeicherzuweisung
Im folgenden Codebeispiel wird veranschaulicht, wie D3DKMTCreateAllocation- verwendet werden kann, um eine Ressource mit einer einzigen Systemspeicherzuweisung zu erstellen.
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;
}
Erstellen einer Standardzuordnung mit ExistingSysMem
Das folgende Codebeispiel zeigt die Argumente, die an D3DKMTCreateAllocation übergeben werden, um eine Standardzuordnung mit ExistingSysMemzu erstellen. Der vorhandene Systemspeicherpuffer, den die Laufzeit für den Kernel bereitstellt, muss seitenbündig ausgerichtet sein und ein Vielfaches der Seitengröße; andernfalls schlägt der Kernel den Aufruf fehl.
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);
Argumenteinschränkungen für D3DKMTCreateAllocation:
- ExistingSysMem (oder ExistingSection) wird nur mit StandardAllocation- unterstützt und umgekehrt.
- numAllocations unterstützt wird, ist 1.
- Es kann nur ein ExistingSysMem oder ExistingSection festgelegt werden.
- Beim Erstellen eines StandardAllocation-müssen die CreateShared- und CrossAdapter Flags immer festgelegt werden.
- ExistingSysMem (oder ExistingSection) kann nicht für eine vorhandene Ressource erstellt werden (D3DKMT_CREATALLOCATION::hResource).
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows Vista |
Zielplattform- | Universal |
Header- | d3dkmthk.h (einschließlich D3dkmthk.h) |
Library | Gdi32.lib |
DLL- | Gdi32.dll |