@@ -88,6 +88,34 @@ inline static void resetGlState()
8888#endif
8989}
9090
91+ class Q_DECL_HIDDEN BufferRendererProxy : public WQuickTextureProxy
92+ {
93+ public:
94+ BufferRendererProxy (QQuickItem *parent = nullptr )
95+ : WQuickTextureProxy(parent) {}
96+
97+ inline WBufferRenderer *renderer () const {
98+ auto r = qobject_cast<WBufferRenderer*>(sourceItem ());
99+ if (sourceItem ())
100+ Q_ASSERT (r);
101+ return r;
102+ }
103+
104+ void setRenderer (WBufferRenderer *renderer) {
105+ auto oldRenderer = this ->renderer ();
106+ if (oldRenderer == renderer)
107+ return ;
108+ if (oldRenderer)
109+ oldRenderer->unlockCacheBuffer (this );
110+ if (renderer)
111+ renderer->lockCacheBuffer (this );
112+ setSourceItem (renderer);
113+ }
114+
115+ private:
116+ using WQuickTextureProxy::setSourceItem;
117+ };
118+
91119class OutputLayer ;
92120class Q_DECL_HIDDEN OutputHelper : public WOutputHelper
93121{
@@ -216,13 +244,13 @@ class Q_DECL_HIDDEN OutputHelper : public WOutputHelper
216244 WBufferRenderer *m_lastCommitBuffer = nullptr ;
217245 // only for render cursor
218246 QPointer<WBufferRenderer> m_cursorRenderer;
219- WQuickTextureProxy *m_cursorLayerProxy = nullptr ;
247+ BufferRendererProxy *m_cursorLayerProxy = nullptr ;
220248 bool m_cursorDirty = false ;
221249
222250 // for compositeLayers
223251 QPointer<WOutputViewport> m_output2;
224252 QPointer<QQuickItem> m_layerPorxyContainer;
225- QList<QPointer<WQuickTextureProxy >> m_layerProxys;
253+ QList<QPointer<BufferRendererProxy >> m_layerProxys;
226254};
227255
228256class Q_DECL_HIDDEN OutputLayer
@@ -503,18 +531,17 @@ void OutputHelper::sortLayers()
503531
504532void OutputHelper::cleanLayerCompositor ()
505533{
506- QList<QPointer<WQuickTextureProxy >> tmpList;
534+ QList<QPointer<BufferRendererProxy >> tmpList;
507535 std::swap (m_layerProxys, tmpList);
508536
509537 for (auto proxy : std::as_const (tmpList)) {
510538 if (!proxy)
511539 continue ;
512540
513541 WBufferRenderer *source = qobject_cast<WBufferRenderer*>(proxy->sourceItem ());
514- proxy->setSourceItem (nullptr );
542+ proxy->setRenderer (nullptr );
515543
516544 if (source) {
517- source->setForceCacheBuffer (false );
518545 source->resetTextureProvider ();
519546 }
520547 }
@@ -843,7 +870,6 @@ WBufferRenderer *OutputHelper::afterRender()
843870 // try fallback to cursor plane
844871 Q_ASSERT (needsSoftwareCompositeEndIndex == -1 );
845872 const auto layerData = needsCompositeLayers.at (i);
846- layerData->renderer ->setForceCacheBuffer (!hasHardwareCursor && isCursor);
847873 if (!hasHardwareCursor && isCursor
848874 && tryToHardwareCursor (layerData)) {
849875 Q_ASSERT (layerData->renderer ->lastBuffer ()->handle () == state.buffer );
@@ -945,11 +971,10 @@ WBufferRenderer *OutputHelper::compositeLayers(const QList<LayerData*> layers, b
945971 m_layerProxys.reserve (layers.size () + 1 );
946972
947973 if (m_layerProxys.isEmpty ())
948- m_layerProxys.append (new WQuickTextureProxy (m_layerPorxyContainer));
974+ m_layerProxys.append (new BufferRendererProxy (m_layerPorxyContainer));
949975
950976 auto outputProxy = m_layerProxys.first ();
951- bufferRenderer ()->setForceCacheBuffer (true );
952- outputProxy->setSourceItem (bufferRenderer ());
977+ outputProxy->setRenderer (bufferRenderer ());
953978 outputProxy->setSize (output->size ());
954979 } else {
955980 output = m_output;
@@ -964,19 +989,18 @@ WBufferRenderer *OutputHelper::compositeLayers(const QList<LayerData*> layers, b
964989
965990 for (int i = 0 ; i < layers.count (); ++i) {
966991 const int j = i + (usingShadowRenderer ? 1 : 0 );
967- WQuickTextureProxy *proxy = nullptr ;
992+ BufferRendererProxy *proxy = nullptr ;
968993 if (j < m_layerProxys.size ()) {
969994 proxy = m_layerProxys.at (j);
970995 } else {
971- proxy = new WQuickTextureProxy (m_layerPorxyContainer);
996+ proxy = new BufferRendererProxy (m_layerPorxyContainer);
972997 if (visualizeLayers ())
973998 createVisualRectangle (proxy, Qt::red);
974999 m_layerProxys.append (proxy);
9751000 }
9761001
9771002 LayerData *layer = layers.at (i);
978- layer->renderer ->setForceCacheBuffer (true );
979- proxy->setSourceItem (layer->renderer );
1003+ proxy->setRenderer (layer->renderer );
9801004 proxy->setPosition (layer->mapRect .topLeft ());
9811005 proxy->setSize (layer->mapRect .size ());
9821006 proxy->setZ (layer->layer ->layer ->z ());
@@ -1076,7 +1100,7 @@ bool OutputHelper::tryToHardwareCursor(const LayerData *layer)
10761100 m_cursorRenderer = new WBufferRenderer (renderWindow ()->contentItem ());
10771101 if (visualizeLayers ())
10781102 m_cursorRenderer->setClearColor (Qt::cyan);
1079- m_cursorLayerProxy = new WQuickTextureProxy (m_cursorRenderer);
1103+ m_cursorLayerProxy = new BufferRendererProxy (m_cursorRenderer);
10801104 m_cursorRenderer->setSourceList ({m_cursorLayerProxy}, false );
10811105 m_cursorRenderer->setOutput (m_output->output ());
10821106 m_cursorRenderer->setVisible (false );
@@ -1087,7 +1111,7 @@ bool OutputHelper::tryToHardwareCursor(const LayerData *layer)
10871111 m_cursorDirty = true ;
10881112 });
10891113 }
1090- m_cursorLayerProxy->setSourceItem (layer->renderer );
1114+ m_cursorLayerProxy->setRenderer (layer->renderer );
10911115 // Ensure render size same as source buffer size
10921116 m_cursorLayerProxy->setWidth (buffer->width );
10931117 m_cursorLayerProxy->setHeight (buffer->height );
0 commit comments