diff options
-rw-r--r-- | src/gui/rhi/qrhi.cpp | 11 | ||||
-rw-r--r-- | src/gui/rhi/qrhi_p.h | 1 | ||||
-rw-r--r-- | src/gui/rhi/qrhigles2.cpp | 9 | ||||
-rw-r--r-- | src/gui/rhi/qrhimetal.mm | 2 | ||||
-rw-r--r-- | tests/manual/rhi/multiview/multiview.cpp | 2 |
5 files changed, 23 insertions, 2 deletions
diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index e5aa36817a..c0214debdf 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -7926,6 +7926,17 @@ void QRhiImplementation::textureFormatInfo(QRhiTexture::Format format, const QSi *bytesPerPixel = bpc; } +bool QRhiImplementation::isStencilSupportingFormat(QRhiTexture::Format format) const +{ + switch (format) { + case QRhiTexture::D24S8: + return true; + default: + break; + } + return false; +} + bool QRhiImplementation::sanityCheckGraphicsPipeline(QRhiGraphicsPipeline *ps) { if (ps->cbeginShaderStages() == ps->cendShaderStages()) { diff --git a/src/gui/rhi/qrhi_p.h b/src/gui/rhi/qrhi_p.h index 05df169a35..0a0e5e4d37 100644 --- a/src/gui/rhi/qrhi_p.h +++ b/src/gui/rhi/qrhi_p.h @@ -149,6 +149,7 @@ public: QSize *blockDim) const; void textureFormatInfo(QRhiTexture::Format format, const QSize &size, quint32 *bpl, quint32 *byteSize, quint32 *bytesPerPixel) const; + bool isStencilSupportingFormat(QRhiTexture::Format format) const; void registerResource(QRhiResource *res, bool ownsNativeResources = true) { diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 0355345f07..0d820c00ab 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -5706,8 +5706,17 @@ bool QGles2TextureRenderTarget::create() rhiD->f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->target, depthTexD->texture, 0); } else { + // This path is OpenGL (ES) 3.0+ and specific to multiview, so + // needsDepthStencilCombinedAttach is not a thing. The depth + // texture here must be an array with at least multiViewCount + // elements, and the format should be D24 or D32F for depth + // only, or D24S8 for depth and stencil. rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->texture, 0, 0, multiViewCount); + if (rhiD->isStencilSupportingFormat(depthTexD->format())) { + rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, depthTexD->texture, + 0, 0, multiViewCount); + } } if (d.colorAttCount == 0) { d.pixelSize = depthTexD->pixelSize(); diff --git a/src/gui/rhi/qrhimetal.mm b/src/gui/rhi/qrhimetal.mm index 1d0e84f871..345494c9f6 100644 --- a/src/gui/rhi/qrhimetal.mm +++ b/src/gui/rhi/qrhimetal.mm @@ -4209,7 +4209,7 @@ bool QMetalTextureRenderTarget::create() if (m_desc.depthTexture()) { QMetalTexture *depthTexD = QRHI_RES(QMetalTexture, m_desc.depthTexture()); d->fb.dsTex = depthTexD->d->tex; - d->fb.hasStencil = false; + d->fb.hasStencil = rhiD->isStencilSupportingFormat(depthTexD->format()); d->fb.depthNeedsStore = true; if (d->colorAttCount == 0) { d->pixelSize = depthTexD->pixelSize(); diff --git a/tests/manual/rhi/multiview/multiview.cpp b/tests/manual/rhi/multiview/multiview.cpp index 203bc2b668..1ade109d1c 100644 --- a/tests/manual/rhi/multiview/multiview.cpp +++ b/tests/manual/rhi/multiview/multiview.cpp @@ -96,7 +96,7 @@ void Window::customInit() // rendered with depth test/write enabled. The catch here is that we must // use a texture array for depth/stencil as well, so QRhiRenderBuffer is // not an option anymore. - d.ds = m_r->newTextureArray(QRhiTexture::D24, 2, QSize(512, 512), sampleCount, QRhiTexture::RenderTarget); + d.ds = m_r->newTextureArray(QRhiTexture::D24S8, 2, QSize(512, 512), sampleCount, QRhiTexture::RenderTarget); d.releasePool << d.ds; d.ds->create(); |