QRhiResourceUpdateBatch Class
기록 업로드 및 복사 유형과 같은 작업. 더 보기...
| 헤더: | #include <rhi/qrhi.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS GuiPrivate) target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
| qmake: | QT += gui-private |
| 다음부터: | Qt 6.6부터 |
공개 함수
| void | copyTexture(QRhiTexture *dst, QRhiTexture *src, const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription()) |
| void | generateMips(QRhiTexture *tex) |
| bool | hasOptimalCapacity() const |
| void | merge(QRhiResourceUpdateBatch *other) |
| void | readBackBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, QRhiReadbackResult *result) |
| void | readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result) |
| void | release() |
| void | updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data) |
(since 6.10) void | updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data) |
| void | uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data) |
(since 6.10) void | uploadStaticBuffer(QRhiBuffer *buf, QByteArray data) |
| void | uploadStaticBuffer(QRhiBuffer *buf, const void *data) |
(since 6.10) void | uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data) |
| void | uploadTexture(QRhiTexture *tex, const QImage &image) |
| void | uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc) |
상세 설명
QRhi 부터는 더 이상 임의의 시점에 복사 유형의 작업을 수행할 수 없습니다. 대신, 이러한 모든 작업은 배치로 기록된 후, 가장 일반적으로 ` QRhiCommandBuffer::beginPass()`로 전달됩니다. 그 후 내부적으로 어떤 일이 일어나는지는 애플리케이션에 공개되지 않습니다. 즉, 기본 구현은 이러한 작업을 연기하거나 다양한 방식으로 구현할 수 있습니다.
리소스 업데이트 배치는 그래픽 리소스를 소유하지 않으며, 자체적으로 실제 작업을 수행하지도 않습니다. 오히려 업데이트, 업로드 및 복사 유형의 명령을 위한 명령 버퍼로 간주해야 합니다.
풀에서 사용 가능한 빈 배치를 가져오려면 QRhi::nextResourceUpdateBatch()를 호출하십시오.
참고: 이 함수는 호환성 보장이 제한된 RHI API입니다. 자세한 내용은 QRhi 를 참조하십시오.
멤버 함수 문서
void QRhiResourceUpdateBatch::copyTexture(QRhiTexture *dst, QRhiTexture *src, const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription())
desc 에 설명된 대로 src 에서 dst 로 텍스처 간 복사 작업을 큐에 등록합니다.
참고: 소스 텍스처 src 는 QRhiTexture::UsedAsTransferSource 를 사용하여 생성되어야 합니다.
참고: 텍스처의형식이 일치해야 합니다. 대부분의 그래픽 API에서는 형식 변환 없이 데이터가 있는 그대로 복사됩니다. dst 와 src 가 서로 다른 형식으로 생성된 경우, 예기치 못한 문제가 발생할 수 있습니다.
void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)
지정된 텍스처 tex 에 대한 밉맵 생성 작업을 대기열에 추가합니다.
2D 및 큐브 텍스처가 지원됩니다. 1D 및 3D 텍스처는 각각 QRhi::OneDimensionalTextureMipmaps 또는 QRhi::ThreeDimensionalTextureMipmaps 기능이 지원된다고 보고된 경우에만 지원됩니다.
참고: 텍스처는 QRhiTexture::MipMapped 및 QRhiTexture::UsedWithGenerateMips 기능을 사용하여 생성되어야 합니다.
경고: QRhi 은 지원되는 모든 텍스처 형식에 대해 밉맵 생성이 가능함을 보장할 수 없습니다. 예를 들어, QRhiTexture::RGBA32F 은 OpenGL ES 3.0 및 iOS의 Metal에서 filterable 형식이 아니므로 밉맵 생성 요청이 실패할 수 있습니다. RGBA8 및 RGBA16F는 일반적으로 필터링이 가능하므로, 밉맵 생성이 필요한 경우 이러한 형식을 사용하는 것이 좋습니다.
bool QRhiResourceUpdateBatch::hasOptimalCapacity() const
이 배치에 큐에 등록된 버퍼 및 텍스처 연산 횟수가 적정 한도 미만이 될 때까지 true를 반환합니다.
이 배치에 추가된 버퍼 및/또는 텍스처 연산 횟수가 특정 한도에 도달했거나 곧 도달할 경우 반환 값은 false입니다. 이후에도 배치는 정상적으로 작동하지만, 추가 메모리를 할당해야 할 수도 있습니다. 따라서 프레임을 준비할 때 단일 배치에 많은 버퍼 및 텍스처 업데이트를 모으는 렌더러의 경우, 이 함수가 false를 반환할 때 submitting the batch 및 starting a new one 를 고려해 볼 수 있습니다.
void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)
other 배치에 대기 중인 모든 작업을 이 배치로 복사합니다.
참고: 병합 작업이 완료된 후에는` other ` 에 유효한 데이터가 더 이상 포함되어 있지 않을 수 있으므로, 이 배치를 제출해서는 안 되지만, ` release()`를 호출하여 반드시 해제해야 합니다.
이를 통해 초기화 단계에서 이미 알려진 리소스 업데이트를 배치로 모은 다음, 나중에 첫 번째 렌더링 패스를 시작할 때 다른 배치와 병합하는 편리한 패턴을 사용할 수 있습니다:
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);
}void QRhiResourceUpdateBatch::readBackBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, QRhiReadbackResult *result)
QRhiBuffer buf 의 특정 영역을 다시 읽는 작업을 큐에 추가합니다. 영역의 크기는 size 에서 바이트 단위로 지정되며, offset 는 읽기를 시작할 오프셋(바이트 단위)입니다.
읽기 작업은 비동기적으로 수행됩니다. result 에는 작업이 완료되면 호출되는 콜백이 포함되어 있습니다. 데이터는 QRhiReadbackResult::data 에 제공됩니다. 작업이 성공적으로 완료되면 QByteArray 의 크기는 size 와 동일해집니다. 실패할 경우 QByteArray 는 비어 있게 됩니다.
참고: QRhiBuffer::UniformBuffer 와 다른 방식으로 버퍼를읽는 기능은 QRhi::ReadBackNonUniformBuffer 기능이 지원된다고 보고된 경우에만 지원됩니다.
참고: 비동기리드백은 다음 조건 중 하나가 충족될 때 완료된 것으로 보장됩니다. finish()이 호출되었거나, 리드백 작업을 발행한 프레임을 포함하여 최소 N 개의 프레임이 submitted 되었으며, recording of a new frame 가 시작된 경우입니다. 여기서 N 는 QRhi::MaxAsyncReadbackFrames 에 대해 반환된 resource limit value 입니다.
readBackTexture(), QRhi::isFeatureSupported() 및 QRhi::resourceLimit()도 참조하십시오 .
void QRhiResourceUpdateBatch::readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result)
rb 에 설명된 대로 텍스처-호스트 복사 작업을 대기열에 추가합니다.
일반적으로 rb 는 소스로 QRhiTexture 를 지정합니다. 그러나 현재 프레임의 스왑체인(swapchain)이 QRhiSwapChain::UsedAsTransferSource 를 통해 생성된 경우, 해당 스왑체인이 리드백(readback)의 소스가 될 수도 있습니다. 이를 위해서는 rb 에서 텍스처를 null로 설정해 두어야 합니다.
다른 연산과 달리, 여기서의 결과는 애플리케이션에서 처리해야 합니다. 따라서 result 는 데이터뿐만 아니라 콜백도 제공합니다. 이는 배치에 대한 연산이 본질적으로 비동기적이기 때문입니다:
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);참고: 텍스처는 QRhiTexture::UsedAsTransferSource 를 사용하여 생성해야 합니다.
참고: 멀티샘플 텍스처는 다시 읽을 수 없습니다.
참고: 읽기 작업은 애플리케이션이 원하는 방식으로 해석할 수 있도록 원시 바이트 데이터를 반환합니다. 렌더링 코드의 블렌딩 설정에 유의하십시오. 블렌딩이 프리멀티플라이드 알파(premultiplied alpha)에 의존하도록 설정된 경우, 읽기 결과도 프리멀티플라이드로 해석되어야 합니다.
참고: 결과 원시 데이터를 해석할때 , 리드백은 바이트 순서(byte ordered) 형식으로 이루어진다는 점에 유의하십시오. 따라서 ` RGBA8 ` 텍스처는 ` QImage::Format_RGBA8888`과 같은 바이트 순서 ` QImage ` 형식으로 매핑됩니다.
참고: 비동기리드백은 다음 조건 중 하나가 충족될 때 완료된 것으로 보장됩니다: finish()가 호출되었거나, 리드백 작업을 발행한 프레임을 포함하여 최소 N 프레임이 submitted 되었으며, recording of a new frame 가 시작된 경우입니다. 여기서 N 는 QRhi::MaxAsyncReadbackFrames 에 대해 반환된 resource limit value 입니다.
단일 리드백 작업은 한 번에 하나의 레이어(큐브맵 면, 3D 슬라이스 또는 텍스처 배열 요소)의 미프 레벨 하나를 복사합니다. 레벨과 레이어는 rb 의 각 필드에 의해 지정됩니다.
readBackBuffer() 및 QRhi::resourceLimit()도 참조하십시오 .
void QRhiResourceUpdateBatch::release()
배치를 풀로 반환합니다. 이 메서드는 배치가 QRhiCommandBuffer::beginPass(), QRhiCommandBuffer::endPass() 또는 QRhiCommandBuffer::resourceUpdate() 중 하나로 전달되지 않은 경우에만 사용해야 합니다. 해당 메서드들은 암묵적으로 destroy()를 호출하기 때문입니다.
참고: 애플리케이션에서는 절대로QRhiResourceUpdateBatch 인스턴스를 deleted 로 전달해서는 안 됩니다.
void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
QRhiBuffer::Dynamic 유형으로 생성된 QRhiBuffer buf 의 특정 영역을 업데이트하는 작업을 큐에 추가합니다.
해당 영역은 offset 및 size 에서 지정됩니다. 실제로 쓰여질 바이트는 data 로 지정되며, 이 영역에는 최소 size 바이트의 여유 공간이 있어야 합니다.
data 이 버퍼는 복사된 것이므로, 이 함수가 반환된 후에는 안전하게 파기하거나 변경할 수 있습니다.
참고: 호스트 쓰기 작업이 포함되는경우 (대부분의 백엔드에서 이러한 버퍼는 호스트 가시 메모리에 의해 뒷받침되므로 updateDynamicBuffer()의 경우 일반적으로 해당됨), 이러한 작업은 한 프레임 내에 누적될 수 있습니다. 따라서 1단계에서 2단계로 전달된 배치에 의해 변경된 영역을 읽으면, 2단계의 업데이트 배치에 지정된 변경 사항을 확인할 수 있습니다.
참고: ` QRhi `는 그래픽 파이프라인의 정지를 방지하기 위해 더블 버퍼링을 투명하게 관리합니다. ` QRhiBuffer `의 내부에 여러 개의 네이티브 버퍼 객체가 있을 수 있다는 사실은 ` QRhi ` 및 ` QRhiResourceUpdateBatch`를 사용할 때 안전하게 무시할 수 있습니다.
[since 6.10] void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)
QRhiBuffer::Dynamic 유형으로 생성된 QRhiBuffer buf 의 특정 영역을 업데이트하는 작업을 큐에 추가합니다. .
data 이 오버로드에서는 복사하는 대신 배치로 이동됩니다.
이 함수는 오버로드된 함수입니다.
이 함수는 Qt 6.10에서 도입되었습니다.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 QRhiBuffer buf 의 특정 영역을 업데이트하는 작업을 대기열에 추가합니다.
해당 영역은 offset 및 size 에서 지정됩니다. 실제로 쓸 바이트는 data 로 지정되며, 이 영역에는 최소한 size 바이트의 여유 공간이 있어야 합니다.
data 이 함수가 반환되면 복사된 데이터는 안전하게 삭제하거나 변경할 수 있습니다.
[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, QByteArray data)
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 QRhiBuffer buf 전체를 업데이트하는 작업을 큐에 추가합니다.
data 이 오버로드에서는 복사하는 대신 xml-ph-0000@deepl.internal을 배치로 이동시킵니다.
data size는 buf 의 크기와 같아야 합니다.
이 함수는 오버로드된 함수입니다.
이 함수는 Qt 6.10에서 도입되었습니다.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, const void *data)
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 전체 QRhiBuffer buf 에 대한 업데이트 작업을 대기열에 추가합니다.
이 함수는 오버로드된 함수입니다.
[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 QRhiBuffer buf 의 특정 영역을 업데이트하는 작업을 큐에 추가합니다. 의 해당 영역은 이 오버로드에서 복사되는 대신 배치로 이동됩니다.
data 이 오버로드에서는 데이터가 복사되는 대신 배치로 이동됩니다.
이 함수는 오버로드된 함수입니다.
이 함수는 Qt 6.10에서 도입되었습니다.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QImage &image)
tex 텍스처의 레이어 0, 미프 레벨 0에 해당하는 이미지 데이터 업로드를 대기열에 추가합니다.
tex 압축되지 않은 형식이어야 합니다. 또한 이 형식은 image 의 QImage::format() 함수와 호환되어야 합니다. 소스 데이터는 image 에 명시되어 있습니다.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc)
텍스처 tex 의 하나 이상의 레이어에 포함된 하나 이상의 미프 레벨에 대한 이미지 데이터를 업로드 대기열에 추가합니다.
복사 작업의 세부 사항(소스 QImage 또는 압축된 텍스처 데이터, 영역, 대상 레이어 및 레벨)은 desc 에 설명되어 있습니다.
© 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.