backends/drm: handle atomic commits failing correctly
If the pending pageflip flag is not reset, KWin will wait for a pageflip that never comes
This commit is contained in:
parent
5fae9a944e
commit
4610a916d3
2 changed files with 8 additions and 6 deletions
|
@ -9,6 +9,7 @@
|
|||
#include "drm_commit_thread.h"
|
||||
#include "drm_commit.h"
|
||||
#include "drm_gpu.h"
|
||||
#include "logging_p.h"
|
||||
#include "utils/realtime.h"
|
||||
|
||||
namespace KWin
|
||||
|
@ -42,6 +43,7 @@ DrmCommitThread::DrmCommitThread()
|
|||
// the atomic commit takes ownership of the object
|
||||
m_commit.release();
|
||||
} else {
|
||||
qCWarning(KWIN_DRM) << "atomic commit failed:" << strerror(errno);
|
||||
m_droppedCommits.push_back(std::move(m_commit));
|
||||
QMetaObject::invokeMethod(this, &DrmCommitThread::commitFailed, Qt::ConnectionType::QueuedConnection);
|
||||
QMetaObject::invokeMethod(this, &DrmCommitThread::clearDroppedCommits, Qt::ConnectionType::QueuedConnection);
|
||||
|
|
|
@ -41,6 +41,12 @@ DrmPipeline::DrmPipeline(DrmConnector *conn)
|
|||
: m_connector(conn)
|
||||
, m_commitThread(std::make_unique<DrmCommitThread>())
|
||||
{
|
||||
QObject::connect(m_commitThread.get(), &DrmCommitThread::commitFailed, [this]() {
|
||||
m_pageflipPending = false;
|
||||
if (m_output) {
|
||||
m_output->frameFailed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
DrmPipeline::~DrmPipeline()
|
||||
|
@ -421,13 +427,7 @@ void DrmPipeline::pageFlipped(std::chrono::nanoseconds timestamp)
|
|||
|
||||
void DrmPipeline::setOutput(DrmOutput *output)
|
||||
{
|
||||
if (m_output) {
|
||||
QObject::disconnect(m_commitThread.get(), nullptr, m_output, nullptr);
|
||||
}
|
||||
m_output = output;
|
||||
if (output) {
|
||||
QObject::connect(m_commitThread.get(), &DrmCommitThread::commitFailed, output, &DrmAbstractOutput::frameFailed);
|
||||
}
|
||||
}
|
||||
|
||||
DrmOutput *DrmPipeline::output() const
|
||||
|
|
Loading…
Reference in a new issue