summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2019-02-25 11:56:07 +0200
committerKaj Grönholm <kaj.gronholm@qt.io>2019-02-28 05:58:02 +0000
commitc4a7d612a83a7a97d00f99d5b2f049b73a73a9b9 (patch)
treea095151f4c524bd4f9d470b558e852032c6a2a31
parenta19a899113d5765364984173aeb87fe83444f754 (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.cpp47
-rw-r--r--src/runtime/q3dsscenemanager_p.h3
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() { }