diff options
4 files changed, 32 insertions, 3 deletions
diff --git a/src/gallium/state_trackers/egl/wayland/native_drm.c b/src/gallium/state_trackers/egl/wayland/native_drm.c index facab3218fb..e177e7cd6c9 100644 --- a/src/gallium/state_trackers/egl/wayland/native_drm.c +++ b/src/gallium/state_trackers/egl/wayland/native_drm.c @@ -114,8 +114,8 @@ wayland_create_drm_buffer(struct wayland_display *display, switch (surface->color_format) { case PIPE_FORMAT_B8G8R8A8_UNORM: - /* assume premultiplied */ - format = WL_DRM_FORMAT_PREMULTIPLIED_ARGB32; + format = (surface->premultiplied_alpha) ? + WL_DRM_FORMAT_PREMULTIPLIED_ARGB32 : WL_DRM_FORMAT_ARGB32; break; case PIPE_FORMAT_B8G8R8X8_UNORM: format = WL_DRM_FORMAT_XRGB32; @@ -255,6 +255,10 @@ wayland_drm_display_init_screen(struct native_display *ndpy) if (!wayland_drm_display_add_configs(drmdpy)) return FALSE; + /* check that premultiplied alpha is supported for all formats with alpha */ + if (!drmdpy->argb32 || drmdpy->argb32_pre) + drmdpy->base.param_premultiplied_alpha = TRUE; + drmdpy->base.base.screen = drmdpy->event_handler->new_drm_screen(&drmdpy->base.base, NULL, drmdpy->fd); diff --git a/src/gallium/state_trackers/egl/wayland/native_shm.c b/src/gallium/state_trackers/egl/wayland/native_shm.c index 5882e74c653..e2d24379342 100644 --- a/src/gallium/state_trackers/egl/wayland/native_shm.c +++ b/src/gallium/state_trackers/egl/wayland/native_shm.c @@ -95,7 +95,8 @@ wayland_create_shm_buffer(struct wayland_display *display, switch (surface->color_format) { case PIPE_FORMAT_B8G8R8A8_UNORM: - format = WL_SHM_FORMAT_PREMULTIPLIED_ARGB32; + format = (surface->premultiplied_alpha) ? + WL_SHM_FORMAT_PREMULTIPLIED_ARGB32 : WL_SHM_FORMAT_ARGB32; break; case PIPE_FORMAT_B8G8R8X8_UNORM: format = WL_SHM_FORMAT_XRGB32; @@ -165,6 +166,9 @@ wayland_shm_display_init_screen(struct native_display *ndpy) if (!wayland_shm_display_add_configs(shmdpy)) return FALSE; + /* assume all formats are supported */ + shmdpy->base.param_premultiplied_alpha = TRUE; + winsys = wayland_create_sw_winsys(shmdpy->base.dpy); if (!winsys) return FALSE; diff --git a/src/gallium/state_trackers/egl/wayland/native_wayland.c b/src/gallium/state_trackers/egl/wayland/native_wayland.c index 14cc908cf7a..b2dab8fae53 100644 --- a/src/gallium/state_trackers/egl/wayland/native_wayland.c +++ b/src/gallium/state_trackers/egl/wayland/native_wayland.c @@ -60,9 +60,13 @@ static int wayland_display_get_param(struct native_display *ndpy, enum native_param_type param) { + struct wayland_display *display = wayland_display(ndpy); int val; switch (param) { + case NATIVE_PARAM_PREMULTIPLIED_ALPHA: + val = display->param_premultiplied_alpha; + break; case NATIVE_PARAM_USE_NATIVE_BUFFER: case NATIVE_PARAM_PRESERVE_BUFFER: case NATIVE_PARAM_MAX_SWAP_INTERVAL: @@ -283,6 +287,20 @@ wayland_surface_present(struct native_surface *nsurf, if (ctrl->preserve || ctrl->swap_interval) return FALSE; + /* force buffers to be re-created if they will be presented differently */ + if (surface->premultiplied_alpha != ctrl->premultiplied_alpha) { + enum wayland_buffer_type buffer; + + for (buffer = 0; buffer < WL_BUFFER_COUNT; ++buffer) { + if (surface->buffer[buffer]) { + wl_buffer_destroy(surface->buffer[buffer]); + surface->buffer[buffer] = NULL; + } + } + + surface->premultiplied_alpha = ctrl->premultiplied_alpha; + } + switch (ctrl->natt) { case NATIVE_ATTACHMENT_FRONT_LEFT: ret = TRUE; diff --git a/src/gallium/state_trackers/egl/wayland/native_wayland.h b/src/gallium/state_trackers/egl/wayland/native_wayland.h index 93e670babeb..6cf98a8e91c 100644 --- a/src/gallium/state_trackers/egl/wayland/native_wayland.h +++ b/src/gallium/state_trackers/egl/wayland/native_wayland.h @@ -44,6 +44,8 @@ struct wayland_display { struct wayland_config *configs; int num_configs; + /* true if all formats with alpha support premultiplied alpha */ + boolean param_premultiplied_alpha; struct wl_buffer *(*create_buffer)(struct wayland_display *display, struct wayland_surface *surface, @@ -79,6 +81,7 @@ struct wayland_surface { unsigned int attachment_mask; boolean block_swap_buffers; + boolean premultiplied_alpha; }; struct wayland_config { |