70
70
eglDestroyContext(m_display, m_context);
71
eglDestroySurface(m_display, m_surface);
72
72
eglTerminate(m_display);
73
73
eglReleaseThread();
76
void AbstractEglBackend::cleanupSurfaces()
78
if (m_surface != EGL_NO_SURFACE) {
79
eglDestroySurface(m_display, m_surface);
76
83
bool AbstractEglBackend::initEglAPI()
78
85
EGLint major, minor;
137
144
if (!eglBindWaylandDisplayWL(eglDisplay(), *(WaylandServer::self()->display()))) {
138
145
eglUnbindWaylandDisplayWL = nullptr;
139
146
eglQueryWaylandBufferWL = nullptr;
148
waylandServer()->display()->setEglDisplay(eglDisplay());
276
281
const QRegion &damage = pixmap->toplevel()->damage();
278
283
// TODO: this should be shared with GLTexture::update
279
const QImage im = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
280
for (const QRect &rect : damage.rects()) {
281
glTexSubImage2D(m_target, 0, rect.x(), rect.y(), rect.width(), rect.height(),
282
GL_BGRA, GL_UNSIGNED_BYTE, im.copy(rect).bits());
284
if (GLPlatform::instance()->isGLES()) {
285
if (s_supportsARGB32 && (image.format() == QImage::Format_ARGB32 || image.format() == QImage::Format_ARGB32_Premultiplied)) {
286
const QImage im = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
287
for (const QRect &rect : damage.rects()) {
288
glTexSubImage2D(m_target, 0, rect.x(), rect.y(), rect.width(), rect.height(),
289
GL_BGRA_EXT, GL_UNSIGNED_BYTE, im.copy(rect).bits());
292
const QImage im = image.convertToFormat(QImage::Format_RGBA8888_Premultiplied);
293
for (const QRect &rect : damage.rects()) {
294
glTexSubImage2D(m_target, 0, rect.x(), rect.y(), rect.width(), rect.height(),
295
GL_RGBA, GL_UNSIGNED_BYTE, im.copy(rect).bits());
299
const QImage im = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
300
for (const QRect &rect : damage.rects()) {
301
glTexSubImage2D(m_target, 0, rect.x(), rect.y(), rect.width(), rect.height(),
302
GL_BGRA, GL_UNSIGNED_BYTE, im.copy(rect).bits());
319
glTexImage2D(m_target, 0, format, size.width(), size.height(), 0,
320
GL_BGRA, GL_UNSIGNED_BYTE, image.bits());
336
if (GLPlatform::instance()->isGLES()) {
337
if (s_supportsARGB32 && format == GL_RGBA8) {
338
const QImage im = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
339
glTexImage2D(m_target, 0, GL_BGRA_EXT, im.width(), im.height(),
340
0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, im.bits());
342
const QImage im = image.convertToFormat(QImage::Format_RGBA8888_Premultiplied);
343
glTexImage2D(m_target, 0, GL_RGBA, im.width(), im.height(),
344
0, GL_RGBA, GL_UNSIGNED_BYTE, im.bits());
347
glTexImage2D(m_target, 0, format, size.width(), size.height(), 0,
348
GL_BGRA, GL_UNSIGNED_BYTE, image.bits());
323
352
q->setYInverted(true);
354
383
EGLImageKHR AbstractEglTexture::attach(const QPointer< KWayland::Server::BufferInterface > &buffer)
356
EGLint format, width, height, yInverted;
385
EGLint format, yInverted;
357
386
eglQueryWaylandBufferWL(m_backend->eglDisplay(), buffer->resource(), EGL_TEXTURE_FORMAT, &format);
358
387
if (format != EGL_TEXTURE_RGB && format != EGL_TEXTURE_RGBA) {
359
388
qCDebug(KWIN_CORE) << "Unsupported texture format: " << format;
360
389
return EGL_NO_IMAGE_KHR;
362
eglQueryWaylandBufferWL(m_backend->eglDisplay(), buffer->resource(), EGL_WAYLAND_Y_INVERTED_WL, &yInverted);
363
eglQueryWaylandBufferWL(m_backend->eglDisplay(), buffer->resource(), EGL_WIDTH, &width);
364
eglQueryWaylandBufferWL(m_backend->eglDisplay(), buffer->resource(), EGL_HEIGHT, &height);
391
if (!eglQueryWaylandBufferWL(m_backend->eglDisplay(), buffer->resource(), EGL_WAYLAND_Y_INVERTED_WL, &yInverted)) {
392
// if EGL_WAYLAND_Y_INVERTED_WL is not supported wl_buffer should be treated as if value were EGL_TRUE
393
yInverted = EGL_TRUE;
366
396
const EGLint attribs[] = {
367
397
EGL_WAYLAND_PLANE_WL, 0,
371
401
(EGLClientBuffer)buffer->resource(), attribs);
372
402
if (image != EGL_NO_IMAGE_KHR) {
373
403
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)image);
374
m_size = QSize(width, height);
404
m_size = buffer->size();
376
406
q->setYInverted(yInverted);