backends/drm: when presentation with tearing+vrr fails, retry first with vrr only
Tearing may not always work, and currently is guaranteed to not work when we try to enable VRR at the same time. VRR without tearing may still work though, so this commit makes KWin fall back to VRR-only presentation before giving up and using the basic vsync presentation mode instead.
This commit is contained in:
parent
91eb1972c1
commit
0670631a12
1 changed files with 6 additions and 1 deletions
|
@ -306,8 +306,13 @@ bool DrmOutput::present(const std::shared_ptr<OutputFrame> &frame)
|
||||||
} else {
|
} else {
|
||||||
m_pipeline->setPresentationMode(frame->presentationMode());
|
m_pipeline->setPresentationMode(frame->presentationMode());
|
||||||
DrmPipeline::Error err = m_pipeline->present(frame);
|
DrmPipeline::Error err = m_pipeline->present(frame);
|
||||||
|
if (err != DrmPipeline::Error::None && frame->presentationMode() == PresentationMode::AdaptiveAsync) {
|
||||||
|
// tearing can fail in various circumstances, but vrr shouldn't
|
||||||
|
m_pipeline->setPresentationMode(PresentationMode::AdaptiveSync);
|
||||||
|
err = m_pipeline->present(frame);
|
||||||
|
}
|
||||||
if (err != DrmPipeline::Error::None && frame->presentationMode() != PresentationMode::VSync) {
|
if (err != DrmPipeline::Error::None && frame->presentationMode() != PresentationMode::VSync) {
|
||||||
// retry with a more basic presentation mode
|
// retry with the most basic presentation mode
|
||||||
m_pipeline->setPresentationMode(PresentationMode::VSync);
|
m_pipeline->setPresentationMode(PresentationMode::VSync);
|
||||||
err = m_pipeline->present(frame);
|
err = m_pipeline->present(frame);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue