24Vsp2Buffer::Vsp2Buffer(wl_kms_buffer *kmsBuffer)
25 : dmabufFd(kmsBuffer->fd)
26 , bytesPerLine(kmsBuffer->stride)
27 , drmPixelFormat(kmsBuffer->format)
28 , size(kmsBuffer->width, kmsBuffer->height)
35 auto *wlItem = m_hwLayer->waylandItem();
36 m_screen =
dynamic_cast<QVsp2Screen*>(wlItem->window()->screen()->handle());
39 connect(hwLayer, &QWaylandQuickHardwareLayer::stackingLevelChanged,
this, [integration](){
40 integration->recreateVspLayers();
42 connect(hwLayer->waylandItem(), &QWaylandQuickItem::surfaceChanged,
this, &Vsp2Layer::handleSurfaceChanged);
43 connect(hwLayer->waylandItem(), &QQuickItem::opacityChanged,
this, &Vsp2Layer::updateOpacity);
44 connect(hwLayer->waylandItem()->window(), &QQuickWindow::afterSynchronizing,
this, &Vsp2Layer::updatePosition);
45 hwLayer->setSceneGraphPainting(
false);
46 QWaylandViewPrivate::get(hwLayer->waylandItem()->view())->independentFrameCallback =
true;
52 auto *kmsBuffer = nextKmsBuffer();
57 m_buffer = Vsp2Buffer(kmsBuffer);
60 m_layerIndex = m_screen->addLayer(m_buffer.dmabufFd, m_buffer.size, m_position, m_buffer.drmPixelFormat, m_buffer.bytesPerLine);
62 auto *wlItem = m_hwLayer->waylandItem();
63 wlItem->surface()->frameStarted();
81 auto *kmsBuffer = nextKmsBuffer();
84 if (m_buffer.dmabufFd != -1) {
85 bool formatChanged =
false;
86 formatChanged |= newBuffer.bytesPerLine != m_buffer.bytesPerLine;
87 formatChanged |= newBuffer.size != m_buffer.size;
88 formatChanged |= newBuffer.drmPixelFormat != m_buffer.drmPixelFormat;
90 qWarning() <<
"The VSP2 Wayland hardware layer integration doesn't support changing"
91 <<
"surface formats, this will most likely fail";
96 m_screen->setLayerBuffer(m_layerIndex, m_buffer.dmabufFd);
98 auto *wlItem = m_hwLayer->waylandItem();
99 wlItem->surface()->frameStarted();
104 auto newSurface = m_hwLayer->waylandItem()->surface();
106 if (Q_UNLIKELY(newSurface == m_surface))
110 disconnect(
this->m_surface, &QWaylandSurface::redraw,
this, &Vsp2Layer::handleBufferCommitted);
112 connect(newSurface, &QWaylandSurface::redraw,
this, &Vsp2Layer::handleBufferCommitted, Qt::DirectConnection);
114 this->m_surface = newSurface;
119 QWaylandQuickItem *wlItem = m_hwLayer->waylandItem();
120 QRectF localGeometry(0, 0, wlItem->width(), wlItem->height());
121 auto lastMatrix = QWaylandQuickItemPrivate::get(wlItem)->lastMatrix;
122 auto globalGeometry = lastMatrix.mapRect(localGeometry);
124 if (m_buffer.size != globalGeometry.size().toSize()) {
125 qWarning() <<
"wl_buffer size != WaylandQuickItem size and scaling has not been"
126 <<
"implemented for the vsp2 hardware layer integration";
129 m_position = globalGeometry.topLeft().toPoint();
131 m_screen->setLayerPosition(m_layerIndex, m_position);