backends/drm: extend connector lifetime to match their outputs
As disconnected outputs outlive DrmGpu::updateOutputs, the DrmConnector and DrmPipeline must also be kept valid for that time BUG: 463334
This commit is contained in:
parent
ccaf0210d1
commit
239207c5ee
4 changed files with 10 additions and 11 deletions
|
@ -253,7 +253,7 @@ bool DrmGpu::updateOutputs()
|
|||
return connector->id() == currentConnector;
|
||||
});
|
||||
if (it == m_connectors.end()) {
|
||||
auto conn = std::make_unique<DrmConnector>(this, currentConnector);
|
||||
auto conn = std::make_shared<DrmConnector>(this, currentConnector);
|
||||
if (!conn->init()) {
|
||||
continue;
|
||||
}
|
||||
|
@ -278,7 +278,7 @@ bool DrmGpu::updateOutputs()
|
|||
qCDebug(KWIN_DRM, "New %soutput on GPU %s: %s", conn->isNonDesktop() ? "non-desktop " : "", qPrintable(m_devNode), qPrintable(conn->modelName()));
|
||||
const auto pipeline = conn->pipeline();
|
||||
m_pipelines << pipeline;
|
||||
auto output = new DrmOutput(pipeline);
|
||||
auto output = new DrmOutput(*it);
|
||||
m_drmOutputs << output;
|
||||
addedOutputs << output;
|
||||
Q_EMIT outputAdded(output);
|
||||
|
|
|
@ -139,7 +139,7 @@ private:
|
|||
|
||||
std::vector<std::unique_ptr<DrmPlane>> m_planes;
|
||||
std::vector<std::unique_ptr<DrmCrtc>> m_crtcs;
|
||||
std::vector<std::unique_ptr<DrmConnector>> m_connectors;
|
||||
std::vector<std::shared_ptr<DrmConnector>> m_connectors;
|
||||
QVector<DrmObject *> m_allObjects;
|
||||
QVector<DrmPipeline *> m_pipelines;
|
||||
|
||||
|
|
|
@ -38,14 +38,13 @@
|
|||
namespace KWin
|
||||
{
|
||||
|
||||
DrmOutput::DrmOutput(DrmPipeline *pipeline)
|
||||
: DrmAbstractOutput(pipeline->connector()->gpu())
|
||||
, m_pipeline(pipeline)
|
||||
, m_connector(pipeline->connector())
|
||||
DrmOutput::DrmOutput(const std::shared_ptr<DrmConnector> &conn)
|
||||
: DrmAbstractOutput(conn->gpu())
|
||||
, m_pipeline(conn->pipeline())
|
||||
, m_connector(conn)
|
||||
{
|
||||
RenderLoopPrivate::get(m_renderLoop.get())->canDoTearing = gpu()->asyncPageflipSupported();
|
||||
m_pipeline->setOutput(this);
|
||||
const auto conn = m_pipeline->connector();
|
||||
m_renderLoop->setRefreshRate(m_pipeline->mode()->refreshRate());
|
||||
|
||||
Capabilities capabilities = Capability::Dpms;
|
||||
|
@ -387,7 +386,7 @@ bool DrmOutput::present()
|
|||
|
||||
DrmConnector *DrmOutput::connector() const
|
||||
{
|
||||
return m_connector;
|
||||
return m_connector.get();
|
||||
}
|
||||
|
||||
DrmPipeline *DrmOutput::pipeline() const
|
||||
|
|
|
@ -35,7 +35,7 @@ class KWIN_EXPORT DrmOutput : public DrmAbstractOutput
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
DrmOutput(DrmPipeline *pipeline);
|
||||
DrmOutput(const std::shared_ptr<DrmConnector> &connector);
|
||||
~DrmOutput() override;
|
||||
|
||||
DrmConnector *connector() const;
|
||||
|
@ -71,7 +71,7 @@ private:
|
|||
void renderCursorQPainter(const RenderTarget &renderTarget);
|
||||
|
||||
DrmPipeline *m_pipeline;
|
||||
DrmConnector *m_connector;
|
||||
const std::shared_ptr<DrmConnector> m_connector;
|
||||
|
||||
bool m_setCursorSuccessful = false;
|
||||
bool m_moveCursorSuccessful = false;
|
||||
|
|
Loading…
Reference in a new issue