Freigeben über


D3DKMTRender-Funktion (d3dkmthk.h)

Die D3DKMTRender-Funktion sendet den aktuellen Befehlspuffer an das Microsoft DirectX-Grafik-Kernelsubsystem (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 Grafik-Kernel-Subsystem beschreibt.

Rückgabewert

D3DKMTRender gibt einen der folgenden Werte zurück:

Rückgabecode Beschreibung
STATUS_SUCCESS Der Befehlspuffer wurde erfolgreich übermittelt.
STATUS_DEVICE_REMOVED Der Grafikadapter wurde beendet, oder der Anzeigekontext wurde zurückgesetzt.
STATUS_INVALID_PARAMETER Parameter wurden überprüft und ermittelt, dass sie falsch sind.
STATUS_NO_MEMORY D3DKMTRender konnte aufgrund unzureichenden Arbeitsspeichers nicht abgeschlossen werden.
STATUS_INVALID_HANDLE Das OpenGL ICD hat einen ungültigen Handle im Befehlspuffer erkannt.
STATUS_PRIVILEGED_INSTRUCTION D3DKMTRender nicht privilegierte Anweisungen erkannt (d. h. Anweisungen, die über die Berechtigungen des aktuellen CPU-Prozesses hinausgehen).

Diese Funktion kann auch andere NTSTATUS- Werte zurückgeben.

Bemerkungen

Ein Befehlspuffer enthält in der Regel viele Grafikbefehle.

Wenn D3DKMTRenderSTATUS_GRAPHICS_ALLOCATION_INVALIDzurückgibt, sollte das OpenGL ICD den primären Handle erneut öffnen oder neu erstellen, alle Verweise im Befehlspuffer durch das vorherige Handle durch den neuen Handle ersetzen und dann D3DKMTRender erneut aufrufen, um den Puffer erneut zu übermitteln.

Nach einem Aufruf von D3DKMTRendersollte die OpenGL ICD die Basisadresse und -größe des Befehlspuffers bestimmen, die für die nächste Übermittlung aus den Werten verwendet werden soll, die im pCommandBuffer und CommandBufferSize Member der D3DKMT_RENDER Struktur verwendet werden sollen, auf die der pData--Parameter verweist.

Für ein Gerät, das den garantierten DMA-Puffer-Vertragsmodus verwendet (weitere Informationen zu diesem Modus finden Sie unter Using the Guaranteed Contract DMA Buffer Model), die Größe des DMA-Puffers, der für den Anzeigeminiporttreiber verfügbar ist, um den Befehlspuffer bei der nächsten Übermittlung zu übersetzen, entspricht der Größe des Befehlspuffers selbst. Für ein solches Gerät sollte das OpenGL ICD auch die Größe der Zuordnungsliste bestimmen, die während der Übersetzung des Befehlspuffers während der Übersetzung des Befehlspuffers bei der nächsten Übermittlung aus dem Wert, der im AllocationListSize Member von D3DKMT_RENDERzurückgegeben wird, verfügbar ist.

Für Geräte, die keinen garantierten DMA-Puffervertrag verwenden, kann die OpenGL ICD die Informationen verwenden, die in der CommandBufferSize- zurückgegeben werden, und AllocationListSize Member verwenden, um die Größe des nächsten DMA-Puffers und der Zuordnungsliste zu bestimmen, die für die Übersetzung verfügbar ist. Unter bedingungen mit geringem Arbeitsspeicher ist der tatsächliche DMA-Puffer und die Zuordnungsliste, die dem Anzeigeminiporttreiber bereitgestellt wird, möglicherweise kleiner als erforderlich.

Wenn das OpenGL ICD erkennt, dass die meisten Befehlspuffer geleert werden, weil der Treiber im Befehlspuffer oder in der Zuordnungsliste nicht mehr Platz hat, kann der Treiber anfordern, dass die Größe geändert wird. Um die Größe des Befehlspuffers zu ändern, legt der Treiber die ResizeCommandBuffer Bitfeldkennzeichnung im Flags Member von D3DKMT_RENDER fest und fügt die angeforderte Größe in das CommandBufferSize Member von D3DKMT_RENDER. Ebenso legt der Treiber zum Ändern der Größe der Zuordnungsliste die ResizeAllocationList- Bitfeld-Flag im Flags Mitglied von D3DKMT_RENDER fest und fügt die angeforderte Anzahl von Elementen in das AllocationListSize Member von D3DKMT_RENDER ein.

Anmerkung

Obwohl der Treiber die Größenänderung sowohl des Befehlspuffers als auch der Zuordnungsliste anfordern kann, kann der Videospeicher-Manager möglicherweise nicht konform sein. Wenn der Aufruf von D3DKMTRender erfolgreich ist, sollte der Treiber die Werte überprüfen, die in den pCommandBuffer-, CommandBufferSizezurückgegeben werden, und AllocationListSize Member.
Wenn der Aufruf von D3DKMTRender jedoch fehlschlägt, bestimmt der Treiber, dass der Befehlspuffer, die Zuordnungsliste oder beide nicht geändert wurden. Daher sollte der Treiber nicht die Werte verarbeiten, die in der pCommandBuffer-, CommandBufferSizezurückgegeben werden, und AllocationListSize Member, da sie ungültig sind.

Beispiele

Im folgenden Codebeispiel wird veranschaulicht, wie ein OpenGL ICD D3DKMTRender- zum Rendern von 3D-Grundtypen verwenden kann.

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
mindestens unterstützte Client- Windows Vista
Zielplattform- Universal
Header- d3dkmthk.h (einschließlich D3dkmthk.h)
Library Gdi32.lib
DLL- Gdi32.dll

Siehe auch

D3DKMTGetDeviceState

D3DKMT_RENDER