PFND3DDDI_RENDERCB Rückruffunktion (d3dumddi.h)
Die pfnRenderCb-Funktion übermittelt den aktuellen Befehlspuffer zum Rendern an den Anzeige-Miniporttreiber.
Syntax
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
Parameter
hDevice
Ein Handle für das Anzeigegerät (Grafikkontext).
unnamedParam2
pData [in, out]
Ein Zeiger auf eine D3DDDICB_RENDER-Struktur , die den aktuellen zu rendernden Befehlspuffer beschreibt.
Rückgabewert
pfnRenderCb gibt einen der folgenden Werte zurück:
Rückgabecode | Beschreibung |
---|---|
S_OK | Der Befehlspuffer wurde erfolgreich gerendert. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | Der Anzeige-Miniporttreiber hat eine privilegierte Anweisung im Befehlspuffer erkannt. privilegierte Anweisungen können nicht in einem Befehlspuffer vorhanden sein. |
D3DDDIERR_ILLEGALINSTRUCTION | Der Display-Miniporttreiber hat Anweisungen erkannt, die grafikhardware nicht unterstützen kann. |
D3DDDIERR_INVALIDHANDLE | Der Anzeige-Miniporttreiber hat ein ungültiges Handle im Befehlspuffer erkannt. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | Der Videospeicher-Manager hat Verweise auf eine gesperrte Zuordnung in der Zuordnungsliste erkannt. Beachten Sie, dass der Videospeicher-Manager diesen Fehler nur dann zurückgibt, wenn die Zuordnung nicht zu einem AGP- oder Systemspeichersegment neu positioniert werden konnte. |
D3DDDIERR_INVALIDUSERBUFFER | Der Anzeige-Miniporttreiber hat einen Unter- oder Überlauf von Daten oder Anweisungen erkannt. Das heißt, der Treiber erhielt weniger oder mehr Anweisungen oder Daten als erwartet. |
E_OUTOFMEMORY | pfnRenderCb konnte aufgrund von unzureichendem Arbeitsspeicher nicht abgeschlossen werden. |
E_INVALIDARG | Die Parameter wurden überprüft und als falsch ermittelt. |
Diese Funktion gibt möglicherweise auch andere HRESULT-Werte zurück.
Hinweise
Wenn der Anzeigetreiber im Benutzermodus den aktuellen Befehlspuffer für das Rendern an den Anzeigeminiporttreiber übermitteln muss (z. B. während eines Aufrufs der Funktion Flush oder Flush(D3D10) des Benutzermodusanzeigetreibers), muss der Benutzermodus-Anzeigetreiber die PfnRenderCb-Funktion aufrufen. Der Anzeigetreiber für den Benutzermodus sollte den hDevice-Parameter auf den Wert festlegen, den die Microsoft Direct3D-Runtime während des CreateDevice- oder CreateDevice(D3D10)-Aufrufs bereitgestellt hat. In der D3DDDICB_RENDER-Struktur , auf die der pData-Parameter verweist, sollte der Benutzermodusanzeigetreiber auch Folgendes festlegen:
- Das CommandLength-Element zur Anzahl der Bytes von Befehlen im Befehlspuffer, die mit offset 0 beginnen.
- Der CommandOffset-Member auf ungleich null, wenn der Benutzermodusanzeigetreiber einen Offset zum ersten Hardwarebefehl im Befehlspuffer angeben muss.
- Der NumAllocations-Member zur Anzahl der Elemente in der Zuordnungsliste.
- Der NumPatchLocations-Member zur Anzahl der Elemente in der Patchspeicherortliste.
Wenn der Anzeigetreiber im Benutzermodus erkennt, dass die meisten Befehlspufferleerungen darauf zurückzuführen sind, dass dem Treiber in der Befehlspuffer-, Zuordnungsliste oder Patchspeicherortliste 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 D3DDDICB_RENDER fest und legt die angeforderte Größe in das NewCommandBufferSize-Element von D3DDDICB_RENDER. Ebenso legt der Treiber zum Ändern der Größe der Zuordnungsliste das Bitfeldflag ResizeAllocationList im Flags-Element von D3DDDICB_RENDER fest und legt die angeforderte Anzahl von Elementen in das NewAllocationListSize-Element von D3DDDICB_RENDER. Um die Größe der Patchspeicherortliste zu ändern, legt der Treiber das Bitfeldflag ResizePatchLocationList im Flags-Element von D3DDDICB_RENDER fest und legt die angeforderte Anzahl von Elementen im NewPatchLocationListSize-Element von D3DDDICB_RENDER.
Beispiele
Das folgende Codebeispiel zeigt, wie Sie den aktuellen Befehlspuffer zum Rendern an den Anzeige-Miniporttreiber übermitteln. In diesem Codebeispiel wird die Zuordnungsliste generiert, nachdem der Befehlspuffer und die Patchliste generiert wurden. Dies ist für die Leistung nicht optimal, da der Befehlspuffer mehr als erforderlich analysiert wird. Diese Implementierung ist jedoch einfacher anzuzeigen. In einem Produktionstreiber ist das Generieren des Befehlspuffers zur gleichen Zeit wie die Zuordnungs- und Patchlisten effizienter.
VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
D3DDDICB_RENDER renderCBData = {0};
DWORD dwAllocationListUsed;
HRESULT hr;
if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
{
DBG_BREAK;
return;
}
// 3-D and video packets must be in sync. If the last packet that was sent went to
// the 3-D engine, that packet must finish before the new packet runs on the hardware.
renderCBData.CommandOffset = 0;
renderCBData.CommandLength = Size + sizeof(UMD_CMDBUF_INFO);
renderCBData.NumAllocations = dwAllocationListUsed;
renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;
// Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);
// Makes video the last engine that work was submitted to
m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar in Windows Vista und höheren Versionen der Windows-Betriebssysteme. |
Zielplattform | Desktop |
Kopfzeile | d3dumddi.h (include D3dumddi.h) |