Skip to content

Commit 35fdcb7

Browse files
committed
Use lockCacheBuffer instead of WBufferRenderer::setForceCacheBuffer
1 parent 8556b58 commit 35fdcb7

File tree

3 files changed

+70
-30
lines changed

3 files changed

+70
-30
lines changed

src/server/qtquick/private/wbufferrenderer.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ class Q_DECL_HIDDEN TextureProvider : public WBufferTextureProvider
124124
}
125125

126126
void setBuffer(qw_buffer *buffer, const pixman_region32_t *damage = nullptr) {
127-
Q_ASSERT(item);
128-
129127
if (buffer && buffer == qwBuffer()) {
130128
m_texture->qwtexture->update_from_buffer(*buffer, damage);
131129
Q_EMIT textureChanged();
@@ -136,8 +134,10 @@ class Q_DECL_HIDDEN TextureProvider : public WBufferTextureProvider
136134
cleanTexture();
137135

138136
Q_ASSERT(!m_texture);
139-
if (buffer)
137+
if (buffer) {
138+
Q_ASSERT(item);
140139
m_texture = new Texture(item->window(), item->output()->renderer(), buffer);
140+
}
141141

142142
Q_EMIT textureChanged();
143143
}
@@ -195,7 +195,6 @@ class Q_DECL_HIDDEN TextureProvider : public WBufferTextureProvider
195195
WBufferRenderer::WBufferRenderer(QQuickItem *parent)
196196
: QQuickItem(parent)
197197
, m_cacheBuffer(false)
198-
, m_forceCacheBuffer(false)
199198
, m_hideSource(false)
200199
{
201200
m_textureProvider.reset(new TextureProvider(this));
@@ -293,6 +292,26 @@ void WBufferRenderer::setCacheBuffer(bool newCacheBuffer)
293292
Q_EMIT cacheBufferChanged();
294293
}
295294

295+
void WBufferRenderer::lockCacheBuffer(QObject *owner)
296+
{
297+
if (m_cacheBufferLocker.contains(owner))
298+
return;
299+
m_cacheBufferLocker.append(owner);
300+
connect(owner, &QObject::destroyed, this, [this] {
301+
unlockCacheBuffer(sender());
302+
});
303+
updateTextureProvider();
304+
}
305+
306+
void WBufferRenderer::unlockCacheBuffer(QObject *owner)
307+
{
308+
auto ok = m_cacheBufferLocker.removeOne(owner);
309+
Q_ASSERT(ok);
310+
ok = disconnect(owner, &QObject::destroyed, this, nullptr);
311+
Q_ASSERT(ok);
312+
updateTextureProvider();
313+
}
314+
296315
QColor WBufferRenderer::clearColor() const
297316
{
298317
return m_clearColor;
@@ -690,14 +709,6 @@ void WBufferRenderer::componentComplete()
690709
QQuickItem::componentComplete();
691710
}
692711

693-
void WBufferRenderer::setForceCacheBuffer(bool force)
694-
{
695-
if (m_forceCacheBuffer == force)
696-
return;
697-
m_forceCacheBuffer = force;
698-
updateTextureProvider();
699-
}
700-
701712
void WBufferRenderer::resetTextureProvider()
702713
{
703714
if (m_textureProvider)
@@ -706,6 +717,9 @@ void WBufferRenderer::resetTextureProvider()
706717

707718
void WBufferRenderer::updateTextureProvider()
708719
{
720+
if (!m_textureProvider)
721+
return;
722+
709723
if (shouldCacheBuffer() && m_textureProvider->qwBuffer() != m_lastBuffer) {
710724
m_textureProvider->setBuffer(m_lastBuffer);
711725
} else {

src/server/qtquick/private/wbufferrenderer_p.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class WAYLIB_SERVER_EXPORT WBufferRenderer : public QQuickItem
6161
bool cacheBuffer() const;
6262
void setCacheBuffer(bool newCacheBuffer);
6363

64+
void lockCacheBuffer(QObject *owner);
65+
void unlockCacheBuffer(QObject *owner);
66+
6467
QColor clearColor() const;
6568
void setClearColor(const QColor &clearColor);
6669

@@ -100,10 +103,9 @@ class WAYLIB_SERVER_EXPORT WBufferRenderer : public QQuickItem
100103
}
101104

102105
inline bool shouldCacheBuffer() const {
103-
return m_cacheBuffer || m_forceCacheBuffer;
106+
return m_cacheBuffer || !m_cacheBufferLocker.isEmpty();
104107
}
105108

106-
void setForceCacheBuffer(bool force);
107109
void resetTextureProvider();
108110
void updateTextureProvider();
109111
QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) override;
@@ -150,9 +152,9 @@ class WAYLIB_SERVER_EXPORT WBufferRenderer : public QQuickItem
150152
QW_NAMESPACE::qw_damage_ring m_damageRing;
151153
std::unique_ptr<TextureProvider> m_textureProvider;
152154
QColor m_clearColor = Qt::transparent;
155+
QList<QObject*> m_cacheBufferLocker;
153156

154157
uint m_cacheBuffer:1;
155-
uint m_forceCacheBuffer:1;
156158
uint m_hideSource:1;
157159
};
158160

src/server/qtquick/woutputrenderwindow.cpp

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
91119
class OutputLayer;
92120
class 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

228256
class Q_DECL_HIDDEN OutputLayer
@@ -503,18 +531,17 @@ void OutputHelper::sortLayers()
503531

504532
void 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

Comments
 (0)