QRhiResourceUpdateBatch Class
업로드 및 복사 작업 유형을 기록합니다. 더 보기...
헤더: | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) 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) |
void | uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data) |
void | uploadStaticBuffer(QRhiBuffer *buf, const void *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 텍스처와 큐브 텍스처가 모두 지원됩니다.
참고: 텍스처는 QRhiTexture::MipMapped 및 QRhiTexture::UsedWithGenerateMips 으로 생성해야 합니다.
경고: QRhi 은 지원되는 모든 텍스처 형식에 대해 밉맵을 생성할 수 있다고 보장할 수 없습니다. 예를 들어 QRhiTexture::RGBA32F 은 OpenGL ES 3.0 및 iOS의 Metal에서 filterable
형식이 아니므로 밉맵 생성 요청이 실패할 수 있습니다. RGBA8 및 RGBA16F는 일반적으로 필터링이 가능하므로 밉맵 생성이 필요한 경우 이러한 형식을 사용하는 것이 좋습니다.
bool QRhiResourceUpdateBatch::hasOptimalCapacity() const
이 배치에 큐에 대기 중인 버퍼 및 텍스처 작업의 수가 적정 한도 이하가 될 때까지 참을 반환합니다.
이 배치에 추가된 버퍼 및/또는 텍스처 작업의 수가 특정 한계에 도달했거나 곧 도달할 경우 반환값은 거짓입니다. 이 배치는 이후에도 완전히 작동하지만 추가 메모리를 할당해야 할 수 있습니다. 따라서 프레임을 준비할 때 많은 버퍼 및 텍스처 업데이트를 단일 배치로 수집하는 렌더러는 이 함수가 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 을 소스로 지정합니다. 그러나 현재 프레임의 스왑체인이 QRhiSwapChain::UsedAsTransferSource 로 생성된 경우, 이 스왑체인이 읽기백의 소스가 될 수도 있습니다. 이를 위해 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 로 생성해야 합니다.
참고: 다중 샘플 텍스처는 다시 읽을 수 없습니다.
참고: 읽기백은 애플리케이션이 원하는 방식으로 해석할 수 있도록 원시 바이트 데이터를 반환합니다. 렌더링 코드의 블렌딩 설정에 유의하세요. 블렌딩이 미리 곱하기 알파에 의존하도록 설정된 경우, 읽기백 결과도 미리 곱하기 알파로 해석해야 합니다.
참고: 결과 원시 데이터를 해석할 때는 바이트 순서로 정렬된 형식으로 읽기백이 수행된다는 점에 유의하세요. 따라서 RGBA8 텍스처는 바이트 순서로 정렬된 QImage 형식(예: QImage::Format_RGBA8888)에 매핑됩니다.
참고: 비동기식 읽기백은 다음 조건 중 하나가 충족될 때 완료된 것으로 보장됩니다: 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 는 이 함수가 반환되면 안전하게 삭제하거나 변경할 수 있습니다.
참고: 호스트 쓰기가 관련된 경우, 즉 업데이트DynamicBuffer()의 경우 일반적으로 이러한 버퍼는 대부분의 백엔드에서 호스트 가시 메모리에 의해 지원되므로 프레임 내에 누적될 수 있습니다. 따라서 패스 2로 전달된 배치에 의해 변경된 영역을 읽는 패스 1은 패스 2의 업데이트 배치에 지정된 변경 사항을 볼 수 있습니다.
참고: QRhi 은 그래픽 파이프라인이 멈추는 것을 방지하기 위해 이중 버퍼링을 투명하게 관리합니다. QRhi 및 QRhiResourceUpdateBatch 을 사용할 때는 QRhiBuffer 아래에 여러 개의 기본 버퍼 객체가 있을 수 있다는 사실을 안전하게 무시할 수 있습니다.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 QRhiBuffer buf 의 리전 업데이트를 큐에 넣습니다.
영역은 offset 및 size 으로 지정됩니다. 실제 쓸 바이트는 data 으로 지정되며 최소 size 바이트가 있어야 합니다. data 은 이 함수가 반환되면 안전하게 삭제하거나 변경할 수 있습니다.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, const void *data)
이 함수는 과부하된 함수입니다.
QRhiBuffer::Immutable 또는 QRhiBuffer::Static 유형으로 생성된 QRhiBuffer buf 전체 업데이트를 큐에 넣습니다.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QImage &image)
텍스처 0 레이어의 밉 레벨 0에 대한 이미지 데이터 업로드를 대기열에 추가합니다 tex.
tex 압축되지 않은 형식이어야 합니다. 형식은 image 의 QImage::format()와도 호환되어야 합니다. 소스 데이터는 image 에 제공됩니다.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc)
텍스처의 하나 이상의 레이어에 있는 하나 이상의 밉 레벨에 대한 이미지 데이터를 업로드 대기열에 넣습니다 tex.
사본의 세부 사항(소스 QImage 또는 압축 텍스처 데이터, 영역, 타깃 레이어 및 레벨)은 desc 에 설명되어 있습니다.
© 2025 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.