diff --git a/src/backends/drm/drm_egl_cursor_layer.cpp b/src/backends/drm/drm_egl_cursor_layer.cpp index d95be2d7f1..6e58bf9092 100644 --- a/src/backends/drm/drm_egl_cursor_layer.cpp +++ b/src/backends/drm/drm_egl_cursor_layer.cpp @@ -24,15 +24,16 @@ static TextureTransforms drmToTextureRotation(DrmPipeline *pipeline) if (angle < 0) { angle += 360; } + TextureTransforms flip = (pipeline->renderOrientation() & DrmPlane::Transformation::ReflectX) ? TextureTransform::MirrorX : TextureTransforms(); switch (angle % 360) { case 0: - return TextureTransforms(); + return TextureTransforms() | flip; case 90: - return TextureTransform::Rotate90; + return TextureTransforms(TextureTransform::Rotate90) | flip; case 180: - return TextureTransform::Rotate180; + return TextureTransforms(TextureTransform::Rotate180) | flip; case 270: - return TextureTransform::Rotate270; + return TextureTransforms(TextureTransform::Rotate270) | flip; default: Q_UNREACHABLE(); } diff --git a/src/backends/drm/drm_egl_layer.cpp b/src/backends/drm/drm_egl_layer.cpp index 6516f8a3f4..10a9264fbb 100644 --- a/src/backends/drm/drm_egl_layer.cpp +++ b/src/backends/drm/drm_egl_layer.cpp @@ -31,15 +31,16 @@ static TextureTransforms drmToTextureRotation(DrmPipeline *pipeline) if (angle < 0) { angle += 360; } + TextureTransforms flip = (pipeline->renderOrientation() & DrmPlane::Transformation::ReflectX) ? TextureTransform::MirrorX : TextureTransforms(); switch (angle % 360) { case 0: - return TextureTransforms(); + return TextureTransforms() | flip; case 90: - return TextureTransform::Rotate90; + return TextureTransforms(TextureTransform::Rotate90) | flip; case 180: - return TextureTransform::Rotate180; + return TextureTransforms(TextureTransform::Rotate180) | flip; case 270: - return TextureTransform::Rotate270; + return TextureTransforms(TextureTransform::Rotate270) | flip; default: Q_UNREACHABLE(); } diff --git a/src/backends/drm/drm_egl_layer_surface.cpp b/src/backends/drm/drm_egl_layer_surface.cpp index c2045e5abe..e96e098345 100644 --- a/src/backends/drm/drm_egl_layer_surface.cpp +++ b/src/backends/drm/drm_egl_layer_surface.cpp @@ -84,6 +84,9 @@ std::optional EglGbmLayerSurface::startRendering(cons return std::nullopt; } + if (slot->framebuffer()->colorAttachment()->contentTransforms() != transformation) { + m_surface->damageJournal.clear(); + } slot->framebuffer()->colorAttachment()->setContentTransform(transformation); m_surface->currentSlot = slot; diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index 4be4ffdef4..df1e428365 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -204,21 +204,23 @@ DrmPlane::Transformations outputToPlaneTransform(OutputTransform transform) { using PlaneTrans = DrmPlane::Transformation; - // TODO: Do we want to support reflections (flips)? - switch (transform.kind()) { case OutputTransform::Normal: - case OutputTransform::Flipped: return PlaneTrans::Rotate0; + case OutputTransform::Flipped: + return PlaneTrans::ReflectX | PlaneTrans::Rotate0; case OutputTransform::Rotated90: - case OutputTransform::Flipped90: return PlaneTrans::Rotate90; + case OutputTransform::Flipped90: + return PlaneTrans::ReflectX | PlaneTrans::Rotate90; case OutputTransform::Rotated180: - case OutputTransform::Flipped180: return PlaneTrans::Rotate180; + case OutputTransform::Flipped180: + return PlaneTrans::ReflectX | PlaneTrans::Rotate180; case OutputTransform::Rotated270: - case OutputTransform::Flipped270: return PlaneTrans::Rotate270; + case OutputTransform::Flipped270: + return PlaneTrans::ReflectX | PlaneTrans::Rotate270; default: Q_UNREACHABLE(); } diff --git a/src/outputconfigurationstore.cpp b/src/outputconfigurationstore.cpp index 8c38e606fd..7a5e5fffca 100644 --- a/src/outputconfigurationstore.cpp +++ b/src/outputconfigurationstore.cpp @@ -559,6 +559,14 @@ void OutputConfigurationStore::load() state.transform = state.manualTransform = OutputTransform::Kind::Rotated180; } else if (str == "Rotated270") { state.transform = state.manualTransform = OutputTransform::Kind::Rotated270; + } else if (str == "Flipped") { + state.transform = state.manualTransform = OutputTransform::Kind::Flipped; + } else if (str == "Flipped90") { + state.transform = state.manualTransform = OutputTransform::Kind::Flipped90; + } else if (str == "Flipped180") { + state.transform = state.manualTransform = OutputTransform::Kind::Flipped180; + } else if (str == "Flipped270") { + state.transform = state.manualTransform = OutputTransform::Kind::Flipped270; } } if (const auto it = data.find("overscan"); it != data.end()) { @@ -744,6 +752,14 @@ void OutputConfigurationStore::save() o["transform"] = "Rotated180"; } else if (output.manualTransform == OutputTransform::Kind::Rotated270) { o["transform"] = "Rotated270"; + } else if (output.manualTransform == OutputTransform::Kind::Flipped) { + o["transform"] = "Flipped"; + } else if (output.manualTransform == OutputTransform::Kind::Flipped90) { + o["transform"] = "Flipped90"; + } else if (output.manualTransform == OutputTransform::Kind::Flipped180) { + o["transform"] = "Flipped180"; + } else if (output.manualTransform == OutputTransform::Kind::Flipped270) { + o["transform"] = "Flipped270"; } if (output.overscan) { o["overscan"] = int(*output.overscan); diff --git a/src/plugins/screentransform/screentransform.cpp b/src/plugins/screentransform/screentransform.cpp index bc13d70362..aadd960f27 100644 --- a/src/plugins/screentransform/screentransform.cpp +++ b/src/plugins/screentransform/screentransform.cpp @@ -68,7 +68,7 @@ void ScreenTransformEffect::addScreen(EffectScreen *screen) { connect(screen, &EffectScreen::changed, this, [this, screen] { auto &state = m_states[screen]; - if (screen->transform() == state.m_oldTransform) { + if (transformAngle(screen->transform(), state.m_oldTransform) == 0) { effects->makeOpenGLContextCurrent(); m_states.remove(screen); return;