D3DKMTCreateAllocation-Funktion (d3dkmthk.h)
Die D3DKMTCreateAllocation-Funktion erstellt oder fügt Zuordnungen des System- oder Videospeichers hinzu. Benutzermodus-Grafikclienttreiber 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 wird möglicherweise ein NTSTATUS-Code zurückgegeben, z. B. einer der folgenden Werte:
Rückgabecode | Beschreibung |
---|---|
STATUS_DEVICE_REMOVED | Die Grafikkarte wurde angehalten, oder das Anzeigegerät wurde zurückgesetzt. |
STATUS_INVALID_PARAMETER | Die Parameter wurden überprüft und als falsch ermittelt. |
STATUS_NO_MEMORY | Diese Routine konnte aufgrund eines unzureichenden Systemspeichers nicht abgeschlossen werden. |
STATUS_NO_VIDEO_MEMORY | Diese Routine konnte aufgrund eines unzureichenden Videospeichers nicht abgeschlossen werden. Der Videospeicher-Manager versucht, den Videospeicher zu virtualisieren. Wenn die Virtualisierung jedoch fehlschlägt (z. B. wenn der virtuelle Adressraum nicht mehr verfügbar ist), gibt der Speicher-Manager möglicherweise diesen Fehlercode zurück. |
Hinweise
Benutzermodus-Grafikclienttreiber sollten stattdessen D3DKMTCreateAllocation2 aufrufen. Ein Grund dafür ist, dass Windows-Subsystem für Linux (WSL) D3DKMTCreateAllocation(nf-d3dkmthk-d3dkmtcreateallocation2.md) nicht unterstützt.
Der Benutzermodus (in diesem Fall die D3D-Runtime) 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 D3DKMTCreateAllocation aufruft, stellt UMD private Treiberdaten bereit, die die Zuordnung beschreiben. Dxgkrnl verwendet diese privaten Treiberdaten und übergibt sie an den KMD, der dann eine Beschreibung der einzelnen Zuordnungen auf eine weise ausfüllt, die von VidMm verstanden wird. Die UMD-Daten enthalten Informationen wie den Ressourcentyp (Textur, Swapchain usw.). Der KMD übersetzt diese Daten in Größen, Ausrichtung, eine Reihe von Speichersegmenten, die die Zuordnung finden kann, Einstellungen für diese Segmente usw.
D3DKMTCreateAllocation kann auch aufgerufen werden, um einer Ressource jederzeit zusätzliche Zuordnungen hinzuzufügen. Die einzigen Einschränkungen sind, dass alle freigegebenen Zuordnungen einer Ressource zugeordnet werden müssen und keine zusätzlichen Zuordnungen zu einer vorhandenen freigegebenen Ressource hinzugefügt werden können.
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 einzelnen Systemspeicherbelegung
Im folgenden Codebeispiel wird veranschaulicht, wie D3DKMTCreateAllocation verwendet werden kann, um eine Ressource mit einer einzelnen Systemspeicherbelegung 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 sollen, um eine Standardzuordnung mit ExistingSysMem zu erstellen. Der vorhandene Systemspeicherpuffer, den die Runtime für den Kernel bereitstellt, muss seitenbündig ausgerichtet sein und ein Vielfaches der Seitengröße aufweisen. 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 wird unterstützt: 1.
- Es kann nur eine von ExistingSysMem oder ExistingSection festgelegt werden.
- Beim Erstellen einer StandardAllocation müssen immer die Flags CreateShared und CrossAdapter festgelegt werden.
- ExistingSysMem (oder ExistingSection) kann nicht für eine vorhandene Ressource (D3DKMT_CREATALLOCATION::hResource) erstellt werden.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista |
Zielplattform | Universell |
Header | d3dkmthk.h (include D3dkmthk.h) |
Bibliothek | Gdi32.lib |
DLL | Gdi32.dll |