0f2f69ad7c
One of the scene redesign goals is to make wayland surface items re-usable. So we have the same rendering path for drag-and-drop icons, software cursors, and window surfaces. The biggest issue at the moment is that window pixmaps are tightly coupled with scene windows. This change de-couples window pixmaps from scene windows. In order to achieve that, some architecture changes were made. The WindowPixmap class was replaced with the SurfacePixmap class. A surface pixmap is created by a surface item. Under the hood, a SurfacePixmap will create a PlatformSurfaceTexture object, which contains all the information necessary for the renderer. The SceneOpenGLTexture class was removed. However, the GLX and the EGL on X11 backends still mess with GLTexture's internals.
102 lines
3 KiB
C++
102 lines
3 KiB
C++
/*
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
SPDX-FileCopyrightText: 2019 NVIDIA Inc.
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
#ifndef KWIN_EGL_STREAM_BACKEND_H
|
|
#define KWIN_EGL_STREAM_BACKEND_H
|
|
#include "abstract_egl_drm_backend.h"
|
|
#include "basiceglsurfacetexture_wayland.h"
|
|
#include <KWaylandServer/surface_interface.h>
|
|
#include <KWaylandServer/eglstream_controller_interface.h>
|
|
#include <wayland-server-core.h>
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class DrmOutput;
|
|
class DrmBuffer;
|
|
|
|
/**
|
|
* @brief OpenGL Backend using Egl with an EGLDevice.
|
|
*/
|
|
class EglStreamBackend : public AbstractEglDrmBackend
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
EglStreamBackend(DrmBackend *b, DrmGpu *gpu);
|
|
~EglStreamBackend() override;
|
|
PlatformSurfaceTexture *createPlatformSurfaceTextureInternal(SurfacePixmapInternal *pixmap) override;
|
|
PlatformSurfaceTexture *createPlatformSurfaceTextureWayland(SurfacePixmapWayland *pixmap) override;
|
|
QRegion beginFrame(int screenId) override;
|
|
void endFrame(int screenId, const QRegion &damage, const QRegion &damagedRegion) override;
|
|
void init() override;
|
|
|
|
int screenCount() const override {
|
|
return m_outputs.count();
|
|
}
|
|
|
|
void addOutput(DrmOutput *output) override;
|
|
void removeOutput(DrmOutput *output) override;
|
|
|
|
protected:
|
|
void cleanupSurfaces() override;
|
|
|
|
private:
|
|
bool initializeEgl();
|
|
bool initBufferConfigs();
|
|
bool initRenderingContext();
|
|
struct StreamTexture
|
|
{
|
|
EGLStreamKHR stream;
|
|
GLuint texture;
|
|
};
|
|
StreamTexture *lookupStreamTexture(KWaylandServer::SurfaceInterface *surface);
|
|
void attachStreamConsumer(KWaylandServer::SurfaceInterface *surface,
|
|
void *eglStream,
|
|
wl_array *attribs);
|
|
struct Output
|
|
{
|
|
DrmOutput *output = nullptr;
|
|
QSharedPointer<DrmBuffer> buffer;
|
|
EGLSurface eglSurface = EGL_NO_SURFACE;
|
|
EGLStreamKHR eglStream = EGL_NO_STREAM_KHR;
|
|
};
|
|
bool resetOutput(Output &output, DrmOutput *drmOutput);
|
|
bool makeContextCurrent(const Output &output);
|
|
bool presentOnOutput(Output &output);
|
|
void cleanupOutput(const Output &output);
|
|
|
|
QVector<Output> m_outputs;
|
|
KWaylandServer::EglStreamControllerInterface *m_eglStreamControllerInterface;
|
|
QHash<KWaylandServer::SurfaceInterface *, StreamTexture> m_streamTextures;
|
|
|
|
friend class EglStreamSurfaceTextureWayland;
|
|
};
|
|
|
|
class EglStreamSurfaceTextureWayland : public BasicEGLSurfaceTextureWayland
|
|
{
|
|
public:
|
|
EglStreamSurfaceTextureWayland(EglStreamBackend *backend, SurfacePixmapWayland *pixmap);
|
|
~EglStreamSurfaceTextureWayland() override;
|
|
|
|
bool create() override;
|
|
void update(const QRegion ®ion) override;
|
|
|
|
private:
|
|
bool acquireStreamFrame(EGLStreamKHR stream);
|
|
void createFbo();
|
|
void copyExternalTexture(GLuint tex);
|
|
bool attachBuffer(KWaylandServer::BufferInterface *buffer);
|
|
|
|
EglStreamBackend *m_backend;
|
|
GLuint m_fbo, m_rbo, m_textureId;
|
|
GLenum m_format;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
#endif
|