scene,wayland: Make tracking of the buffer source box less error prone
At the moment, the SurfaceItem needs to track individual properties that may contribute to the buffer source box. That's error prone. To fix that, this change makes the SurfaceInterface indicate when the source box has changed and the SurfaceItem should sync its source box, discard quads, etc.
This commit is contained in:
parent
7d02bc17d6
commit
50bc9bb1f1
5 changed files with 40 additions and 13 deletions
|
@ -27,6 +27,10 @@ SurfaceItemWayland::SurfaceItemWayland(KWaylandServer::SurfaceInterface *surface
|
||||||
this, &SurfaceItemWayland::handleSurfaceSizeChanged);
|
this, &SurfaceItemWayland::handleSurfaceSizeChanged);
|
||||||
connect(surface, &KWaylandServer::SurfaceInterface::bufferSizeChanged,
|
connect(surface, &KWaylandServer::SurfaceInterface::bufferSizeChanged,
|
||||||
this, &SurfaceItemWayland::handleBufferSizeChanged);
|
this, &SurfaceItemWayland::handleBufferSizeChanged);
|
||||||
|
connect(surface, &KWaylandServer::SurfaceInterface::bufferSourceBoxChanged,
|
||||||
|
this, &SurfaceItemWayland::handleBufferSourceBoxChanged);
|
||||||
|
connect(surface, &KWaylandServer::SurfaceInterface::bufferTransformChanged,
|
||||||
|
this, &SurfaceItemWayland::handleBufferTransformChanged);
|
||||||
|
|
||||||
connect(surface, &KWaylandServer::SurfaceInterface::childSubSurfacesChanged,
|
connect(surface, &KWaylandServer::SurfaceInterface::childSubSurfacesChanged,
|
||||||
this, &SurfaceItemWayland::handleChildSubSurfacesChanged);
|
this, &SurfaceItemWayland::handleChildSubSurfacesChanged);
|
||||||
|
@ -77,8 +81,6 @@ KWaylandServer::SurfaceInterface *SurfaceItemWayland::surface() const
|
||||||
|
|
||||||
void SurfaceItemWayland::handleSurfaceToBufferMatrixChanged()
|
void SurfaceItemWayland::handleSurfaceToBufferMatrixChanged()
|
||||||
{
|
{
|
||||||
setBufferTransform(m_surface->bufferTransform());
|
|
||||||
setBufferSourceBox(m_surface->bufferSourceBox());
|
|
||||||
setSurfaceToBufferMatrix(m_surface->surfaceToBufferMatrix());
|
setSurfaceToBufferMatrix(m_surface->surfaceToBufferMatrix());
|
||||||
discardQuads();
|
discardQuads();
|
||||||
discardPixmap();
|
discardPixmap();
|
||||||
|
@ -91,11 +93,20 @@ void SurfaceItemWayland::handleSurfaceSizeChanged()
|
||||||
|
|
||||||
void SurfaceItemWayland::handleBufferSizeChanged()
|
void SurfaceItemWayland::handleBufferSizeChanged()
|
||||||
{
|
{
|
||||||
setBufferSourceBox(m_surface->bufferSourceBox());
|
|
||||||
setBufferSize(m_surface->bufferSize());
|
setBufferSize(m_surface->bufferSize());
|
||||||
discardPixmap();
|
discardPixmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SurfaceItemWayland::handleBufferSourceBoxChanged()
|
||||||
|
{
|
||||||
|
setBufferSourceBox(m_surface->bufferSourceBox());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SurfaceItemWayland::handleBufferTransformChanged()
|
||||||
|
{
|
||||||
|
setBufferTransform(m_surface->bufferTransform());
|
||||||
|
}
|
||||||
|
|
||||||
void SurfaceItemWayland::handleSurfaceCommitted()
|
void SurfaceItemWayland::handleSurfaceCommitted()
|
||||||
{
|
{
|
||||||
if (m_surface->hasFrameCallbacks()) {
|
if (m_surface->hasFrameCallbacks()) {
|
||||||
|
|
|
@ -41,6 +41,8 @@ private Q_SLOTS:
|
||||||
void handleSurfaceCommitted();
|
void handleSurfaceCommitted();
|
||||||
void handleSurfaceSizeChanged();
|
void handleSurfaceSizeChanged();
|
||||||
void handleBufferSizeChanged();
|
void handleBufferSizeChanged();
|
||||||
|
void handleBufferSourceBoxChanged();
|
||||||
|
void handleBufferTransformChanged();
|
||||||
|
|
||||||
void handleChildSubSurfaceRemoved(KWaylandServer::SubSurfaceInterface *child);
|
void handleChildSubSurfaceRemoved(KWaylandServer::SubSurfaceInterface *child);
|
||||||
void handleChildSubSurfacesChanged();
|
void handleChildSubSurfacesChanged();
|
||||||
|
|
|
@ -476,6 +476,20 @@ QMatrix4x4 SurfaceInterfacePrivate::buildSurfaceToBufferMatrix()
|
||||||
return surfaceToBufferMatrix;
|
return surfaceToBufferMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRectF SurfaceInterfacePrivate::computeBufferSourceBox() const
|
||||||
|
{
|
||||||
|
if (!current.viewport.sourceGeometry.isValid()) {
|
||||||
|
return QRectF(0, 0, bufferSize.width(), bufferSize.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
const QRectF box(current.viewport.sourceGeometry.x() * current.bufferScale,
|
||||||
|
current.viewport.sourceGeometry.y() * current.bufferScale,
|
||||||
|
current.viewport.sourceGeometry.width() * current.bufferScale,
|
||||||
|
current.viewport.sourceGeometry.height() * current.bufferScale);
|
||||||
|
|
||||||
|
return current.bufferTransform.inverted().map(box, bufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
void SurfaceState::mergeInto(SurfaceState *target)
|
void SurfaceState::mergeInto(SurfaceState *target)
|
||||||
{
|
{
|
||||||
if (bufferIsSet) {
|
if (bufferIsSet) {
|
||||||
|
@ -561,6 +575,7 @@ void SurfaceInterfacePrivate::applyState(SurfaceState *next)
|
||||||
|
|
||||||
const QSizeF oldSurfaceSize = surfaceSize;
|
const QSizeF oldSurfaceSize = surfaceSize;
|
||||||
const QSize oldBufferSize = bufferSize;
|
const QSize oldBufferSize = bufferSize;
|
||||||
|
const QRectF oldBufferSourceBox = bufferSourceBox;
|
||||||
const QMatrix4x4 oldSurfaceToBufferMatrix = surfaceToBufferMatrix;
|
const QMatrix4x4 oldSurfaceToBufferMatrix = surfaceToBufferMatrix;
|
||||||
const QRegion oldInputRegion = inputRegion;
|
const QRegion oldInputRegion = inputRegion;
|
||||||
|
|
||||||
|
@ -571,6 +586,7 @@ void SurfaceInterfacePrivate::applyState(SurfaceState *next)
|
||||||
// TODO: Refactor the state management code because it gets more clumsy.
|
// TODO: Refactor the state management code because it gets more clumsy.
|
||||||
if (current.buffer) {
|
if (current.buffer) {
|
||||||
bufferSize = current.buffer->size();
|
bufferSize = current.buffer->size();
|
||||||
|
bufferSourceBox = computeBufferSourceBox();
|
||||||
|
|
||||||
implicitSurfaceSize = current.buffer->size() / current.bufferScale;
|
implicitSurfaceSize = current.buffer->size() / current.bufferScale;
|
||||||
switch (current.bufferTransform.kind()) {
|
switch (current.bufferTransform.kind()) {
|
||||||
|
@ -617,6 +633,7 @@ void SurfaceInterfacePrivate::applyState(SurfaceState *next)
|
||||||
surfaceSize = QSizeF(0, 0);
|
surfaceSize = QSizeF(0, 0);
|
||||||
implicitSurfaceSize = QSizeF(0, 0);
|
implicitSurfaceSize = QSizeF(0, 0);
|
||||||
bufferSize = QSize(0, 0);
|
bufferSize = QSize(0, 0);
|
||||||
|
bufferSourceBox = QRectF();
|
||||||
inputRegion = QRegion();
|
inputRegion = QRegion();
|
||||||
opaqueRegion = QRegion();
|
opaqueRegion = QRegion();
|
||||||
}
|
}
|
||||||
|
@ -647,6 +664,9 @@ void SurfaceInterfacePrivate::applyState(SurfaceState *next)
|
||||||
if (surfaceToBufferMatrix != oldSurfaceToBufferMatrix) {
|
if (surfaceToBufferMatrix != oldSurfaceToBufferMatrix) {
|
||||||
Q_EMIT q->surfaceToBufferMatrixChanged();
|
Q_EMIT q->surfaceToBufferMatrixChanged();
|
||||||
}
|
}
|
||||||
|
if (bufferSourceBox != oldBufferSourceBox) {
|
||||||
|
Q_EMIT q->bufferSourceBoxChanged();
|
||||||
|
}
|
||||||
if (bufferSize != oldBufferSize) {
|
if (bufferSize != oldBufferSize) {
|
||||||
Q_EMIT q->bufferSizeChanged();
|
Q_EMIT q->bufferSizeChanged();
|
||||||
}
|
}
|
||||||
|
@ -787,16 +807,7 @@ QRegion SurfaceInterface::input() const
|
||||||
|
|
||||||
QRectF SurfaceInterface::bufferSourceBox() const
|
QRectF SurfaceInterface::bufferSourceBox() const
|
||||||
{
|
{
|
||||||
if (!d->current.viewport.sourceGeometry.isValid()) {
|
return d->bufferSourceBox;
|
||||||
return QRectF(0, 0, d->bufferSize.width(), d->bufferSize.height());
|
|
||||||
}
|
|
||||||
|
|
||||||
const QRectF box(d->current.viewport.sourceGeometry.x() * d->current.bufferScale,
|
|
||||||
d->current.viewport.sourceGeometry.y() * d->current.bufferScale,
|
|
||||||
d->current.viewport.sourceGeometry.width() * d->current.bufferScale,
|
|
||||||
d->current.viewport.sourceGeometry.height() * d->current.bufferScale);
|
|
||||||
|
|
||||||
return d->current.bufferTransform.inverted().map(box, d->bufferSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KWin::OutputTransform SurfaceInterface::bufferTransform() const
|
KWin::OutputTransform SurfaceInterface::bufferTransform() const
|
||||||
|
|
|
@ -371,6 +371,7 @@ Q_SIGNALS:
|
||||||
* This signal is emitted when the buffer transform has changed.
|
* This signal is emitted when the buffer transform has changed.
|
||||||
*/
|
*/
|
||||||
void bufferTransformChanged(KWin::OutputTransform);
|
void bufferTransformChanged(KWin::OutputTransform);
|
||||||
|
void bufferSourceBoxChanged();
|
||||||
/**
|
/**
|
||||||
* This signal is emitted when the size of the attached buffer has changed.
|
* This signal is emitted when the size of the attached buffer has changed.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -99,6 +99,7 @@ public:
|
||||||
|
|
||||||
void commitSubSurface();
|
void commitSubSurface();
|
||||||
QMatrix4x4 buildSurfaceToBufferMatrix();
|
QMatrix4x4 buildSurfaceToBufferMatrix();
|
||||||
|
QRectF computeBufferSourceBox() const;
|
||||||
void applyState(SurfaceState *next);
|
void applyState(SurfaceState *next);
|
||||||
|
|
||||||
bool computeEffectiveMapped() const;
|
bool computeEffectiveMapped() const;
|
||||||
|
@ -120,6 +121,7 @@ public:
|
||||||
SubSurfaceInterface *subSurface = nullptr;
|
SubSurfaceInterface *subSurface = nullptr;
|
||||||
QMatrix4x4 surfaceToBufferMatrix;
|
QMatrix4x4 surfaceToBufferMatrix;
|
||||||
QSize bufferSize = QSize(0, 0);
|
QSize bufferSize = QSize(0, 0);
|
||||||
|
QRectF bufferSourceBox;
|
||||||
QSizeF implicitSurfaceSize = QSizeF(0, 0);
|
QSizeF implicitSurfaceSize = QSizeF(0, 0);
|
||||||
QSizeF surfaceSize = QSizeF(0, 0);
|
QSizeF surfaceSize = QSizeF(0, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue