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;
|
d.colorAttCount = 0;
|
||||||
int attIndex = 0;
|
int attIndex = 0;
|
||||||
|
int multiViewCount = 0;
|
||||||
for (auto it = m_desc.cbeginColorAttachments(), itEnd = m_desc.cendColorAttachments(); it != itEnd; ++it, ++attIndex) {
|
for (auto it = m_desc.cbeginColorAttachments(), itEnd = m_desc.cendColorAttachments(); it != itEnd; ++it, ++attIndex) {
|
||||||
d.colorAttCount += 1;
|
d.colorAttCount += 1;
|
||||||
const QRhiColorAttachment &colorAtt(*it);
|
const QRhiColorAttachment &colorAtt(*it);
|
||||||
@ -5644,10 +5645,11 @@ bool QGles2TextureRenderTarget::create()
|
|||||||
QGles2Texture *texD = QRHI_RES(QGles2Texture, texture);
|
QGles2Texture *texD = QRHI_RES(QGles2Texture, texture);
|
||||||
Q_ASSERT(texD->texture && texD->specified);
|
Q_ASSERT(texD->texture && texD->specified);
|
||||||
if (texD->flags().testFlag(QRhiTexture::ThreeDimensional) || texD->flags().testFlag(QRhiTexture::TextureArray)) {
|
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,
|
rhiD->f->glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + uint(attIndex), texD->texture,
|
||||||
colorAtt.level(), colorAtt.layer());
|
colorAtt.level(), colorAtt.layer());
|
||||||
} else {
|
} else {
|
||||||
|
multiViewCount = colorAtt.multiViewCount();
|
||||||
rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + uint(attIndex), texD->texture,
|
rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + uint(attIndex), texD->texture,
|
||||||
colorAtt.level(), colorAtt.layer(), colorAtt.multiViewCount());
|
colorAtt.level(), colorAtt.layer(), colorAtt.multiViewCount());
|
||||||
}
|
}
|
||||||
@ -5696,8 +5698,13 @@ bool QGles2TextureRenderTarget::create()
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
QGles2Texture *depthTexD = QRHI_RES(QGles2Texture, m_desc.depthTexture());
|
QGles2Texture *depthTexD = QRHI_RES(QGles2Texture, m_desc.depthTexture());
|
||||||
|
if (multiViewCount < 2) {
|
||||||
rhiD->f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->target,
|
rhiD->f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->target,
|
||||||
depthTexD->texture, 0);
|
depthTexD->texture, 0);
|
||||||
|
} else {
|
||||||
|
rhiD->glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexD->texture,
|
||||||
|
0, 0, multiViewCount);
|
||||||
|
}
|
||||||
if (d.colorAttCount == 0) {
|
if (d.colorAttCount == 0) {
|
||||||
d.pixelSize = depthTexD->pixelSize();
|
d.pixelSize = depthTexD->pixelSize();
|
||||||
d.sampleCount = 1;
|
d.sampleCount = 1;
|
||||||
|
@ -96,7 +96,7 @@ void Window::customInit()
|
|||||||
// rendered with depth test/write enabled. The catch here is that we must
|
// 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
|
// use a texture array for depth/stencil as well, so QRhiRenderBuffer is
|
||||||
// not an option anymore.
|
// 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.releasePool << d.ds;
|
||||||
d.ds->create();
|
d.ds->create();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user