PySide6.QtGui.QRhiResourceUpdateBatch¶
- class QRhiResourceUpdateBatch¶
Records upload and copy type of operations.
Details
With
QRhiit is no longer possible to perform copy type of operations at arbitrary times. Instead, all such operations are recorded into batches that are then passed, most commonly, tobeginPass(). What then happens under the hood is hidden from the application: the underlying implementations can defer and implement these operations in various different ways.A resource update batch owns no graphics resources and does not perform any actual operations on its own. It should rather be viewed as a command buffer for update, upload, and copy type of commands.
To get an available, empty batch from the pool, call
nextResourceUpdateBatch().Note
This is a RHI API with limited compatibility guarantees, see
QRhifor details.Added in version 6.6.
Synopsis¶
Methods¶
def
copyTexture()def
generateMips()def
merge()def
readBackBuffer()def
release()def
uploadTexture()
Note
This documentation may contain snippets that were automatically translated from C++ to Python. We always welcome contributions to the snippet translation. If you see an issue with the translation, you can also let us know by creating a ticket on https:/bugreports.qt.io/projects/PYSIDE
- copyTexture(dst, src[, desc=QRhiTextureCopyDescription()])¶
- Parameters:
dst –
QRhiTexturesrc –
QRhiTexturedesc –
QRhiTextureCopyDescription
Enqueues a texture-to-texture copy operation from
srcintodstas described bydesc.Note
The source texture
srcmust be created withUsedAsTransferSource.Note
The format of the textures must match. With most graphics APIs the data is copied as-is without any format conversions. If
dstandsrcare created with different formats, unspecified issues may arise.- generateMips(tex)¶
- Parameters:
tex –
QRhiTexture
Enqueues a mipmap generation operation for the specified texture
tex.Both 2D and cube textures are supported.
Note
The texture must be created with
MipMappedandUsedWithGenerateMips.Warning
QRhicannot guarantee that mipmaps can be generated for all supported texture formats. For example,RGBA32Fis not afilterableformat in OpenGL ES 3.0 and Metal on iOS, and therefore the mipmap generation request may fail. RGBA8 and RGBA16F are typically filterable, so it is recommended to use these formats when mipmap generation is desired.- hasOptimalCapacity()¶
- Return type:
bool
Returns true until the number of buffer and texture operations enqueued onto this batch is below a reasonable limit.
The return value is false when the number of buffer and/or texture operations added to this batch have reached, or are about to reach, a certain limit. The batch is fully functional afterwards as well, but may need to allocate additional memory. Therefore, a renderer that collects lots of buffer and texture updates in a single batch when preparing a frame may want to consider
submitting the batchandstarting a new onewhen this function returns false.- merge(other)¶
- Parameters:
other –
QRhiResourceUpdateBatch
Copies all queued operations from the
otherbatch into this one.Note
othermay no longer contain valid data after the merge operation, and must not be submitted, but it will still need to be released by callingrelease().This allows for a convenient pattern where resource updates that are already known during the initialization step are collected into a batch that is then merged into another when starting to first render pass later on:
void init() { initialUpdates = rhi->nextResourceUpdateBatch(); initialUpdates->uploadStaticBuffer(vbuf, vertexData); initialUpdates->uploadStaticBuffer(ibuf, indexData); // ... } void render() { QRhiResourceUpdateBatch *resUpdates = rhi->nextResourceUpdateBatch(); if (initialUpdates) { resUpdates->merge(initialUpdates); initialUpdates->release(); initialUpdates = nullptr; } // resUpdates->updateDynamicBuffer(...); cb->beginPass(rt, clearCol, clearDs, resUpdates); }
- readBackBuffer(buf, offset, size, result)¶
- Parameters:
buf –
QRhiBufferoffset – int
size – int
result –
QRhiReadbackResult
Enqueues reading back a region of the
QRhiBufferbuf. The size of the region is specified bysizein bytes,offsetis the offset in bytes to start reading from.A readback is asynchronous.
resultcontains a callback that is invoked when the operation has completed. The data is provided in QRhiReadbackResult::data . Upon successful completion that QByteArray will have a size equal tosize. On failure the QByteArray will be empty.Note
Reading buffers with a usage different than
UniformBufferis supported only when theReadBackNonUniformBufferfeature is reported as supported.Note
The asynchronous readback is guaranteed to have completed when one of the following conditions is met:
finish()has been called; or, at leastNframes have beensubmitted, including the frame that issued the readback operation, and therecording of a new framehas been started, whereNis theresource limit valuereturned forMaxAsyncReadbackFrames.- readBackTexture(rb, result)¶
- Parameters:
result –
QRhiReadbackResult
Enqueues a texture-to-host copy operation as described by
rb.Normally
rbwill specify aQRhiTextureas the source. However, when the swapchain in the current frame was created withUsedAsTransferSource, it can also be the source of the readback. For this, leave the texture set to null inrb.Unlike other operations, the results here need to be processed by the application. Therefore,
resultprovides not just the data but also a callback as operations on the batch are asynchronous by nature:rhi->beginFrame(swapchain); cb->beginPass(swapchain->currentFrameRenderTarget(), colorClear, dsClear); // ... QRhiReadbackResult *rbResult = new QRhiReadbackResult; rbResult->completed = [rbResult] { { const QImage::Format fmt = QImage::Format_RGBA8888_Premultiplied; // fits QRhiTexture::RGBA8 const uchar *p = reinterpret_cast<const uchar *>(rbResult->data.constData()); QImage image(p, rbResult->pixelSize.width(), rbResult->pixelSize.height(), fmt); image.save("result.png"); } delete rbResult; }; QRhiResourceUpdateBatch *u = nextResourceUpdateBatch(); QRhiReadbackDescription rb; // no texture -> uses the current backbuffer of sc u->readBackTexture(rb, rbResult); cb->endPass(u); rhi->endFrame(swapchain);
Note
The texture must be created with
UsedAsTransferSource.Note
Multisample textures cannot be read back.
Note
The readback returns raw byte data, in order to allow the applications to interpret it in any way they see fit. Be aware of the blending settings of rendering code: if the blending is set up to rely on premultiplied alpha, the results of the readback must also be interpreted as Premultiplied.
Note
When interpreting the resulting raw data, be aware that the readback happens with a byte ordered format. A
RGBA8texture maps therefore to byte orderedQImageformats, such as,Format_RGBA8888.Note
The asynchronous readback is guaranteed to have completed when one of the following conditions is met:
finish()has been called; or, at leastNframes have beensubmitted, including the frame that issued the readback operation, and therecording of a new framehas been started, whereNis theresource limit valuereturned forMaxAsyncReadbackFrames.A single readback operation copies one mip level of one layer (cubemap face or 3D slice or texture array element) at a time. The level and layer are specified by the respective fields in
rb.See also
- release()¶
Returns the batch to the pool. This should only be used when the batch is not passed to one of
beginPass(),endPass(), orresourceUpdate()because these implicitly call destroy().Note
QRhiResourceUpdateBatchinstances must never bydeletedby applications.- updateDynamicBuffer(buf, offset, data)¶
- Parameters:
buf –
QRhiBufferoffset – int
data –
QByteArray
Enqueues updating a region of a
QRhiBufferbufcreated with the typeDynamic.datais moved into the batch instead of copied with this overload.- updateDynamicBuffer(buf, offset, size, data)
- Parameters:
buf –
QRhiBufferoffset – int
size – int
data –
void
Enqueues updating a region of a
QRhiBufferbufcreated with the typeDynamic.The region is specified
offsetandsize. The actual bytes to write are specified bydatawhich must have at leastsizebytes available.datais copied and can safely be destroyed or changed once this function returns.Note
If host writes are involved, which is the case with updateDynamicBuffer() typically as such buffers are backed by host visible memory with most backends, they may accumulate within a frame. Thus pass 1 reading a region changed by a batch passed to pass 2 may see the changes specified in pass 2’s update batch.
Note
QRhitransparently manages double buffering in order to prevent stalling the graphics pipeline. The fact that aQRhiBuffermay have multiple native buffer objects underneath can be safely ignored when using theQRhiandQRhiResourceUpdateBatch.- uploadStaticBuffer(buf, data)¶
- Parameters:
buf –
QRhiBufferdata –
QByteArray
Enqueues updating the entire
QRhiBufferbufcreated with the typeImmutableorStatic.datais moved into the batch instead of copied with this overload.datasize must equal the size ofbuf.- uploadStaticBuffer(buf, data)
- Parameters:
buf –
QRhiBufferdata –
void
Enqueues updating the entire
QRhiBufferbufcreated with the typeImmutableorStatic.- uploadStaticBuffer(buf, offset, data)
- Parameters:
buf –
QRhiBufferoffset – int
data –
QByteArray
Enqueues updating a region of a
QRhiBufferbufcreated with the typeImmutableorStatic.datais moved into the batch instead of copied with this overload.- uploadStaticBuffer(buf, offset, size, data)
- Parameters:
buf –
QRhiBufferoffset – int
size – int
data –
void
Enqueues updating a region of a
QRhiBufferbufcreated with the typeImmutableorStatic.The region is specified
offsetandsize. The actual bytes to write are specified bydatawhich must have at leastsizebytes available.datais copied and can safely be destroyed or changed once this function returns.- uploadTexture(tex, image)¶
- Parameters:
tex –
QRhiTextureimage –
QImage
Enqueues uploading the image data for mip level 0 of layer 0 of the texture
tex.texmust have an uncompressed format. Its format must also be compatible with the QImage::format() ofimage. The source data is given inimage.- uploadTexture(tex, desc)
- Parameters:
tex –
QRhiTexturedesc –
QRhiTextureUploadDescription
Enqueues uploading the image data for one or more mip levels in one or more layers of the texture
tex.The details of the copy (source
QImageor compressed texture data, regions, target layers and levels) are described indesc.