D3DKMTRender-Funktion (d3dkmthk.h)
Die D3DKMTRender-Funktion übermittelt den aktuellen Befehlspuffer an das Microsoft DirectX-Grafikkernsubsystem (Dxgkrnl.sys).
Syntax
NTSTATUS D3DKMTRender(
D3DKMT_RENDER *unnamedParam1
);
Parameter
unnamedParam1
pData [in, out]
Ein Zeiger auf eine D3DKMT_RENDER-Struktur , die Parameter zum Übermitteln des aktuellen Befehlspuffers an das Grafikkernsubsystem beschreibt.
Rückgabewert
D3DKMTRender gibt einen der folgenden Werte zurück:
Rückgabecode | Beschreibung |
---|---|
STATUS_SUCCESS | Der Befehlspuffer wurde erfolgreich übermittelt. |
STATUS_DEVICE_REMOVED | Die Grafikkarte wurde beendet, oder der Anzeigekontext wurde zurückgesetzt. |
STATUS_INVALID_PARAMETER | Die Parameter wurden überprüft und als falsch ermittelt. |
STATUS_NO_MEMORY | D3DKMTRender konnte aufgrund von unzureichendem Arbeitsspeicher nicht abgeschlossen werden. |
STATUS_INVALID_HANDLE | Die OpenGL ICD hat ein ungültiges Handle im Befehlspuffer erkannt. |
STATUS_PRIVILEGED_INSTRUCTION | D3DKMTRender hat nicht privilegierte Anweisungen erkannt (d. a. Anweisungen, die über die Berechtigungen des aktuellen CPU-Prozesses hinaus auf den Arbeitsspeicher zugreifen). |
Diese Funktion gibt möglicherweise auch andere NTSTATUS-Werte zurück.
Hinweise
Ein Befehlspuffer enthält in der Regel viele Grafikbefehle.
Wenn D3DKMTRenderSTATUS_GRAPHICS_ALLOCATION_INVALID zurückgibt, sollte die OpenGL ICD das primäre Handle erneut öffnen oder neu erstellen, alle Verweise im Befehlspuffer auf das vorherige Handle durch das neue Handle ersetzen und dann D3DKMTRender erneut aufrufen, um den Puffer erneut zu übermitteln.
Nach einem Aufruf von D3DKMTRender sollte der OpenGL ICD die Basisadresse und größe des Befehlspuffers bestimmen, den es für seine nächste Übermittlung verwenden soll, anhand der Werte, die in den pCommandBuffer - und CommandBufferSize-Membern der D3DKMT_RENDER Struktur zurückgegeben werden, auf die der pData-Parameter verweist.
Für ein Gerät, das den garantierten DMA-Puffervertragsmodus verwendet (weitere Informationen zu diesem Modus finden Sie unter Verwenden des DMA-Puffermodells für garantierte Verträge) entspricht die Größe des DMA-Puffers, der dem Anzeige-Miniporttreiber zur Übersetzung des Befehlspuffers bei der nächsten Übermittlung zur Verfügung steht. Für ein solches Gerät sollte der OpenGL ICD auch die Größe der Zuordnungsliste bestimmen, die dem Anzeige-Miniporttreiber während der Übersetzung des Befehlspuffers bei der nächsten Übermittlung von dem Wert entspricht, der im AllocationListSize-Element von D3DKMT_RENDER zurückgegeben wird.
Für Geräte, die keinen garantierten DMA-Puffervertrag verwenden, kann der OpenGL ICD die Informationen verwenden, die in den Membern CommandBufferSize und AllocationListSize zurückgegeben werden, um die Größe des nächsten DMA-Puffers und der Zuordnungsliste zu bestimmen, der für die Übersetzung verfügbar ist. Unter Bedingungen mit geringem Arbeitsspeicher ist der tatsächliche DMA-Puffer und die Zuordnungsliste, die für den Anzeigeminiporttreiber bereitgestellt wird, möglicherweise kleiner als erforderlich.
Wenn die OpenGL ICD erkennt, dass die meisten Befehlspufferleerungen darauf zurückzuführen sind, dass dem Treiber in der Befehlspuffer- oder Zuordnungsliste nicht mehr platzt, kann der Treiber eine Größenänderung anfordern. Um die Größe des Befehlspuffers zu ändern, legt der Treiber das Bitfeldflag ResizeCommandBuffer im Flags-Element von D3DKMT_RENDER fest und legt die angeforderte Größe in das CommandBufferSize-Element von D3DKMT_RENDER. Ähnlich legt der Treiber zum Ändern der Größe der Zuordnungsliste das Bitfeldflag ResizeAllocationList im Flags-Element von D3DKMT_RENDER fest und legt die angeforderte Anzahl von Elementen im AllocationListSize-Element von D3DKMT_RENDER.
Hinweis
Obwohl der Treiber die Größenänderung sowohl des Befehlspuffers als auch der Zuordnungsliste anfordern kann, ist der Videospeicher-Manager möglicherweise nicht in der Lage, dies zu erfüllen. Wenn der Aufruf von D3DKMTRender erfolgreich ist, sollte der Treiber daher die Werte überprüfen, die in den Membern pCommandBuffer, CommandBufferSize und AllocationListSize zurückgegeben werden.
Wenn der Aufruf von D3DKMTRender jedoch fehlschlägt , bestimmt der Treiber, dass die Größe des Befehlspuffers, die Zuordnungsliste oder beide nicht geändert wurden. Daher sollte der Treiber die Werte, die in den Membern pCommandBuffer, CommandBufferSize und AllocationListSize zurückgegeben werden, nicht verarbeiten, da sie ungültig sind.
Beispiele
Im folgenden Codebeispiel wird veranschaulicht, wie ein OpenGL ICD D3DKMTRender verwenden kann, um 3D-Grundtypen zu rendern.
HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
D3DKMT_RENDER RenderData;
memset(&RenderData, 0, sizeof(RenderData));
RenderData.hDevice = hDevice;
RenderData.CommandOffset = CommandOffset;
RenderData.CommandLength = CommandLength;
if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
return S_OK;
}
return E_FAIL;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows Vista |
Zielplattform | Universell |
Header | d3dkmthk.h (include D3dkmthk.h) |
Bibliothek | Gdi32.lib |
DLL | Gdi32.dll |