2011/9/8 Chia-I Wu <olva...@gmail.com>: > From: Chia-I Wu <o...@lunarg.com> > > Return true for NATIVE_PARAM_PREMULTIPLIED_ALPHA when all formats with > alpha support premultiplied alpha. Currently, it means when argb32 and > argb32_pre are both supported. > --- > .../state_trackers/egl/wayland/native_drm.c | 8 ++++++-- > .../state_trackers/egl/wayland/native_shm.c | 6 +++++- > .../state_trackers/egl/wayland/native_wayland.c | 18 ++++++++++++++++++ > .../state_trackers/egl/wayland/native_wayland.h | 3 +++ > 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 facab32..e177e7c 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;
Why enable premultiplied alpha if argb32 is not exposed? What isnt covered with just: "if (drmdpy->argb32_pre)"?. > + > 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 5882e74..e2d2437 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 14cc908..b2dab8f 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 93e670b..6cf98a8 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 { > -- > 1.7.5.4 > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev