diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-02-25 11:56:07 +0200 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2019-02-28 05:58:02 +0000 |
commit | c4a7d612a83a7a97d00f99d5b2f049b73a73a9b9 (patch) | |
tree | a095151f4c524bd4f9d470b558e852032c6a2a31 | |
parent | a19a899113d5765364984173aeb87fe83444f754 (diff) |
Reduce stereoscopic texture sizes when unused
Initially and when left & right eye textures are not used,
minimize their size.
Task-number: QT3DS-3084
Change-Id: Id6b5252cb1a9bc8b9bca64696268b71353a95ca4
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r-- | src/runtime/q3dsscenemanager.cpp | 47 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 3 |
2 files changed, 34 insertions, 16 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp index 0b307b9..4cabab1 100644 --- a/src/runtime/q3dsscenemanager.cpp +++ b/src/runtime/q3dsscenemanager.cpp @@ -1368,6 +1368,7 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, // parentSize could well be (0, 0) at this stage still, nevermind that const QSize layerSize = calculateLayerSize(layer3DS, parentSize); const QSize layerPixelSize = safeLayerPixelSize(layerSize, ssaaScaleFactor); + const QSize dummyLayerSize = QSize(1,1); Q3DSLayerAttached *layerData = new Q3DSLayerAttached; ViewportSet viewports; @@ -1386,9 +1387,12 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, // Create color and depth-stencil buffers for this layer // Stereoscopic left-eye - Qt3DRender::QAbstractTexture *colorTexLeft; - Qt3DRender::QAbstractTexture *dsTexOrRbLeft; - Qt3DRender::QRenderTarget *rtLeft = newLayerRenderTarget(layerPixelSize, msaaSampleCount, &colorTexLeft, &dsTexOrRbLeft, layerFgRoot, layer3DS); + Q3DSLayerAttached::SizeManagedTexture colorTexLeft; + Q3DSLayerAttached::SizeManagedTexture dsTexOrRbLeft; + // Mark textures being for stereoscopic usage + colorTexLeft.flags |= Q3DSLayerAttached::SizeManagedTexture::StereoscopicView; + dsTexOrRbLeft.flags |= Q3DSLayerAttached::SizeManagedTexture::StereoscopicView; + Qt3DRender::QRenderTarget *rtLeft = newLayerRenderTarget(dummyLayerSize, msaaSampleCount, &colorTexLeft.texture, &dsTexOrRbLeft.texture, layerFgRoot, layer3DS); m_profiler->trackNewObject(rtLeft, Q3DSProfiler::RenderTargetObject, "RT for layer %s", layer3DS->id().constData()); rtSelectorLeft->setTarget(rtLeft); @@ -1398,9 +1402,12 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, // Create color and depth-stencil buffers for this layer // Stereoscopic right-eye - Qt3DRender::QAbstractTexture *colorTexRight; - Qt3DRender::QAbstractTexture *dsTexOrRbRight; - Qt3DRender::QRenderTarget *rtRight = newLayerRenderTarget(layerPixelSize, msaaSampleCount, &colorTexRight, &dsTexOrRbRight, layerFgRoot, layer3DS); + Q3DSLayerAttached::SizeManagedTexture colorTexRight; + Q3DSLayerAttached::SizeManagedTexture dsTexOrRbRight; + // Mark textures being for stereoscopic usage + colorTexRight.flags |= Q3DSLayerAttached::SizeManagedTexture::StereoscopicView; + dsTexOrRbRight.flags |= Q3DSLayerAttached::SizeManagedTexture::StereoscopicView; + Qt3DRender::QRenderTarget *rtRight = newLayerRenderTarget(dummyLayerSize, msaaSampleCount, &colorTexRight.texture, &dsTexOrRbRight.texture, layerFgRoot, layer3DS); m_profiler->trackNewObject(rtRight, Q3DSProfiler::RenderTargetObject, "RT for layer %s", layer3DS->id().constData()); rtSelectorRight->setTarget(rtRight); @@ -1442,10 +1449,10 @@ void Q3DSSceneManager::buildLayer(Q3DSLayerNode *layer3DS, layerData->sizeManagedTextures << colorTex << dsTexOrRb; // Setup for stereo left / eye - layerData->eyeLeft->layerTexture = colorTexLeft; - layerData->eyeRight->layerTexture = colorTexRight; - layerData->eyeLeft->layerDS = dsTexOrRbLeft; - layerData->eyeRight->layerDS = dsTexOrRbRight; + layerData->eyeLeft->layerTexture = colorTexLeft.texture; + layerData->eyeRight->layerTexture = colorTexRight.texture; + layerData->eyeLeft->layerDS = dsTexOrRbLeft.texture; + layerData->eyeRight->layerDS = dsTexOrRbRight.texture; layerData->eyeLeft->compositorSourceParam = new Qt3DRender::QParameter(QLatin1String("texLeft"), layerData->eyeLeft->layerTexture); layerData->eyeRight->compositorSourceParam = new Qt3DRender::QParameter(QLatin1String("texRight"), layerData->eyeRight->layerTexture); layerData->eyeLeft->rtSelector = rtSelectorLeft; @@ -2055,13 +2062,23 @@ void Q3DSSceneManager::setLayerSizeProperties(Q3DSLayerNode *layer3DS) const QSize layerSize = safeLayerPixelSize(data->layerSize, 1); // for when SSAA is to be ignored for (const Q3DSLayerAttached::SizeManagedTexture &t : data->sizeManagedTextures) { if (!t.flags.testFlag(Q3DSLayerAttached::SizeManagedTexture::CustomSizeCalculation)) { + int w = layerSize.width(); + int h = layerSize.height(); if (!t.flags.testFlag(Q3DSLayerAttached::SizeManagedTexture::IgnoreSSAA)) { - t.texture->setWidth(layerPixelSize.width()); - t.texture->setHeight(layerPixelSize.height()); - } else { - t.texture->setWidth(layerSize.width()); - t.texture->setHeight(layerSize.height()); + w = layerPixelSize.width(); + h = layerPixelSize.height(); + } + if (t.flags.testFlag(Q3DSLayerAttached::SizeManagedTexture::StereoscopicView) + && !m_engine->isStereoscopic()) { + // When not in stereoscopic mode, reduce left & right eye texture sizes to + // not consume memory. Once user switches to stereoscopic, they will be resized + // automatically to full size again. + w = 1; + h = 1; + } + t.texture->setWidth(w); + t.texture->setHeight(h); } if (t.sizeChangeCallback) t.sizeChangeCallback(layer3DS); diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h index 5cdb806..cc0cbaf 100644 --- a/src/runtime/q3dsscenemanager_p.h +++ b/src/runtime/q3dsscenemanager_p.h @@ -304,7 +304,8 @@ public: struct SizeManagedTexture { enum Flag { IgnoreSSAA = 0x01, - CustomSizeCalculation = 0x02 + CustomSizeCalculation = 0x02, + StereoscopicView = 0x04 }; Q_DECLARE_FLAGS(Flags, Flag) SizeManagedTexture() { } |