18#include <drm_fourcc.h>
39 const QSize bufferSize = m_output->
modeSize();
40 if (!m_swapchain || m_swapchain->size() != bufferSize) {
41 const uint32_t
format = DRM_FORMAT_XRGB8888;
52 m_buffer = m_swapchain->acquire();
61 m_query = std::make_unique<GLRenderTimeQuery>();
78 xcb_pixmap_t pixmap = m_output->
importBuffer(m_buffer->buffer());
79 Q_ASSERT(pixmap != XCB_PIXMAP_NONE);
81 xcb_xfixes_region_t valid = 0;
82 xcb_xfixes_region_t update = 0;
85 uint64_t targetMsc = 0;
107 m_swapchain->release(m_buffer);
112 return m_buffer->texture();
118 return m_query->result();
130 m_framebuffer.reset();
140 const auto tmp =
size().expandedTo(QSize(64, 64));
141 const QSize bufferSize(std::ceil(tmp.width()), std::ceil(tmp.height()));
142 if (!m_texture || m_texture->size() != bufferSize) {
147 m_framebuffer = std::make_unique<GLFramebuffer>(m_texture.get());
150 m_query = std::make_unique<GLRenderTimeQuery>();
161 QImage buffer(m_framebuffer->size(), QImage::Format_RGBA8888_Premultiplied);
164 glReadPixels(0, 0, buffer.width(), buffer.height(), GL_RGBA, GL_UNSIGNED_BYTE, buffer.bits());
176 return m_query->result();
197 return m_allocator.get();
200bool X11WindowedEglBackend::initializeEgl()
205 for (
const QByteArray &extension : {QByteArrayLiteral(
"EGL_EXT_platform_base"), QByteArrayLiteral(
"EGL_KHR_platform_gbm")}) {
207 qCWarning(KWIN_X11WINDOWED) << extension <<
"client extension is not supported by the platform";
223bool X11WindowedEglBackend::initRenderingContext()
234 qputenv(
"EGL_PLATFORM",
"x11");
236 if (!initializeEgl()) {
237 setFailed(QStringLiteral(
"Could not initialize egl"));
240 if (!initRenderingContext()) {
241 setFailed(QStringLiteral(
"Could not initialize rendering context"));
248 const auto &outputs = m_backend->
outputs();
249 for (
const auto &output : outputs) {
251 m_outputs[output] = Layers{
252 .primaryLayer = std::make_unique<X11WindowedEglPrimaryLayer>(
this, x11Output),
253 .cursorLayer = std::make_unique<X11WindowedEglCursorLayer>(
this, x11Output),
265 m_outputs[output].primaryLayer->present();
271 return m_outputs[output].primaryLayer.get();
276 return m_outputs[output].cursorLayer.get();
281 return std::make_unique<BasicEGLSurfaceTextureWayland>(
this, pixmap);
286 auto it = m_outputs.find(output);
287 if (it == m_outputs.end()) {
295#include "moc_x11_windowed_egl_backend.cpp"
void initClientExtensions()
bool makeCurrent() override
bool hasClientExtension(const QByteArray &ext) const
void setEglDisplay(EglDisplay *display)
EglContext * contextObject()
bool createContext(EGLConfig config)
static const ColorDescription sRGB
bool makeCurrent(EGLSurface surface=EGL_NO_SURFACE) const
static std::unique_ptr< EglDisplay > create(::EGLDisplay display, bool owning=true)
static std::shared_ptr< EglSwapchain > create(GraphicsBufferAllocator *allocator, EglContext *context, const QSize &size, uint32_t format, const QList< uint64_t > &modifiers)
static GLFramebuffer * popFramebuffer()
static void pushFramebuffer(GLFramebuffer *fbo)
static std::unique_ptr< GLTexture > allocate(GLenum internalFormat, const QSize &size, int levels=1)
void setFailed(const QString &reason)
Sets the backend initialization to failed.
void outputChange(const QRegion &damagedRegion)
void setEglDisplay(std::unique_ptr< EglDisplay > &&display)
gbm_device * gbmDevice() const
xcb_connection_t * connection() const
EglDisplay * sceneEglDisplayObject() const override
QHash< uint32_t, QList< uint64_t > > driFormats() const
Outputs outputs() const override
void update(const QImage &image, const QPointF &hotspot)
OpenGL Backend using Egl windowing system over an X overlay window.
OutputLayer * primaryLayer(Output *output) override
void cleanupSurfaces() override
std::pair< std::shared_ptr< GLTexture >, ColorDescription > textureForOutput(Output *output) const override
std::unique_ptr< SurfaceTexture > createSurfaceTextureWayland(SurfacePixmap *pixmap) override
~X11WindowedEglBackend() override
OutputLayer * cursorLayer(Output *output) override
X11WindowedBackend * backend() const
GraphicsBufferAllocator * graphicsBufferAllocator() const override
X11WindowedEglBackend(X11WindowedBackend *backend)
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
X11WindowedEglCursorLayer(X11WindowedEglBackend *backend, X11WindowedOutput *output)
std::chrono::nanoseconds queryRenderTime() const override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
~X11WindowedEglCursorLayer() override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
std::chrono::nanoseconds queryRenderTime() const override
X11WindowedEglPrimaryLayer(X11WindowedEglBackend *backend, X11WindowedOutput *output)
~X11WindowedEglPrimaryLayer() override
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::shared_ptr< GLTexture > texture() const
xcb_pixmap_t importBuffer(GraphicsBuffer *buffer)
QRegion exposedArea() const
X11WindowedCursor * cursor() const
X11WindowedBackend * backend() const
xcb_window_t window() const
KWIN_EXPORT QRect infiniteRegion()
struct KWin::@10 formatTable[]
RenderTarget renderTarget