KWin
Loading...
Searching...
No Matches
x11_standalone_egl_backend.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#pragma once
8
9#include "core/outputlayer.h"
10#include "options.h"
13#include "utils/damagejournal.h"
14
15#include "opengl/gltexture.h"
16#include "opengl/gltexture_p.h"
17
18typedef struct _XDisplay Display;
19
20namespace KWin
21{
22
23class EglPixmapTexturePrivate;
24class SoftwareVsyncMonitor;
25class X11StandaloneBackend;
26class EglBackend;
27class GLRenderTimeQuery;
28
29class EglLayer : public OutputLayer
30{
31public:
32 EglLayer(EglBackend *backend);
33
34 std::optional<OutputLayerBeginFrameInfo> beginFrame() override;
35 bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override;
36 std::chrono::nanoseconds queryRenderTime() const override;
37
38private:
39 EglBackend *const m_backend;
40};
41
43{
44 Q_OBJECT
45
46public:
47 EglBackend(::Display *display, X11StandaloneBackend *platform);
48 ~EglBackend() override;
49
50 void init() override;
51
52 std::unique_ptr<SurfaceTexture> createSurfaceTextureX11(SurfacePixmapX11 *texture) override;
54 void endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion);
55 void present(Output *output, const std::shared_ptr<OutputFrame> &frame) override;
56 OverlayWindow *overlayWindow() const override;
57 OutputLayer *primaryLayer(Output *output) override;
58 std::chrono::nanoseconds queryRenderTime();
59
60protected:
61 EGLConfig chooseBufferConfig();
63
64private:
65 void screenGeometryChanged();
66 void presentSurface(EGLSurface surface, const QRegion &damage, const QRect &screenGeometry);
67 void vblank(std::chrono::nanoseconds timestamp);
68 EGLSurface createSurface(xcb_window_t window);
69
70 X11StandaloneBackend *m_backend;
71 std::unique_ptr<SoftwareVsyncMonitor> m_vsyncMonitor;
72 std::unique_ptr<OverlayWindow> m_overlayWindow;
73 DamageJournal m_damageJournal;
74 std::unique_ptr<GLFramebuffer> m_fbo;
75 int m_bufferAge = 0;
76 QRegion m_lastRenderedRegion;
77 std::unique_ptr<EglLayer> m_layer;
78 std::unique_ptr<GLRenderTimeQuery> m_query;
79 int m_havePostSubBuffer = false;
80 bool m_havePlatformBase = false;
82 std::shared_ptr<OutputFrame> m_frame;
83};
84
86{
87public:
88 explicit EglPixmapTexture(EglBackend *backend);
89 ~EglPixmapTexture() override;
90
92
93private:
94 void onDamage() override;
95
96 EglBackend *const m_backend;
97 EGLImageKHR m_image = EGL_NO_IMAGE_KHR;
98};
99
101{
102public:
104
105 bool create() override;
106 void update(const QRegion &region) override;
107};
108
109} // namespace KWin
EglBackend(::Display *display, X11StandaloneBackend *platform)
std::chrono::nanoseconds queryRenderTime()
OverlayWindow * overlayWindow() const override
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
void endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion)
std::unique_ptr< SurfaceTexture > createSurfaceTextureX11(SurfacePixmapX11 *texture) override
OutputLayerBeginFrameInfo beginFrame()
OutputLayer * primaryLayer(Output *output) override
EglLayer(EglBackend *backend)
std::chrono::nanoseconds queryRenderTime() const override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
EglSurfaceTextureX11(EglBackend *backend, SurfacePixmapX11 *texture)
void update(const QRegion &region) override
GLuint texture() const
OpenGLSurfaceContents texture() const
OpenGLBackend * backend() const
void * EGLImageKHR
struct _XDisplay Display