rhi: gl: Enable depth texture for multiview
Cannot just do like with other APIs and expose a view of multiple array layers. The only option is to use the multiview-specific API and specify layers 0..view_count-1 in the depth texture. This allows having depth in a multiview render pass with OpenGL. Note that this does not cover stencil. D24S8 does not work, so we may need to explore having a dedicated, separate stencil texture. Task-number: QTBUG-114896 Change-Id: I06ede1d77fef199148d595a55d144c96dc3cbc9d Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
3b7f99d04c
commit
4b233526f2
@ -5634,6 +5634,7 @@ bool QGles2TextureRenderTarget::create()
|
||||
|
||||
d.colorAttCount = 0;
|
||||
int attIndex = 0;
|
||||
int multiViewCount = 0;
|
||||
for (auto it = m_desc.cbeginColorAttachments(), itEnd = m_desc.cendColorAttachments(); it != itEnd; ++it, ++attIndex) {
|
||||
d.colorAttCount += 1;
|
||||
const QRhiColorAttachment &colorAtt(*it);
|
||||
@ -5644,10 +5645,11 @@ bool QGles2TextureRenderTarget::create()
|
||||
QGles2Texture *texD = QRHI_RES(QGles2Texture, texture);
|
||||
Q_ASSERT(texD->texture && texD->specified);
|
||||
if (texD->flags().testFlag(QRhiTexture::ThreeDimensional) || texD->flags().testFlag(QRhiTexture::TextureArray)) {
|
||||
if (it->multiViewCount() < 2) {
|
||||
if (colorAtt.multiViewCount() < 2) {
|
||||
rhiD->f->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + uint(attIndex), texD->texture,
|
||||
colorAtt.level(), colorAtt.layer());
|
||||
} else {
|
||||
multiViewCount = colorAtt.multiViewCount();
|
||||
rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + uint(attIndex), texD->texture,
|
||||
colorAtt.level(), colorAtt.layer(), colorAtt.multiViewCount());
|
||||
}
|
||||
@ -5696,8 +5698,13 @@ bool QGles2TextureRenderTarget::create()
|
||||
}
|
||||
} else {
|
||||
QGles2Texture *depthTexD = QRHI_RES(QGles2Texture, m_desc.depthTexture());
|
||||
rhiD->f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->target,
|
||||
depthTexD->texture, 0);
|
||||
if (multiViewCount < 2) {
|
||||
rhiD->f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->target,
|
||||
depthTexD->texture, 0);
|
||||
} else {
|
||||
rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->texture,
|
||||
0, 0, multiViewCount);
|
||||
}
|
||||
if (d.colorAttCount == 0) {
|
||||
d.pixelSize = depthTexD->pixelSize();
|
||||
d.sampleCount = 1;
|
||||
|
@ -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::D24S8, 2, QSize(512, 512), sampleCount, QRhiTexture::RenderTarget);
|
||||
d.ds = m_r->newTextureArray(QRhiTexture::D24, 2, QSize(512, 512), sampleCount, QRhiTexture::RenderTarget);
|
||||
d.releasePool << d.ds;
|
||||
d.ds->create();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user