diff --git a/plugins/platforms/drm/drm_object_plane.h b/plugins/platforms/drm/drm_object_plane.h --- a/plugins/platforms/drm/drm_object_plane.h +++ b/plugins/platforms/drm/drm_object_plane.h @@ -20,6 +20,7 @@ #ifndef KWIN_DRM_OBJECT_PLANE_H #define KWIN_DRM_OBJECT_PLANE_H +#include #include "drm_object.h" // drm #include @@ -31,6 +32,7 @@ class DrmPlane : public DrmObject { + Q_GADGET public: DrmPlane(uint32_t plane_id, int fd); @@ -51,13 +53,15 @@ Rotation, Count }; + Q_ENUM(PropertyIndex); enum class TypeIndex { Primary = 0, Cursor, Overlay, Count }; + Q_ENUM(TypeIndex); enum class Transformation { Rotate0 = 1 << 0, @@ -68,6 +72,7 @@ ReflectY = 1 << 5 }; Q_DECLARE_FLAGS(Transformations, Transformation); + Q_ENUM(Transformation) bool atomicInit(); bool initProps(); @@ -101,6 +106,10 @@ return m_supportedTransformations; } + void transformationsNotSupported(Transformations t) { + m_supportedTransformations &= ~t; + } + private: DrmBuffer *m_current = nullptr; DrmBuffer *m_next = nullptr; diff --git a/plugins/platforms/drm/drm_object_plane.cpp b/plugins/platforms/drm/drm_object_plane.cpp --- a/plugins/platforms/drm/drm_object_plane.cpp +++ b/plugins/platforms/drm/drm_object_plane.cpp @@ -151,6 +151,7 @@ void DrmPlane::setTransformation(Transformations t) { + qCDebug(KWIN_DRM) << "applying transformation" << t << "to" << m_id; if (auto property = m_props.at(int(PropertyIndex::Rotation))) { property->setValue(int(t)); } diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -897,6 +897,15 @@ qCDebug(KWIN_DRM) << "Atomic test commit failed. Aborting present."; // go back to previous state if (m_lastWorkingState.valid) { + + if (m_primaryPlane && qstrcmp(m_mode.name, m_lastWorkingState.mode.name) == 0 && m_lastWorkingState.globalPos == globalPos() && m_lastWorkingState.planeTransformations != m_primaryPlane->transformation()) { + //We are trying to figure out if a transformation wasn't supported after all + //This can happen if the transformation si generally supported but for some combination of states it won't work. + // For example Portrait rotation on i915: Y/Yf tiling required for 90/270! + m_primaryPlane->transformationsNotSupported(m_primaryPlane->transformation()); + qCDebug(KWIN_DRM) << "Transformation not supported for" << m_primaryPlane->id() << m_lastWorkingState.planeTransformations << m_primaryPlane->supportedTransformations(); + } + m_mode = m_lastWorkingState.mode; setOrientation(m_lastWorkingState.orientation); setGlobalPos(m_lastWorkingState.globalPos);