2016-07-29 36 views
4

Ich implementiere einige Funktionen, die ich eine API implementieren muss warten auf D3D10 zu beenden Rendering.Basisch versuche ich, Synchronisierungszugriff auf eine gemeinsame Textur zu implementieren, so dass ich ein aktualisieren kann Textur nach d3d10 ist erfolgreich in der Lage, Backbuffer zu präsentieren. Wenn ich diese Black Box api anrufe, denke ich, dass dies erreicht werden kann, und ich denke, dass es ähnlich wie glfinish() sein wird.Ich habe gelesen, dass wir ID3D10Query-Abfragen für die Implementierung des Synchronisierungszugriffs verwenden können.Implement API zum Warten auf d3d10 Befehle zu beenden

D3D10_QUERY_DESC queryDesc; 

    ... // Fill out queryDesc structure 

    ID3D10Query * pQuery; 
    pDevice->CreateQuery(&queryDesc, &pQuery); 

    pQuery->Begin(); 

    ... // Issue graphis commands, do whatever 

    pQuery->End(); 

    UINT64 queryData; // This data type is different depending on the query type 

    while(S_OK != pQuery->GetData(&queryData, sizeof(UINT64), 0)) 
    { 
    } 

sollte ich einen Dummy-Befehl zwischen Anfang und Ende dieses setzen? da ich diese Funktionalität als öffentliche API etwas wie waitingforgraphiscompletion

enthüllen wollen was sollte ein Dummy-Befehl hier sein?

Antwort

2

Wenn Sie versuchen, Ausführungs-CPU und GPU in OpenGL zu synchronisieren, verwenden Sie glFenceSync, gefolgt von glClientWaitSync. Die Entsprechungen in Direct 10 sind ID3D10Asynchronous::End und (beachten Sie, in DX11 sind die Schnittstellen etwas anders). Diese informieren Sie, wenn die GPU den Befehlspuffer zu einem bestimmten Punkt verarbeitet hat. Dadurch können Sie feststellen, wann frühere Lese-/Schreibvorgänge für eine Ressource abgeschlossen wurden, und die CPU kann ohne zusätzliche Synchronisierung sicher auf die Ressource zugreifen.

Sie müssen keine Befehle in die while-Schleife einfügen. Der Befehlspuffer verarbeitet Ihre Abfrage schließlich und gibt S_OK (oder eine Fehlermeldung, die Sie möglicherweise behandeln möchten) zurück. Dies ist jedoch etwas verschwenderisch, da die CPU nur auf die GPU wartet, also wenn möglich, sollten Sie einige nützliche Arbeit innerhalb der Schleife tun.

Hinweis, wenn Sie D3D10_ASYNC_GETDATA_DONOTFLUSH als letzter Parameter GetData verwendet (anstelle von ‚0‘), würden die oben nicht der Fall sein - es gibt keine Garantie, dass der Befehlspuffer würde ‚automatisch‘ kick-off, und man konnte enden in einer Endlosschleife (und ist daher nicht die empfohlene Verwendung).

+0

danke das macht perfekten Sinn für mich. Ich habe ein oder zwei Fragen dazu. Wie unterscheidet sich glfinish von glFenceSync gefolgt von einem glClientWaitSync? Was D3D10 betrifft, bedeutet das nur, dass ich nur das Ende von ID3D10Query aufrufen muss (das bedeutet, kein Beginn) und es wird auf den gesamten Befehl warten, um auf dem Gerät ausgeführt zu werden, von dem ID3D10Query erstellt wurde? –

+0

glFinish wartet auf den Abschluss aller OpenGL-Operationen, einschließlich des Schreibens in den Framebuffer. glClientWaitSync garantiert dies nicht, es garantiert nur, dass alle GL-Befehle ausgegeben werden, bevor glFenceSync beendet wurde. Dies ist im Allgemeinen nicht erforderlich, wenn Sie den Zugriff auf eine bestimmte Textur synchronisieren möchten, wie Sie wissen sollten, wenn Sie mit Ihrem eigenen Rendering-Code lesen/schreiben. – MuertoExcobito

+0

Hmm, danke –