Auf dieser Seite

QRhiCommandBuffer Class

Befehlspuffer-Ressource. Mehr...

Kopfzeile: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
Seit: Qt 6.6
Erbt von: QRhiResource

Öffentliche Typen

enum BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute }
flags BeginPassFlags
DynamicOffset
enum IndexFormat { IndexUInt16, IndexUInt32 }
VertexInput

Öffentliche Funktionen

void beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
void beginExternal()
void beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
void debugMarkBegin(const QByteArray &name)
void debugMarkEnd()
void debugMarkMsg(const QByteArray &msg)
void dispatch(int x, int y, int z)
void draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
void drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
(since 6.12) void drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand))
(since 6.12) void drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand))
void endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
void endExternal()
void endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
double lastCompletedGpuTime()
const QRhiNativeHandles *nativeHandles()
void resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
void setBlendConstants(const QColor &c)
void setComputePipeline(QRhiComputePipeline *ps)
void setGraphicsPipeline(QRhiGraphicsPipeline *ps)
void setScissor(const QRhiScissor &scissor)
void setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
(since 6.9) void setShadingRate(const QSize &coarsePixelSize)
void setStencilRef(quint32 refValue)
void setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
void setViewport(const QRhiViewport &viewport)

Neu implementierte öffentliche Funktionen

virtual QRhiResource::Type resourceType() const override

Ausführliche Beschreibung

Derzeit nicht von Anwendungen erstellbar. Die einzigen Möglichkeiten, einen gültigen `QRhiCommandBuffer` zu erhalten, bestehen darin, ihn über ` QRhiSwapChain::currentFrameCommandBuffer()` von der Ziel-Swapchain abzurufen oder – im Falle einer vollständig außerhalb des Bildschirms erfolgenden Darstellung – einen über ` QRhi::beginOffscreenFrame()` zu initialisieren.

Hinweis: Hierbei handelt es sich um eine RHI-API mit eingeschränkten Kompatibilitätsgarantien; weitere Informationen finden Sie unter QRhi.

Dokumentation zu den Mitgliedstypen

enum QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags

Flag-Werte für QRhi::beginPass()

KonstanteWertBeschreibung
QRhiCommandBuffer::ExternalContent0x01Gibt an, dass in diesem Durchlauf ein Aufruf von ` QRhiCommandBuffer::beginExternal()` erfolgt. Einige Backends, insbesondere Vulkan, schlagen fehl, wenn dieses Flag nicht gesetzt ist und dennoch ` beginExternal()` aufgerufen wird.
QRhiCommandBuffer::DoNotTrackResourcesForCompute0x02Gibt an, dass die in diesem Durchlauf verwendeten Ressourcen nicht nachverfolgt werden müssen, wenn der einzige Zweck dieser Nachverfolgung darin besteht, Barrieren für die Berechnung zu generieren. Dies impliziert, dass der Frame keine Berechnungsdurchläufe enthält. Es handelt sich um einen Optimierungshinweis, der von bestimmten Backends – insbesondere OpenGL – berücksichtigt werden kann, wodurch diese bestimmte Operationen überspringen können. Wenn dieses Flag für einen Render-Durchlauf in einem Frame gesetzt ist, kann der Aufruf von ` beginComputePass()` in diesem Frame je nach den Ressourcenabhängigkeiten zwischen dem Render- und dem Rechen-Durchlauf zu unerwartetem Verhalten führen.

Der Typ `BeginPassFlags` ist ein `typedef` für ` QFlags<BeginPassFlag>`. Er speichert eine ODER-Kombination von `BeginPassFlag`-Werten.

[alias] QRhiCommandBuffer::DynamicOffset

Synonym für std::pair<int, quint32>. Der erste Eintrag ist die Zuordnung, der zweite ist der Offset im Puffer.

enum QRhiCommandBuffer::IndexFormat

Legt den Datentyp des Index fest

KonstanteWertBeschreibung
QRhiCommandBuffer::IndexUInt160Vorzeichenloses 16-Bit (quint16)
QRhiCommandBuffer::IndexUInt321Vorzeichenloses 32-Bit (quint32)

[alias] QRhiCommandBuffer::VertexInput

Synonym für std::pair<QRhiBuffer *, quint32>. Der zweite Eintrag ist ein Offset in dem durch den ersten Eintrag angegebenen Puffer.

Dokumentation der Mitgliedsfunktionen

void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})

Protokolliert den Start eines neuen Rechenlaufs.

resourceUpdates, sofern nicht null, gibt einen Ressourcenaktualisierungsstapel an, der festgeschrieben und anschließend freigegeben werden soll.

Hinweis: Gehen Sie nicht davon aus, dass Zustände oder Ressourcenbindungen zwischen den Durchläufen erhalten bleiben.

Hinweis: Ein Rechen-Durchlauf kann Aufrufe von ` setComputePipeline()`, ` setShaderResources()` und ` dispatch()` aufzeichnen, jedoch keine Grafikaufrufe. Allgemeine Funktionen wie Debug-Marker und ` beginExternal()` sind sowohl im Render- als auch im Rechen-Durchlauf verfügbar.

Hinweis: „Compute“ ist nur verfügbar, wenn die Funktion „ Compute “ als unterstützt gemeldet wird.

flags wird derzeit nicht verwendet.

void QRhiCommandBuffer::beginExternal()

Wird aufgerufen, wenn die vorangehende Anwendung im Begriff ist, Befehle durch direkten Aufruf von Grafik-API-Funktionen in den Befehlspuffer des aktuellen Durchlaufs einzureihen.

Hinweis: Dies ist nur verfügbar, wenn die Absicht zuvor in ` beginPass()` oder ` beginComputePass()` deklariert wurde. Daher darf diese Funktion nur aufgerufen werden, wenn die Pass-Aufzeichnung mit der Angabe von ` QRhiCommandBuffer::ExternalContent` gestartet wurde.

Mit Vulkan, Metal oder Direct3D 12 kann man die nativen Befehlspuffer- oder Encoder-Objekte über ` nativeHandles()` abfragen und Befehle in diese einreihen. Mit OpenGL oder Direct3D 11 kann der (Geräte-)Kontext über ` QRhi::nativeHandles()` abgerufen werden. Dies darf jedoch niemals geschehen, ohne sicherzustellen, dass der Status von „ QRhiCommandBuffer “ auf dem neuesten Stand bleibt. Daher ist es erforderlich, jede extern hinzugefügte Befehlsaufzeichnung zwischen „beginExternal()“ und „ endExternal()“ einzuschließen. Konzeptionell entspricht dies den Funktionen „ beginNativePainting()“ und „ endNativePainting()“ von „ QPainter “.

Insbesondere für OpenGL hat diese Funktion eine zusätzliche Aufgabe: Sie stellt sicher, dass der Kontext im aktuellen Thread als aktueller Kontext gesetzt wird.

Hinweis: Sobald `beginExternal()` aufgerufen wurde, dürfen keine weiteren renderpassspezifischen Funktionen (set* oder draw*) auf dem ` QRhiCommandBuffer ` aufgerufen werden, bis ` endExternal()` ausgeführt wurde.

Warnung: Einige Backends geben möglicherweise über ` QRhiCommandBuffer::nativeHandles()` ein natives Befehlspufferobjekt zurück, das sich innerhalb eines `beginExternal()`-` endExternal()`-Blocks vom primären unterscheidet. Daher ist es wichtig, das native Befehlspufferobjekt nach dem Aufruf von `beginExternal()` (erneut) abzufragen. In der Praxis bedeutet dies, dass beispielsweise bei Vulkan die extern aufgezeichneten Vulkan-Befehle in einen sekundären Befehlspuffer (mit VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) geschrieben werden. „ nativeHandles()“ gibt diesen sekundären Befehlspuffer zurück, wenn die Funktion zwischen „begin/endExternal “ aufgerufen wird.

Siehe auch „ endExternal()“ und „ nativeHandles()“.

void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})

Zeichnet den Start eines neuen Render-Durchgangs auf, der auf das Renderziel rt abzielt.

resourceUpdates, sofern nicht null, gibt einen Ressourcen-Update-Batch an, der festgeschrieben und anschließend freigegeben werden soll.

Die Farb- und Tiefen-/Stencil-Puffer des Renderziels werden normalerweise gelöscht. Die Löschwerte werden in ` colorClearValue ` und ` depthStencilClearValue` angegeben. Eine Ausnahme bildet der Fall, in dem das Renderziel mit ` QRhiTextureRenderTarget::PreserveColorContents ` und/oder ` QRhiTextureRenderTarget::PreserveDepthStencilContents` erstellt wurde. In diesem Fall werden die Löschwerte ignoriert.

Hinweis: Die Aktivierung der Beibehaltung von Farb- oder Tiefeninhalten führt je nach zugrunde liegender Hardware zu einer verminderten Leistung. Mobile GPUs mit gekachelter Architektur profitieren davon, dass sie die vorherigen Inhalte nicht erneut in den Kachelpuffer laden müssen. Ebenso ist ein „ QRhiTextureRenderTarget “ mit einer „ QRhiTexture “ als Tiefenpuffer weniger effizient als ein „ QRhiRenderBuffer “, da die Verwendung einer Tiefentextur das Schreiben der Daten in diese Textur erfordert, während dies bei Renderbuffern nicht notwendig ist (da die API kein Abtasten oder Lesen aus einem Renderbuffer zulässt).

Hinweis: Gehen Sie nicht davon aus, dass Zustände oder Ressourcenbindungen zwischen den Durchläufen erhalten bleiben.

Hinweis: Die Funktionen ` set ` und ` draw ` des ` QRhiCommandBuffer` können nur innerhalb eines Durchgangs aufgerufen werden. Außerdem erwarten sie – mit Ausnahme von ` setGraphicsPipeline()` – dass bereits eine Pipeline im Befehlspuffer festgelegt ist. Andernfalls können je nach Backend unvorhergesehene Probleme auftreten.

Wenn „ rt “ ein „ QRhiTextureRenderTarget “ ist, führt „beginPass()“ eine Überprüfung durch, um festzustellen, ob die vom Renderziel referenzierten Textur- und Renderbuffer-Objekte auf dem neuesten Stand sind. Dies ähnelt der Funktionsweise von ` setShaderResources()` für ` QRhiShaderResourceBindings`. Falls eines der Attachments seit dem Aufruf von ` QRhiTextureRenderTarget::create()` neu erstellt wurde, erfolgt ein impliziter Aufruf von `create()` für ` rt`. Wenn also ` rt ` ein ` QRhiTexture `-Farb-Attachment ` texture` enthält und die Textur auf eine andere Größe geändert werden soll, ist Folgendes zulässig:

QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ { texture } });
rt->create();
// ...
texture->setPixelSize(new_size);
texture->create();
cb->beginPass(rt, colorClear, dsClear); // this is ok, no explicit rt->create() is required before

flags Ermöglicht die Steuerung bestimmter erweiterter Funktionen. Ein häufig verwendetes Flag ist ExternalContents. Dieses sollte immer dann angegeben werden, wenn beginExternal() innerhalb des durch diese Funktion gestarteten Durchgangs aufgerufen wird.

Siehe auch endPass() und BeginPassFlags.

void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)

Zeichnet eine benannte Debug-Gruppe im Befehlspuffer unter Verwendung der angegebenen „ name “ auf. Diese wird in Grafik-Debugging-Tools wie RenderDoc und XCode angezeigt. Das Ende der Gruppierung wird durch „ debugMarkEnd()“ gekennzeichnet.

Hinweis: Wird ignoriert , wenn „ QRhi::DebugMarkers “ nicht unterstützt werden oder „ QRhi::EnableDebugMarkers “ nicht gesetzt ist.

Hinweis: Kann an beliebiger Stelle innerhalb des Frames aufgerufen werden, sowohl innerhalb als auch außerhalb von Durchläufen.

void QRhiCommandBuffer::debugMarkEnd()

Zeichnet das Ende einer Debug-Gruppe auf.

Hinweis: Wird ignoriert , wenn „ QRhi::DebugMarkers “ nicht unterstützt werden oder „ QRhi::EnableDebugMarkers “ nicht gesetzt ist.

Hinweis: Kann an beliebiger Stelle innerhalb des Frames aufgerufen werden, sowohl innerhalb als auch außerhalb von Durchläufen.

void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)

Fügt eine Debug-Meldung „ msg “ in den Befehlsstrom ein.

Hinweis: Wird ignoriert , wenn „ QRhi::DebugMarkers “ nicht unterstützt werden oder „ QRhi::EnableDebugMarkers “ nicht gesetzt ist.

Hinweis: Bei einigen Backends wird `debugMarkMsg()` nur innerhalb eines Durchgangs unterstützt und bei Aufruf außerhalb eines Durchgangs ignoriert. Bei anderen wird die Meldung an beliebiger Stelle innerhalb des Frames aufgezeichnet.

void QRhiCommandBuffer::dispatch(int x, int y, int z)

Protokolliert die Verteilung von Rechen-Workitems, wobei „ x “, „ y “ und „ z “ die Anzahl der lokalen Arbeitsgruppen in der entsprechenden Dimension angeben.

Hinweis: Diese Funktion kann nur innerhalb eines Berechnungsdurchlaufs aufgerufen werden, d. h. zwischen einem Aufruf von „ beginComputePass()“ und „ endComputePass()“.

Hinweis: x, y und z müssen zur Laufzeit innerhalb der Grenzen der zugrunde liegenden Grafik-API-Implementierung liegen. Die Maximalwerte betragen in der Regel 65535.

Hinweis: Achten Sie auch auf mögliche Beschränkungen hinsichtlich der Größe der lokalen Arbeitsgruppe. Diese wird im Shader festgelegt, zum Beispiel: ` layout(local_size_x = 16, local_size_y = 16) in;` . Bei OpenGL beträgt der von der Spezifikation vorgeschriebene Mindestwert für die Anzahl der Aufrufe in einer einzelnen lokalen Arbeitsgruppe (das Produkt aus local_size_x, local_size_y und local_size_z) beispielsweise 1024, während dieser Wert bei OpenGL ES (3.1) bis zu 128 betragen kann. Das bedeutet, dass das oben angeführte Beispiel von einigen OpenGL-ES-Implementierungen möglicherweise abgelehnt wird, da die Anzahl der Aufrufe 256 beträgt.

void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)

Zeichnet einen nicht indizierten Zug auf.

Die Anzahl der Eckpunkte wird in „ vertexCount “ angegeben. Für instanziertes Zeichnen setzen Sie „ instanceCount “ auf einen Wert ungleich 1. „ firstVertex “ ist der Index des ersten zu zeichnenden Eckpunkts. Beim Zeichnen mehrerer Instanzen wird die ID der ersten Instanz durch „ firstInstance “ angegeben.

Hinweis: „ firstInstance “ wird möglicherweise nicht unterstützt und ignoriert, wenn die Funktion „ QRhi::BaseInstance “ als nicht unterstützt gemeldet wird. In diesem Fall ist die erste Instanz-ID immer 0. „ QRhi::BaseInstance “ wird derzeit von OpenGL nicht unterstützt, was hauptsächlich auf Einschränkungen von OpenGL ES zurückzuführen ist; daher sollten portable Anwendungen nicht so konzipiert werden, dass sie auf dieses Argument angewiesen sind.

Hinweis: Shader , die auf den Index des aktuellen Scheitelpunkts oder der aktuellen Instanz zugreifen müssen, müssen „ gl_VertexIndex “ und „ gl_InstanceIndex “ verwenden, d. h. die Vulkan-kompatiblen integrierten Variablen, anstatt „ gl_VertexID “ und „ gl_InstanceID “.

Hinweis: Wenn „ firstInstance “ ungleich Null ist, enthält „ gl_InstanceIndex “ bei einigen der zugrunde liegenden 3D-APIs nicht den Basiswert. Dies wird durch das Merkmal „ QRhi::InstanceIndexIncludesBaseInstance “ angezeigt. Wenn die Verwendung eines Basisinstanzwerts unvermeidbar ist, wird empfohlen, den Wert je nach Angabe dieses Merkmals bedingt als „uniform“ zu übergeben und ihn im Shader zu „ gl_InstanceIndex “ hinzuzufügen.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von „ beginPass()“ und „ endPass()“.

void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)

Zeichnet einen indizierten Draw auf.

Die Anzahl der Eckpunkte wird in ` indexCount` angegeben. ` firstIndex ` ist der Basisindex. Der effektive Offset im Indexpuffer ergibt sich aus ` indexOffset + firstIndex * n `, wobei ` n ` je nach Typ des Indexelements 2 oder 4 ist. ` indexOffset ` wird in ` setVertexInput()` angegeben.

Hinweis: Der effektive Offset im Indexpuffer muss bei einigen Backends (z. B. Metal) 4-Byte-ausgerichtet sein. Bei diesen Backends wird die Funktion „ NonFourAlignedEffectiveIndexBufferOffset “ als nicht unterstützt gemeldet.

vertexOffset (auch als „ base vertex “ bezeichnet) ist ein vorzeichenbehafteter Wert, der zum Elementindex addiert wird, bevor die Indizierung in den Vertex-Puffer erfolgt. Die Unterstützung hierfür ist nicht immer verfügbar, und der Wert wird ignoriert, wenn die Funktion „ QRhi::BaseVertex “ als nicht unterstützt gemeldet wird.

Für das Zeichnen von Instanzen setzen Sie „ instanceCount “ auf einen anderen Wert als 1. Beim Zeichnen mehrerer Instanzen wird die erste Instanz-ID durch „ firstInstance “ angegeben.

Hinweis: „ firstInstance “ wird möglicherweise nicht unterstützt und ignoriert, wenn die Funktion „ QRhi::BaseInstance “ als nicht unterstützt gemeldet wird. In diesem Fall ist die erste Instanz-ID immer 0. „ QRhi::BaseInstance “ wird derzeit von OpenGL nicht unterstützt, was hauptsächlich auf Einschränkungen von OpenGL ES zurückzuführen ist; daher sollten portable Anwendungen nicht so konzipiert werden, dass sie auf dieses Argument angewiesen sind.

Hinweis: Shader , die auf den Index des aktuellen Scheitelpunkts oder der aktuellen Instanz zugreifen müssen, müssen „ gl_VertexIndex “ und „ gl_InstanceIndex “ verwenden, d. h. die Vulkan-kompatiblen integrierten Variablen, anstatt „ gl_VertexID “ und „ gl_InstanceID “.

Hinweis: Wenn „ firstInstance “ ungleich Null ist, enthält „ gl_InstanceIndex “ bei einigen der zugrunde liegenden 3D-APIs nicht den Basiswert. Dies wird durch die Funktion „ QRhi::InstanceIndexIncludesBaseInstance “ angezeigt. Wenn die Verwendung eines Basisinstanzwerts unvermeidbar ist, wird empfohlen, den Wert je nach Rückmeldung dieser Funktion bedingt als „uniform“ zu übergeben und ihn im Shader zu „ gl_InstanceIndex “ hinzuzufügen.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

[since 6.12] void QRhiCommandBuffer::drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand))

Zeichnet einen indizierten, indirekten Aufruf auf.

Die Abrufparameter werden durch den in ` indirectBuffer` angegebenen Puffer bereitgestellt, der ein Array mit Elementen vom Typ ` QRhiIndexedIndirectDrawCommand` enthalten muss. Die Parameter in ` QRhiIndexedIndirectDrawCommand ` haben dieselbe Bedeutung wie in ` drawIndexed()`.

Der Offset in Bytes, ab dem die Parameter aus dem Puffer gelesen werden, wird durch ` indirectBufferOffset` festgelegt.

drawCount gibt die Anzahl der auszuführenden Zeichenbefehle an.

stride Gibt die Byte-Größe jeder einzelnen Zeichnungsbefehlsstruktur im Puffer an. Dies ermöglicht bei Bedarf das Einfügen benutzerdefinierter Daten zwischen den Befehlen. Der Wert muss ein Vielfaches von 4 und größer oder gleich sizeof(QRhiIndexedIndirectDrawCommand) sein.

Hinweis: Ein Wert für ` drawCount ` größer als 1 wird nativ nur unterstützt, wenn die Funktion „ QRhi::DrawIndirectMulti “ als unterstützt gemeldet wird und `stride` auf den Standardwert gesetzt ist. Andernfalls emuliert diese Funktion „Multi-Draw“, indem sie mehrere Zeichenaufrufe aufzeichnet, was keinen Leistungsvorteil gegenüber wiederholten Aufrufen von ` drawIndexed()` bietet.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und einem Aufruf von ` endPass()`.

Diese Funktion wurde in Qt 6.12 eingeführt.

[since 6.12] void QRhiCommandBuffer::drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand))

Zeichnet einen nicht indizierten, indirekten Zeichnungsvorgang auf.

Die Abrufparameter werden durch den in ` indirectBuffer` angegebenen Puffer bereitgestellt, der ein Array mit Elementen vom Typ ` QRhiIndirectDrawCommand` enthalten muss. Die Parameter in ` QRhiIndirectDrawCommand ` haben dieselbe Bedeutung wie in ` draw()`.

Der Offset in Byte, ab dem die Parameter aus dem Puffer gelesen werden, wird durch ` indirectBufferOffset` angegeben.

drawCount gibt die Anzahl der auszuführenden Zeichenbefehle an.

stride Gibt die Byte-Größe jeder einzelnen Zeichnungsbefehlsstruktur im Puffer an. Dies ermöglicht bei Bedarf das Einfügen benutzerdefinierter Daten zwischen den Befehlen. Der Wert muss ein Vielfaches von 4 und größer oder gleich sizeof(QRhiIndirectDrawCommand) sein.

Hinweis: Ein Wert für ` drawCount ` größer als 1 wird nativ nur unterstützt, wenn die Funktion „ QRhi::DrawIndirectMulti “ als unterstützt gemeldet wird und `stride` auf den Standardwert gesetzt ist. Andernfalls emuliert diese Funktion „Multi-Draw“, indem sie mehrere Zeichenaufrufe aufzeichnet, was keinen Leistungsvorteil gegenüber wiederholten Aufrufen von ` draw()` bietet.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und einem Aufruf von ` endPass()`.

Diese Funktion wurde in Qt 6.12 eingeführt.

void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

Datensätze, die den aktuellen Rechenlauf beenden.

resourceUpdates, sofern nicht null, gibt einen Ressourcen-Aktualisierungsstapel an, der festgeschrieben und anschließend freigegeben werden soll.

void QRhiCommandBuffer::endExternal()

Wird aufgerufen, sobald die extern hinzugefügten Befehle im Befehlspuffer oder Kontext gespeichert wurden.

Hinweis: Nach dem Aufruf dieser Funktion müssenalle „ QRhiCommandBuffer “-Zustände als ungültig betrachtet werden. Pipelines, Vertex- und Indexpuffer sowie andere Zustände müssen neu gesetzt werden, wenn nach den externen Befehlen weitere Zeichenaufrufe aufgezeichnet werden.

Siehe auch „ beginExternal()“ und „ nativeHandles()“.

void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

Zeichnet den aktuellen Render-Durchlauf ab.

resourceUpdates, sofern nicht null, gibt einen Ressourcen-Update-Batch an, der festgeschrieben und anschließend freigegeben werden soll.

Siehe auch ` beginPass()`.

double QRhiCommandBuffer::lastCompletedGpuTime()

Gibt den letzten verfügbaren Zeitstempel in Sekunden zurück, sofern die Funktion „ QRhi::EnableTimestamps “ beim Erstellen der „ QRhi “ aktiviert war. Der Wert gibt die auf der GPU während des zuletzt abgeschlossenen Frames verstrichene Zeit an.

Hinweis: ErwartenSie keine anderen Ergebnisse als 0, wenn die Funktion „ QRhi::Timestamps “ nicht als unterstützt gemeldet wird oder wenn „ QRhi::EnableTimestamps “ nicht an „ QRhi::create()“ übergeben wurde. Es gibt Ausnahmen von dieser Regel, da bei einigen Grafik-APIs (Metal) Zeitangaben verfügbar sind, ohne dass zusätzliche Operationen (Zeitstempelabfragen) durchgeführt werden müssen. Portierbare Anwendungen sollten sich jedoch stets bewusst für die Erfassung von Zeitstempeln entscheiden, wenn sie wissen, dass dies erforderlich ist, und diese Funktion entsprechend aufrufen.

Bei der Interpretation des Werts ist Vorsicht geboten, da dessen Genauigkeit und Granularität oft nicht von Qt gesteuert werden und von der zugrunde liegenden Grafik-API sowie deren Implementierung abhängen. Insbesondere wird davon abgeraten, die Werte verschiedener Grafik-APIs und Hardware miteinander zu vergleichen, da dies möglicherweise aussagekräftig ist.

Die Zeitwerte werden wahrscheinlich asynchron verfügbar. Der zurückgegebene Wert kann daher 0 sein (z. B. für die ersten 1–2 Frames) oder der letzte bekannte Wert, der sich auf einen früheren Frame bezieht. Der Wert kann unter bestimmten Bedingungen, wie z. B. beim Ändern der Fenstergröße, auch wieder 0 werden. Es ist zu erwarten, dass der aktuellste verfügbare Wert in `beginFrame()` abgerufen wird und über diese Funktion abgefragt werden kann, sobald `beginFrame()` zurückkehrt.

Hinweis: Gehen Sie nicht davon aus, dass sich der Wert auf das vorherige Bild (currently_recorded - 1) bezieht. Er kann sich auch auf currently_recorded - 2 oder currently_recorded - 3 beziehen. Das genaue Verhalten kann von der Grafik-API und deren Implementierung abhängen.

Beachten Sie die Auswirkungen von GPU-Frequenzskalierung und Änderungen der GPU-Taktfrequenz, die je nach Plattform variieren können. Unter Windows beispielsweise kann die zurückgegebene Zeitangabe bei modernen Grafikkarten von Frame zu Frame in einem recht großen Bereich schwanken, selbst wenn Frames mit ähnlicher oder identischer Auslastung übermittelt werden. Dies liegt generell außerhalb des Einflussbereichs von Qt und kann von Qt nicht gesteuert oder behoben werden. Das D3D12-Backend ruft jedoch automatisch `ID3D12Device::SetStablePowerState()` auf, sobald die Umgebungsvariable ` QT_D3D_STABLE_POWER_STATE ` auf einen Wert ungleich Null gesetzt ist. Dies kann das Ergebnis erheblich stabilisieren. Es kann zudem einen nicht unerheblichen Einfluss auf die CPU-seitigen Zeitwerte haben, die beispielsweise über ` QElapsedTimer ` gemessen werden, insbesondere wenn Offscreen-Frames beteiligt sind.

Hinweis: Stellen Sie Anwendungen niemals mit gesetztem „ QT_D3D_STABLE_POWER_STATE “ in die Produktion. Weitere Informationen finden Sie in der Windows-API-Dokumentation.

Siehe auch „ QRhi::Timestamps “ und „ QRhi::EnableTimestamps “.

const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()

Gibt einen Zeiger auf eine backend-spezifische Unterklasse von ` QRhiNativeHandles ` zurück, beispielsweise ` QRhiVulkanCommandBufferNativeHandles`. Der Rückgabewert ist ` nullptr `, wenn die Offenlegung der zugrunde liegenden nativen Ressourcen vom Backend nicht unterstützt wird oder nicht anwendbar ist.

Siehe auch „ QRhiVulkanCommandBufferNativeHandles“ , „ QRhiMetalCommandBufferNativeHandles “, „ beginExternal()“ und „ endExternal()“.

[override virtual] QRhiResource::Type QRhiCommandBuffer::resourceType() const

Implementiert neu: ` QRhiResource::resourceType()` const.

Gibt den Ressourcentyp zurück.

void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)

Manchmal ist es notwendig oder einfach praktischer, Ressourcenaktualisierungen zu übernehmen, ohne einen Render-Durchlauf zu starten. Der Aufruf dieser Funktion mit ` resourceUpdates ` ist eine Alternative zur Übergabe von ` resourceUpdates ` an einen Aufruf von ` beginPass()` (oder ` endPass()`, was bei Readbacks üblich wäre).

Hinweis: Kann nicht innerhalb eines Passes aufgerufen werden.

void QRhiCommandBuffer::setBlendConstants(const QColor &c)

Datensätze, in denen die aktiven Mischkonstanten auf „ c “ festgelegt sind.

Dies kann nur aufgerufen werden, wenn für die gebundene Pipeline „ QRhiGraphicsPipeline::UsesBlendConstants “ festgelegt ist.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)

Zeichnet eine neue Rechenpipeline auf ps.

Hinweis: Diese Funktion muss aufgerufen werden, bevor Befehle wie „ setShaderResources()“ oder „ dispatch()“ im Befehlspuffer aufgezeichnet werden.

Hinweis: „ QRhi “ optimiert unnötige Aufrufe innerhalb eines Durchgangs weg, daher ist eine Überoptimierung zur Vermeidung von Aufrufen dieser Funktion auf Seiten der Anwendung nicht erforderlich.

Hinweis: Diese Funktion kann nur innerhalb eines Rechen-Durchgangs aufgerufen werden, d. h. zwischen einem Aufruf von ` beginComputePass()` und einem Aufruf von ` endComputePass()`.

void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)

Zeichnet Befehle auf, die eine neue Grafik-Pipeline festlegen: ps.

Hinweis: Diese Funktion muss aufgerufen werden, bevor andere Befehle wie „ set “ oder „ draw “ im Befehlspuffer aufgezeichnet werden.

Hinweis: „ QRhi “ optimiert unnötige Aufrufe innerhalb eines Durchgangs weg, daher ist eine übermäßige Optimierung zur Vermeidung von Aufrufen dieser Funktion auf Seiten der Anwendung nicht erforderlich.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Durchgangs aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

Hinweis: Die neue Grafikpipeline „ ps “ muss ein gültiger Zeiger sein.

Das Festlegen einer Grafikpipeline ohne das Flag „ UsesScissor “ deaktiviert entweder das Scissoring bei Grafik-APIs, bei denen dies möglich ist, oder legt das Scissor-Rechteck so fest, dass es mit dem zuletzt festgelegten Viewport übereinstimmt (bei Grafik-APIs, bei denen das Scissoring praktisch immer aktiv ist), um ein einheitliches Verhalten über alle „ QRhi “-Backends hinweg zu gewährleisten.

void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)

Speichert das aktive Scherenrechteck, das unter „ scissor “ festgelegt wurde.

Diese Funktion kann nur aufgerufen werden, wenn für die gebundene Pipeline das Flag „ UsesScissor “ gesetzt ist. Ist das Flag für die aktive Pipeline gesetzt, muss diese Funktion aufgerufen werden, da der Scheren-Test aktiviert wird und daher ein Scherenrechteck angegeben werden muss.

Hinweis: „ QRhi “ geht von Viewport-Koordinaten im OpenGL-Stil aus, d. h., x und y beziehen sich auf die linke untere Ecke.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von „ beginPass()“ und „ endPass()“.

void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)

Datensätze, die eine Reihe von Shader-Ressourcen – wie beispielsweise Uniform-Puffer oder Texturen – bündeln, die für eine oder mehrere Shader-Stufen sichtbar gemacht werden.

srb kann null sein; in diesem Fall wird das zugehörige ` QRhiShaderResourceBindings ` der aktuellen Grafik- oder Rechenpipeline verwendet. Wenn ` srb ` nicht null ist, muss es ` layout-compatible` sein, d. h., das Layout (Anzahl der Bindungen, Typ und Bindungsnummer jeder Bindung) muss vollständig mit dem ` QRhiShaderResourceBindings ` übereinstimmen, das zum Zeitpunkt des Aufrufs von `create()` der Pipeline zugeordnet war.

Es gibt Fälle, in denen ein scheinbar unnötiger Aufruf von `setShaderResources()` zwingend erforderlich ist: beim Neuerstellen einer Ressource, auf die von ` srb` verwiesen wird, beispielsweise beim Ändern der Größe einer ` QRhiBuffer `, gefolgt von einem Aufruf von ` QRhiBuffer::create()`, an dieser Stelle werden die zugehörigen nativen Objekte (wie z. B. Deskriptorsätze im Fall von Vulkan) aktualisiert, damit sie auf die aktuellen nativen Ressourcen verweisen, die die von srb referenzierten Objekte QRhiBuffer, QRhiTexture und QRhiSampler unterstützen. In diesem Fall muss `setShaderResources()` aufgerufen werden, auch wenn srb mit dem Wert des letzten Aufrufs identisch ist.

Wenn ` srb ` nicht null ist, wird garantiert, dass auf das ` QRhiShaderResourceBindings `-Objekt, mit dem die Pipeline in `create()` erstellt wurde, in keiner Form zugegriffen wird. Tatsächlich muss es zu diesem Zeitpunkt nicht einmal gültig sein: Es ist zulässig, das der Pipeline zugeordnete `srb` nach `create()` zu löschen und stattdessen bei jedem Aufruf von `setShaderResources()` explizit ein anderes, ` layout compatible `-Objekt anzugeben.

dynamicOffsets Ermöglicht die Angabe von Puffer-Offsets für Uniform-Puffer, die über ` QRhiShaderResourceBinding::uniformBufferWithDynamicOffset()` mit ` srb ` verknüpft wurden. Dies unterscheidet sich von der Angabe des Offsets im ` srb ` selbst: Dynamische Offsets erfordern nicht für jeden unterschiedlichen Offset die Erstellung eines neuen ` QRhiShaderResourceBindings `, können das Schreiben der zugrunde liegenden Deskriptoren (bei entsprechenden Backends) vermeiden und sind daher möglicherweise effizienter. Jedes Element von ` dynamicOffsets ` ist ein Paar aus ` binding ` und ` offset `. ` dynamicOffsetCount ` gibt die Anzahl der Elemente in ` dynamicOffsets` an.

Hinweis: Alle Offsets in „ dynamicOffsets “ müssen byteweise an den von „ QRhi::ubufAlignment()“ zurückgegebenen Wert ausgerichtet sein.

Hinweis: Einige Backends schränken möglicherweise die Anzahl der unterstützten dynamischen Offsets ein. Vermeiden Sie die Verwendung eines dynamicOffsetCount, der größer als 8 ist.

Hinweis: „ QRhi “ optimiert unnötige Aufrufe innerhalb eines Durchlaufs heraus (unter Berücksichtigung der oben beschriebenen Bedingungen), daher ist eine Überoptimierung zur Vermeidung von Aufrufen dieser Funktion auf Seiten der Anwendung nicht erforderlich.

Hinweis: Diese Funktion kann nur innerhalb eines Render- oder Compute-Passes aufgerufen werden, d. h. zwischen einem ` beginPass()` und einem ` endPass()` oder zwischen einem ` beginComputePass()` und einem ` endComputePass()`.

[since 6.9] void QRhiCommandBuffer::setShadingRate(const QSize &coarsePixelSize)

Setzt die Shading-Rate für die folgenden Draw-Calls auf „ coarsePixelSize “.

Der Standardwert ist 1x1.

Funktioniert nur, wenn die Funktion „ QRhi::VariableRateShading “ als unterstützt gemeldet wird und die im Befehlspuffer gebundenen „ QRhiGraphicsPipeline “ bei ihrer Erstellung „ QRhiGraphicsPipeline::UsesShadingRate “ deklariert haben.

Rufen Sie „ QRhi::supportedShadingRates()“ auf, um zu prüfen, welche Shading-Raten für eine bestimmte Sample-Anzahl unterstützt werden.

Wenn sowohl ein ` QRhiShadingRateMap ` als auch diese Funktion verwendet werden, wird für jede Kachel die höhere der beiden Shading-Raten verwendet. Derzeit gibt es keine Möglichkeit, das Verhalten des Kombinators zu steuern.

Diese Funktion wurde in Qt 6.9 eingeführt.

void QRhiCommandBuffer::setStencilRef(quint32 refValue)

Setzt den aktiven Stencil-Referenzwert auf „ refValue “.

Diese Funktion kann nur aufgerufen werden, wenn für die gebundene Pipeline „ QRhiGraphicsPipeline::UsesStencilRef “ gesetzt ist.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)

Speichert die Eingabebindungen der Knoten.

Der von nachfolgenden drawIndexed()-Befehlen verwendete Indexpuffer wird durch indexBuf, indexOffset und indexFormat festgelegt. indexBuf kann auf null gesetzt werden, wenn kein indexiertes Zeichnen erforderlich ist.

Vertex-Puffer-Bindungen werden gebündelt. startBinding gibt die Nummer der ersten Bindung an. Der aufgezeichnete Befehl bindet dann jeden Puffer von bindings an den Bindungspunkt startBinding + i, wobei i der Index in bindings ist. Jedes Element in bindings gibt einen QRhiBuffer und einen Offset an.

Hinweis: Einige Backends schränken möglicherweise die Anzahl der Vertex-Buffer-Bindungen ein. Vermeiden Sie die Verwendung eines „ bindingCount “, der größer als 8 ist.

Überflüssige Änderungen an Vertex-Eingaben und Indizes im selben Durchgang werden bei den meisten Backends automatisch ignoriert, sodass Anwendungen keine übermäßige Optimierung vornehmen müssen, um Aufrufe dieser Funktion zu vermeiden.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

Nehmen wir als einfaches Beispiel einen Vertex-Shader mit zwei Eingaben:

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;

und nehmen wir an, die Daten liegen im Interleaved-Format vor, wobei nur 2 Floats für die Position verwendet werden (also 5 Floats pro Vertex: x, y, r, g, b). Ein ` QRhiGraphicsPipeline ` für diesen Shader kann dann unter Verwendung des folgenden Eingabelayouts erstellt werden:

QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
    { 5 * sizeof(float) }
});
inputLayout.setAttributes({
    { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
    { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
});

Hier gibt es eine Pufferbindung (Bindungsnummer 0), auf die zwei Eingänge verweisen. Bei der Aufzeichnung des Durchgangs können, sobald die Pipeline eingerichtet ist, die Vertex-Bindungen einfach wie folgt festgelegt werden, vorausgesetzt, „vbuf“ ist der „ QRhiBuffer “ mit allen verschachtelten Positions- und Farbdaten:

const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0);
cb->setVertexInput(0, 1, &vbufBinding);

void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)

Speichert das aktive Ansichtsfenster-Rechteck, das unter viewport angegeben ist.

Bei Backends, bei denen in der zugrunde liegenden Grafik-API das „Scissoring“ stets aktiviert ist, legt diese Funktion außerdem das „Scissor“-Rechteck so fest, dass es mit dem Ansichtsbereich übereinstimmt, sofern für das aktive „ QRhiGraphicsPipeline “ der Parameter „ UsesScissor “ nicht gesetzt ist.

Hinweis: „ QRhi “ geht von Viewport-Koordinaten im OpenGL-Stil aus, d. h., x und y beziehen sich auf die linke untere Ecke.

Hinweis: Diese Funktion kann nur innerhalb eines Render-Passes aufgerufen werden, d. h. zwischen einem Aufruf von ` beginPass()` und ` endPass()`.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.