DRM: Use QSharedPointer

This commit is contained in:
Xaver Hugl 2021-03-22 15:46:09 +01:00
parent 5c15cca190
commit c737fde3da
16 changed files with 52 additions and 116 deletions

View file

@ -23,9 +23,6 @@ public:
virtual ~DrmBuffer() = default;
virtual bool needsModeChange(DrmBuffer *b) const {Q_UNUSED(b) return false;}
virtual bool shouldDeleteAfterPageflip() const {
return false;
}
quint32 bufferId() const {
return m_bufferId;

View file

@ -28,7 +28,7 @@ namespace KWin
{
// DrmSurfaceBuffer
DrmSurfaceBuffer::DrmSurfaceBuffer(int fd, const std::shared_ptr<GbmSurface> &surface)
DrmSurfaceBuffer::DrmSurfaceBuffer(int fd, const QSharedPointer<GbmSurface> &surface)
: DrmBuffer(fd)
, m_surface(surface)
{

View file

@ -12,7 +12,7 @@
#include "drm_buffer.h"
#include <memory>
#include <QSharedPointer>
struct gbm_bo;
@ -29,7 +29,7 @@ class GbmSurface;
class DrmSurfaceBuffer : public DrmBuffer
{
public:
DrmSurfaceBuffer(int fd, const std::shared_ptr<GbmSurface> &surface);
DrmSurfaceBuffer(int fd, const QSharedPointer<GbmSurface> &surface);
DrmSurfaceBuffer(int fd, gbm_bo *buffer, KWaylandServer::BufferInterface *bufferInterface);
~DrmSurfaceBuffer() override;
@ -40,9 +40,6 @@ public:
return true;
}
}
bool shouldDeleteAfterPageflip() const override {
return true;
}
bool hasBo() const {
return m_bo != nullptr;
@ -55,7 +52,7 @@ public:
void releaseGbm() override;
private:
std::shared_ptr<GbmSurface> m_surface;
QSharedPointer<GbmSurface> m_surface;
gbm_bo *m_bo = nullptr;
KWaylandServer::BufferInterface *m_bufferInterface = nullptr;

View file

@ -82,10 +82,6 @@ public:
m_eglDisplay = display;
}
DrmDumbBuffer *createBuffer(const QSize &size) const {
return new DrmDumbBuffer(m_fd, size);
}
void setEglBackend(AbstractEglBackend *eglBackend) {
m_eglBackend = eglBackend;
}

View file

@ -67,9 +67,6 @@ bool DrmCrtc::initProps()
void DrmCrtc::flipBuffer()
{
if (m_currentBuffer && m_currentBuffer->shouldDeleteAfterPageflip() && m_currentBuffer != m_nextBuffer) {
delete m_currentBuffer;
}
m_currentBuffer = m_nextBuffer;
m_nextBuffer = nullptr;
@ -84,7 +81,7 @@ bool DrmCrtc::blank(DrmOutput *output)
}
if (!m_blackBuffer) {
DrmDumbBuffer *blackBuffer = m_gpu->createBuffer(output->pixelSize());
DrmDumbBuffer *blackBuffer = new DrmDumbBuffer(m_gpu->fd(), output->pixelSize());
if (!blackBuffer->map()) {
delete blackBuffer;
return false;
@ -94,10 +91,6 @@ bool DrmCrtc::blank(DrmOutput *output)
}
if (output->setModeLegacy(m_blackBuffer)) {
if (m_currentBuffer && m_currentBuffer->shouldDeleteAfterPageflip()) {
delete m_currentBuffer;
delete m_nextBuffer;
}
m_currentBuffer = nullptr;
m_nextBuffer = nullptr;
return true;

View file

@ -11,6 +11,8 @@
#include "drm_object.h"
#include <QSharedPointer>
namespace KWin
{
@ -41,13 +43,13 @@ public:
return m_resIndex;
}
DrmBuffer *current() {
QSharedPointer<DrmBuffer> current() {
return m_currentBuffer;
}
DrmBuffer *next() {
QSharedPointer<DrmBuffer> next() {
return m_nextBuffer;
}
void setNext(DrmBuffer *buffer) {
void setNext(const QSharedPointer<DrmBuffer> &buffer) {
m_nextBuffer = buffer;
}
@ -67,8 +69,8 @@ private:
int m_resIndex;
uint32_t m_gammaRampSize = 0;
DrmBuffer *m_currentBuffer = nullptr;
DrmBuffer *m_nextBuffer = nullptr;
QSharedPointer<DrmBuffer> m_currentBuffer;
QSharedPointer<DrmBuffer> m_nextBuffer;
DrmDumbBuffer *m_blackBuffer = nullptr;
DrmBackend *m_backend;
DrmGpu *m_gpu;

View file

@ -19,12 +19,6 @@ DrmPlane::DrmPlane(uint32_t plane_id, int fd)
{
}
DrmPlane::~DrmPlane()
{
delete m_current;
delete m_next;
}
bool DrmPlane::init()
{
qCDebug(KWIN_DRM) << "Atomic init for plane:" << m_id;
@ -137,7 +131,7 @@ DrmPlane::TypeIndex DrmPlane::type()
return TypeIndex::Overlay;
}
void DrmPlane::setNext(DrmBuffer *b)
void DrmPlane::setNext(const QSharedPointer<DrmBuffer> &b)
{
if (auto property = m_props.at(int(PropertyIndex::FbId))) {
property->setValue(b ? b->bufferId() : 0);
@ -164,9 +158,6 @@ DrmPlane::Transformations DrmPlane::transformation()
void DrmPlane::flipBuffer()
{
if (m_current != m_next && m_current && m_current->shouldDeleteAfterPageflip()) {
delete m_current;
}
m_current = m_next;
m_next = nullptr;
}

View file

@ -12,6 +12,7 @@
#include <qobjectdefs.h>
#include <xf86drmMode.h>
#include <QSharedPointer>
namespace KWin
{
@ -24,8 +25,6 @@ class DrmPlane : public DrmObject
public:
DrmPlane(uint32_t plane_id, int fd);
~DrmPlane() override;
enum class PropertyIndex {
Type = 0,
SrcX,
@ -73,16 +72,16 @@ public:
return m_formats;
}
DrmBuffer *current() const {
QSharedPointer<DrmBuffer> current() const {
return m_current;
}
DrmBuffer *next() const {
QSharedPointer<DrmBuffer> next() const {
return m_next;
}
void setCurrent(DrmBuffer *b) {
void setCurrent(const QSharedPointer<DrmBuffer> &b) {
m_current = b;
}
void setNext(DrmBuffer *b);
void setNext(const QSharedPointer<DrmBuffer> &b);
void setTransformation(Transformations t);
Transformations transformation();
@ -95,8 +94,8 @@ public:
bool atomicPopulate(drmModeAtomicReq *req) const override;
private:
DrmBuffer *m_current = nullptr;
DrmBuffer *m_next = nullptr;
QSharedPointer<DrmBuffer> m_current;
QSharedPointer<DrmBuffer> m_next;
// TODO: See weston drm_output_check_plane_format for future use of these member variables
QVector<uint32_t> m_formats; // Possible formats, which can be presented on this plane

View file

@ -70,9 +70,6 @@ void DrmOutput::teardown()
if (m_primaryPlane) {
// TODO: when having multiple planes, also clean up these
if (m_primaryPlane->current() && m_primaryPlane->current()->shouldDeleteAfterPageflip()) {
delete m_primaryPlane->current();
}
m_primaryPlane->setCurrent(nullptr);
}
@ -86,7 +83,7 @@ void DrmOutput::teardown()
void DrmOutput::releaseGbm()
{
if (DrmBuffer *b = m_crtc->current()) {
if (const auto &b = m_crtc->current()) {
b->releaseGbm();
}
if (m_primaryPlane && m_primaryPlane->current()) {
@ -362,7 +359,7 @@ void DrmOutput::initEdid(drmModeConnector *connector)
bool DrmOutput::initCursor(const QSize &cursorSize)
{
auto createCursor = [this, cursorSize] (int index) {
m_cursor[index].reset(m_gpu->createBuffer(cursorSize));
m_cursor[index].reset(new DrmDumbBuffer(m_gpu->fd(), cursorSize));
if (!m_cursor[index]->map(QImage::Format_ARGB32_Premultiplied)) {
return false;
}
@ -684,7 +681,7 @@ void DrmOutput::pageFlipped()
} else {
if (!m_crtc->next()) {
// on manual vt switch
if (DrmBuffer *b = m_crtc->current()) {
if (const auto &b = m_crtc->current()) {
b->releaseGbm();
}
}
@ -696,27 +693,15 @@ void DrmOutput::pageFlipped()
}
}
bool DrmOutput::present(DrmBuffer *buffer)
bool DrmOutput::present(const QSharedPointer<DrmBuffer> &buffer)
{
if (!buffer || buffer->bufferId() == 0) {
if (buffer && buffer->shouldDeleteAfterPageflip()) {
delete buffer;
}
return false;
}
if (m_dpmsModePending != DpmsMode::On) {
return false;
}
bool result;
if (m_gpu->atomicModeSetting()) {
result = presentAtomically(buffer);
} else {
result = presentLegacy(buffer);
}
if (!result && buffer->shouldDeleteAfterPageflip()) {
delete buffer;
}
return result;
return m_gpu->atomicModeSetting() ? presentAtomically(buffer) : presentLegacy(buffer);
}
bool DrmOutput::dpmsAtomicOff()
@ -724,7 +709,6 @@ bool DrmOutput::dpmsAtomicOff()
m_atomicOffPending = false;
// TODO: With multiple planes: deactivate all of them here
delete m_primaryPlane->next();
m_primaryPlane->setNext(nullptr);
m_nextPlanesFlipList << m_primaryPlane;
@ -742,7 +726,7 @@ bool DrmOutput::dpmsAtomicOff()
return true;
}
bool DrmOutput::presentAtomically(DrmBuffer *buffer)
bool DrmOutput::presentAtomically(const QSharedPointer<DrmBuffer> &buffer)
{
if (!m_backend->session()->isActive()) {
qCWarning(KWIN_DRM) << "Refusing to present output because session is inactive";
@ -810,7 +794,7 @@ bool DrmOutput::presentAtomically(DrmBuffer *buffer)
return true;
}
bool DrmOutput::presentLegacy(DrmBuffer *buffer)
bool DrmOutput::presentLegacy(const QSharedPointer<DrmBuffer> &buffer)
{
if (m_crtc->next()) {
return false;
@ -821,8 +805,8 @@ bool DrmOutput::presentLegacy(DrmBuffer *buffer)
}
// Do we need to set a new mode first?
if (!m_crtc->current() || m_crtc->current()->needsModeChange(buffer)) {
if (!setModeLegacy(buffer)) {
if (!m_crtc->current() || m_crtc->current()->needsModeChange(buffer.get())) {
if (!setModeLegacy(buffer.get())) {
return false;
}
}
@ -969,12 +953,6 @@ bool DrmOutput::atomicReqModesetPopulate(drmModeAtomicReq *req, bool enable)
m_primaryPlane->setValue(int(DrmPlane::PropertyIndex::CrtcH), targetRect.height());
m_primaryPlane->setValue(int(DrmPlane::PropertyIndex::CrtcId), m_crtc->id());
} else {
if (m_primaryPlane->current() && m_primaryPlane->current()->shouldDeleteAfterPageflip()) {
delete m_primaryPlane->current();
}
if (m_primaryPlane->next() && m_primaryPlane->next()->shouldDeleteAfterPageflip()) {
delete m_primaryPlane->next();
}
m_primaryPlane->setCurrent(nullptr);
m_primaryPlane->setNext(nullptr);

View file

@ -19,6 +19,7 @@
#include <QPoint>
#include <QSize>
#include <QVector>
#include <QSharedPointer>
#include <xf86drmMode.h>
namespace KWin
@ -51,7 +52,7 @@ public:
bool updateCursor();
void moveCursor();
bool init(drmModeConnector *connector);
bool present(DrmBuffer *buffer);
bool present(const QSharedPointer<DrmBuffer> &buffer);
void pageFlipped();
// These values are defined by the kernel
@ -105,7 +106,7 @@ private:
// and save the connector ids in the DrmCrtc instance.
DrmOutput(DrmBackend *backend, DrmGpu* gpu);
bool presentAtomically(DrmBuffer *buffer);
bool presentAtomically(const QSharedPointer<DrmBuffer> &buffer);
enum class AtomicCommitMode {
Test,
@ -113,7 +114,7 @@ private:
};
bool doAtomicCommit(AtomicCommitMode mode);
bool presentLegacy(DrmBuffer *buffer);
bool presentLegacy(const QSharedPointer<DrmBuffer> &buffer);
bool setModeLegacy(DrmBuffer *buffer);
void initEdid(drmModeConnector *connector);
void initDpms(drmModeConnector *connector);

View file

@ -162,7 +162,7 @@ bool EglGbmBackend::initRenderingContext()
return true;
}
EGLSurface EglGbmBackend::createEglSurface(std::shared_ptr<GbmSurface> gbmSurface) const
EGLSurface EglGbmBackend::createEglSurface(QSharedPointer<GbmSurface> gbmSurface) const
{
auto eglSurface = eglCreatePlatformWindowSurfaceEXT(eglDisplay(), config(),
(void *)(gbmSurface->surface()), nullptr);
@ -184,10 +184,10 @@ bool EglGbmBackend::resetOutput(Output &output, DrmOutput *drmOutput)
} else {
flags |= GBM_BO_USE_LINEAR;
}
auto gbmSurface = std::make_shared<GbmSurface>(m_gpu->gbmDevice(),
size.width(), size.height(),
GBM_FORMAT_XRGB8888,
flags);
auto gbmSurface = QSharedPointer<GbmSurface>::create(m_gpu->gbmDevice(),
size.width(), size.height(),
GBM_FORMAT_XRGB8888,
flags);
if (!gbmSurface) {
qCCritical(KWIN_DRM) << "Creating GBM surface failed";
return false;
@ -376,7 +376,7 @@ void EglGbmBackend::initRenderTarget(Output &output)
// Already initialized.
return;
}
std::shared_ptr<GLVertexBuffer> vbo(new GLVertexBuffer(KWin::GLVertexBuffer::Static));
QSharedPointer<GLVertexBuffer> vbo(new GLVertexBuffer(KWin::GLVertexBuffer::Static));
vbo->setData(6, 2, vertices, texCoords);
output.render.vbo = vbo;
}
@ -580,7 +580,7 @@ void EglGbmBackend::aboutToStartPainting(int screenId, const QRegion &damagedReg
bool EglGbmBackend::presentOnOutput(Output &output, const QRegion &damagedRegion)
{
if (output.directScanoutBuffer) {
output.buffer = new DrmSurfaceBuffer(m_gpu->fd(), output.directScanoutBuffer, output.bufferInterface);
output.buffer = QSharedPointer<DrmSurfaceBuffer>::create(m_gpu->fd(), output.directScanoutBuffer, output.bufferInterface);
} else if (isPrimary()) {
if (supportsSwapBuffersWithDamage()) {
QVector<EGLint> rects = regionToRects(output.damageHistory.constFirst(), output.output);
@ -595,7 +595,7 @@ bool EglGbmBackend::presentOnOutput(Output &output, const QRegion &damagedRegion
return false;
}
}
output.buffer = new DrmSurfaceBuffer(m_gpu->fd(), output.gbmSurface);
output.buffer = QSharedPointer<DrmSurfaceBuffer>::create(m_gpu->fd(), output.gbmSurface);
} else {
qCDebug(KWIN_DRM) << "imported gbm_bo does not exist!";
return false;

View file

@ -10,7 +10,7 @@
#define KWIN_EGL_GBM_BACKEND_H
#include "abstract_egl_drm_backend.h"
#include <memory>
#include <QSharedPointer>
struct gbm_surface;
struct gbm_bo;
@ -67,8 +67,8 @@ private:
struct Output {
DrmOutput *output = nullptr;
DrmSurfaceBuffer *buffer = nullptr;
std::shared_ptr<GbmSurface> gbmSurface;
QSharedPointer<DrmSurfaceBuffer> buffer;
QSharedPointer<GbmSurface> gbmSurface;
EGLSurface eglSurface = EGL_NO_SURFACE;
int bufferAge = 0;
/**
@ -79,7 +79,7 @@ private:
struct {
GLuint framebuffer = 0;
GLuint texture = 0;
std::shared_ptr<GLVertexBuffer> vbo;
QSharedPointer<GLVertexBuffer> vbo;
} render;
int dmabufFd = 0;
@ -90,7 +90,7 @@ private:
};
bool resetOutput(Output &output, DrmOutput *drmOutput);
EGLSurface createEglSurface(std::shared_ptr<GbmSurface> gbmSurface) const;
EGLSurface createEglSurface(QSharedPointer<GbmSurface> gbmSurface) const;
bool makeContextCurrent(const Output &output) const;
void setViewport(const Output &output) const;

View file

@ -85,9 +85,6 @@ void EglStreamBackend::cleanupSurfaces()
void EglStreamBackend::cleanupOutput(const Output &o)
{
if (o.buffer != nullptr) {
delete o.buffer;
}
if (o.eglSurface != EGL_NO_SURFACE) {
eglDestroySurface(eglDisplay(), o.eglSurface);
}
@ -283,11 +280,8 @@ bool EglStreamBackend::initRenderingContext()
bool EglStreamBackend::resetOutput(Output &o, DrmOutput *drmOutput)
{
o.output = drmOutput;
if (o.buffer != nullptr) {
delete o.buffer;
}
// dumb buffer used for modesetting
o.buffer = m_gpu->createBuffer(drmOutput->pixelSize());
o.buffer = QSharedPointer<DrmDumbBuffer>::create(m_gpu->fd(), drmOutput->pixelSize());
EGLAttrib streamAttribs[] = {
EGL_STREAM_FIFO_LENGTH_KHR, 0, // mailbox mode

View file

@ -58,7 +58,7 @@ private:
struct Output
{
DrmOutput *output = nullptr;
DrmBuffer *buffer = nullptr;
QSharedPointer<DrmBuffer> buffer;
EGLSurface eglSurface = EGL_NO_SURFACE;
EGLStreamKHR eglStream = EGL_NO_STREAM_KHR;
};

View file

@ -36,26 +36,16 @@ DrmQPainterBackend::DrmQPainterBackend(DrmBackend *backend, DrmGpu *gpu)
if (it == m_outputs.end()) {
return;
}
delete (*it).buffer[0];
delete (*it).buffer[1];
m_outputs.erase(it);
}
);
}
DrmQPainterBackend::~DrmQPainterBackend()
{
for (auto it = m_outputs.begin(); it != m_outputs.end(); ++it) {
delete (*it).buffer[0];
delete (*it).buffer[1];
}
}
void DrmQPainterBackend::initOutput(DrmOutput *output)
{
Output o;
auto initBuffer = [&o, output, this] (int index) {
o.buffer[index] = m_gpu->createBuffer(output->pixelSize());
o.buffer[index] = QSharedPointer<DrmDumbBuffer>::create(m_gpu->fd(), output->pixelSize());
if (o.buffer[index]->map()) {
o.buffer[index]->image()->fill(Qt::black);
}
@ -70,10 +60,8 @@ void DrmQPainterBackend::initOutput(DrmOutput *output)
if (it == m_outputs.end()) {
return;
}
delete (*it).buffer[0];
delete (*it).buffer[1];
auto initBuffer = [it, output, this] (int index) {
it->buffer[index] = m_gpu->createBuffer(output->pixelSize());
it->buffer[index] = QSharedPointer<DrmDumbBuffer>::create(m_gpu->fd(), output->pixelSize());
if (it->buffer[index]->map()) {
it->buffer[index]->image()->fill(Qt::black);
}

View file

@ -12,6 +12,7 @@
#include <QObject>
#include <QVector>
#include <QSharedPointer>
namespace KWin
{
@ -26,7 +27,6 @@ class DrmQPainterBackend : public QObject, public QPainterBackend
Q_OBJECT
public:
DrmQPainterBackend(DrmBackend *backend, DrmGpu *gpu);
~DrmQPainterBackend() override;
QImage *bufferForScreen(int screenId) override;
bool needsFullRepaint(int screenId) const override;
@ -36,7 +36,7 @@ public:
private:
void initOutput(DrmOutput *output);
struct Output {
DrmDumbBuffer *buffer[2];
QSharedPointer<DrmDumbBuffer> buffer[2];
DrmOutput *output;
int index = 0;
};