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

Weitere Informationen

D3DKMTGetDeviceState

D3DKMT_RENDER