diff options
-rw-r--r-- | src/plugins/platforms/wayland/qwaylanddrmsurface.cpp | 17 | ||||
-rw-r--r-- | src/plugins/platforms/wayland/qwaylandintegration.cpp | 10 | ||||
-rw-r--r-- | src/plugins/platforms/wayland/qwaylandintegration.h | 3 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp index 7756e85..cb4445c 100644 --- a/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylanddrmsurface.cpp @@ -112,7 +112,7 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, : mDisplay(display) , mSize(size) { - Q_UNUSED(format); + struct wl_visual *visual; EGLint name, stride; static const EGLint contextAttribs[] = { @@ -143,8 +143,21 @@ QWaylandDrmBuffer::QWaylandDrmBuffer(QWaylandDisplay *display, eglExportDRMImageMESA(mDisplay->eglDisplay(), mImage, &name, NULL, &stride); + switch (format) { + case QImage::Format_ARGB32: + visual = display->argbVisual(); + break; + case QImage::Format_ARGB32_Premultiplied: + visual = display->argbPremultipliedVisual(); + break; + default: + qDebug("unsupported buffer format %d requested\n", format); + visual = display->argbVisual(); + break; + } + mBuffer = display->createDrmBuffer(name, size.width(), size.height(), - stride, display->argbVisual()); + stride, visual); } QWaylandDrmBuffer::~QWaylandDrmBuffer(void) diff --git a/src/plugins/platforms/wayland/qwaylandintegration.cpp b/src/plugins/platforms/wayland/qwaylandintegration.cpp index 0109678..19f339a 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.cpp +++ b/src/plugins/platforms/wayland/qwaylandintegration.cpp @@ -185,11 +185,21 @@ struct wl_buffer *QWaylandDisplay::createDrmBuffer(int name, return wl_drm_create_buffer(mDrm, name, width, height, stride, visual); } +struct wl_visual *QWaylandDisplay::rgbVisual() +{ + return wl_display_get_rgb_visual(mDisplay); +} + struct wl_visual *QWaylandDisplay::argbVisual() { return wl_display_get_argb_visual(mDisplay); } +struct wl_visual *QWaylandDisplay::argbPremultipliedVisual() +{ + return wl_display_get_premultiplied_argb_visual(mDisplay); +} + void QWaylandDisplay::drmHandleDevice(void *data, struct wl_drm *drm, const char *device) { diff --git a/src/plugins/platforms/wayland/qwaylandintegration.h b/src/plugins/platforms/wayland/qwaylandintegration.h index 1c5f834..611ce43 100644 --- a/src/plugins/platforms/wayland/qwaylandintegration.h +++ b/src/plugins/platforms/wayland/qwaylandintegration.h @@ -79,8 +79,9 @@ public: struct wl_buffer *createDrmBuffer(int name, int width, int height, uint32_t stride, struct wl_visual *visual); - + struct wl_visual *rgbVisual(); struct wl_visual *argbVisual(); + struct wl_visual *argbPremultipliedVisual(); EGLDisplay eglDisplay() { return mEglDisplay; } void setCursor(QWaylandBuffer *buffer, int32_t x, int32_t y); |