From 97d7fdfeeed5eb30360344277bcb48cf85b839af Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 22 Jun 2023 12:09:23 +0200 Subject: [PATCH] rhi: gl: Implement msaa resolve for multiview Task-number: QTBUG-114790 Change-Id: I295547576ff6fe45c8fe9d03ecd678d323b9ee30 Reviewed-by: Andy Nichols --- src/gui/rhi/qrhigles2.cpp | 49 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 8d60cffb180..8d5fea12bec 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -4369,28 +4369,33 @@ void QRhiGles2::endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resource qWarning("Resolve source (%dx%d) and target (%dx%d) size does not match", texD->pixelSize().width(), texD->pixelSize().height(), size.width(), size.height()); } - QGles2CommandBuffer::Command &cmd(cbD->commands.get()); - cmd.cmd = QGles2CommandBuffer::Command::BlitFromTexture; - if (texD->m_flags.testFlag(QRhiTexture::CubeMap)) - cmd.args.blitFromTexture.srcTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + uint(colorAtt.layer()); - else - cmd.args.blitFromTexture.srcTarget = texD->target; - cmd.args.blitFromTexture.srcTexture = texD->texture; - cmd.args.blitFromTexture.srcLevel = colorAtt.level(); - cmd.args.blitFromTexture.srcLayer = 0; - if (texD->m_flags.testFlag(QRhiTexture::ThreeDimensional) || texD->m_flags.testFlag(QRhiTexture::TextureArray)) - cmd.args.blitFromTexture.srcLayer = colorAtt.layer(); - cmd.args.blitFromTexture.w = size.width(); - cmd.args.blitFromTexture.h = size.height(); - if (resolveTexD->m_flags.testFlag(QRhiTexture::CubeMap)) - cmd.args.blitFromTexture.dstTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + uint(colorAtt.resolveLayer()); - else - cmd.args.blitFromTexture.dstTarget = resolveTexD->target; - cmd.args.blitFromTexture.dstTexture = resolveTexD->texture; - cmd.args.blitFromTexture.dstLevel = colorAtt.resolveLevel(); - cmd.args.blitFromTexture.dstLayer = 0; - if (resolveTexD->m_flags.testFlag(QRhiTexture::ThreeDimensional) || resolveTexD->m_flags.testFlag(QRhiTexture::TextureArray)) - cmd.args.blitFromTexture.dstLayer = colorAtt.resolveLayer(); + const int resolveCount = colorAtt.multiViewCount() >= 2 ? colorAtt.multiViewCount() : 1; + for (int resolveIdx = 0; resolveIdx < resolveCount; ++resolveIdx) { + const int srcLayer = colorAtt.layer() + resolveIdx; + const int dstLayer = colorAtt.resolveLayer() + resolveIdx; + QGles2CommandBuffer::Command &cmd(cbD->commands.get()); + cmd.cmd = QGles2CommandBuffer::Command::BlitFromTexture; + if (texD->m_flags.testFlag(QRhiTexture::CubeMap)) + cmd.args.blitFromTexture.srcTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + uint(srcLayer); + else + cmd.args.blitFromTexture.srcTarget = texD->target; + cmd.args.blitFromTexture.srcTexture = texD->texture; + cmd.args.blitFromTexture.srcLevel = colorAtt.level(); + cmd.args.blitFromTexture.srcLayer = 0; + if (texD->m_flags.testFlag(QRhiTexture::ThreeDimensional) || texD->m_flags.testFlag(QRhiTexture::TextureArray)) + cmd.args.blitFromTexture.srcLayer = srcLayer; + cmd.args.blitFromTexture.w = size.width(); + cmd.args.blitFromTexture.h = size.height(); + if (resolveTexD->m_flags.testFlag(QRhiTexture::CubeMap)) + cmd.args.blitFromTexture.dstTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + uint(dstLayer); + else + cmd.args.blitFromTexture.dstTarget = resolveTexD->target; + cmd.args.blitFromTexture.dstTexture = resolveTexD->texture; + cmd.args.blitFromTexture.dstLevel = colorAtt.resolveLevel(); + cmd.args.blitFromTexture.dstLayer = 0; + if (resolveTexD->m_flags.testFlag(QRhiTexture::ThreeDimensional) || resolveTexD->m_flags.testFlag(QRhiTexture::TextureArray)) + cmd.args.blitFromTexture.dstLayer = dstLayer; + } } } }