20#include <drm_fourcc.h>
33 return m_current->texture();
40 const QSize nativeSize = m_output->
modeSize();
41 if (!m_swapchain || m_swapchain->size() != nativeSize) {
48 m_current = m_swapchain->acquire();
54 m_query = std::make_unique<GLRenderTimeQuery>();
76 return m_query->result();
78 return std::chrono::nanoseconds::zero();
102 return m_allocator.get();
105bool VirtualEglBackend::initializeEgl()
110 for (
const QByteArray &extension : {QByteArrayLiteral(
"EGL_EXT_platform_base"), QByteArrayLiteral(
"EGL_KHR_platform_gbm")}) {
112 qCWarning(KWIN_VIRTUAL) << extension <<
"client extension is not supported by the platform";
130 if (!initializeEgl()) {
134 if (!initRenderingContext()) {
135 setFailed(
"Could not initialize rendering context");
141 setFailed(
"Error during init of EglGbmBackend");
148 const auto outputs = m_backend->
outputs();
149 for (
Output *output : outputs) {
157bool VirtualEglBackend::initRenderingContext()
162void VirtualEglBackend::addOutput(Output *output)
165 m_outputs[output] = std::make_unique<VirtualEglLayer>(output,
this);
168void VirtualEglBackend::removeOutput(Output *output)
171 m_outputs.erase(output);
176 return std::make_unique<BasicEGLSurfaceTextureWayland>(
this, pixmap);
181 return m_outputs[output].get();
191 auto it = m_outputs.find(output);
192 if (it == m_outputs.end()) {
200#include "moc_virtual_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
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)
void setSupportsBufferAge(bool value)
void setFailed(const QString &reason)
Sets the backend initialization to failed.
void outputAdded(Output *output)
void outputRemoved(Output *output)
void outputChange(const QRegion &damagedRegion)
EglDisplay * sceneEglDisplayObject() const override
gbm_device * gbmDevice() const
void setEglDisplay(std::unique_ptr< EglDisplay > &&display)
Outputs outputs() const override
OpenGL Backend using Egl on a GBM surface.
void present(Output *output, const std::shared_ptr< OutputFrame > &frame) override
VirtualEglBackend(VirtualBackend *b)
~VirtualEglBackend() override
VirtualBackend * backend() const
std::unique_ptr< SurfaceTexture > createSurfaceTextureWayland(SurfacePixmap *pixmap) override
GraphicsBufferAllocator * graphicsBufferAllocator() const override
OutputLayer * primaryLayer(Output *output) override
std::pair< std::shared_ptr< KWin::GLTexture >, ColorDescription > textureForOutput(Output *output) const override
std::optional< OutputLayerBeginFrameInfo > beginFrame() override
std::shared_ptr< GLTexture > texture() const
bool endFrame(const QRegion &renderedRegion, const QRegion &damagedRegion) override
std::chrono::nanoseconds queryRenderTime() const override
VirtualEglLayer(Output *output, VirtualEglBackend *backend)
KWIN_EXPORT QRect infiniteRegion()
bool checkGLError(const char *txt)
RenderTarget renderTarget