[Mesa-dev] [PATCH] st/egl: Prepare for EGL_ALPHA_FORMAT

Chia-I Wu olv at lunarg.com
Thu Sep 1 21:43:44 PDT 2011


On Thu, Sep 1, 2011 at 5:53 PM, Benjamin Franzke
<benjaminfranzke at googlemail.com> wrote:
> In preparation for wayland ALPHA_FORMAT usage,
> see commit 7b1d94e5d1f53ac5f59000176aea1d02fc9a1181.
>
> Changes:
>  - New native_config surface_type bit: alpha_format_pre_bit
>  - Introduction of native_surface_attribs
>   (as new parameter in create_{window,pixmap}_surface)
>  - New attrib alpha_format in native_surface_attribs
EGL_VG_ALPHA_FORMAT_PRE is supposed to only change the behavior of
st/vega.  It is suggested that the window system should not rely on
it.  I wonder if there are other (clean) ways do achieve the same
goal..

That said, I am thinking modeling it with

 - Add "struct native_surface_present" and have
   native_surface::present() takes the surface and the struct as its
   arguments.  This is just a clean up step.
 - Add NATIVE_PARAM_USE_VG_ALPHA_FORMAT_PRE to the display parameter.
   When it is true, set EGL_VG_ALPHA_FORMAT_PRE_BIT for all configs.
   As st/vega does not support pre-multiplied alpha, EGL_OPENVG_BIT
   should be cleared meanwhile.
 - Add a boolean to native_surface_present to indicate the
   presented buffer should be treated as with pre-multiplied alpha or
   not.

I've also attached a diff to native.h.

The changes are based on the assumptions that

 - The display server allows EGL to control how a presented buffer
   is composited: assuming premultiplied alpha or not.
 - The display server expects EGL to expose the functionality through
   EGL_VG_ALPHA_FORMAT.

Are the assumptions true under wayland?  Thoughts?

> CC: Chia-I Wu <olv at lunarg.com>
> ---
>  .../state_trackers/egl/android/native_android.cpp  |    3 ++-
>  src/gallium/state_trackers/egl/common/egl_g3d.c    |    3 +++
>  .../state_trackers/egl/common/egl_g3d_api.c        |   13 +++++++++++--
>  .../state_trackers/egl/common/egl_g3d_image.c      |    2 +-
>  src/gallium/state_trackers/egl/common/native.h     |   11 +++++++++--
>  .../state_trackers/egl/common/native_helper.c      |    2 +-
>  src/gallium/state_trackers/egl/drm/native_drm.c    |    3 ++-
>  src/gallium/state_trackers/egl/gdi/native_gdi.c    |    3 ++-
>  .../state_trackers/egl/wayland/native_wayland.c    |    6 ++++--
>  src/gallium/state_trackers/egl/x11/native_dri2.c   |    6 ++++--
>  src/gallium/state_trackers/egl/x11/native_ximage.c |    6 ++++--
>  11 files changed, 43 insertions(+), 15 deletions(-)
>
> diff --git a/src/gallium/state_trackers/egl/android/native_android.cpp b/src/gallium/state_trackers/egl/android/native_android.cpp
> index 338427d..e4a74b3 100644
> --- a/src/gallium/state_trackers/egl/android/native_android.cpp
> +++ b/src/gallium/state_trackers/egl/android/native_android.cpp
> @@ -494,7 +494,8 @@ android_surface_destroy(struct native_surface *nsurf)
>  static struct native_surface *
>  android_display_create_window_surface(struct native_display *ndpy,
>                                       EGLNativeWindowType win,
> -                                      const struct native_config *nconf)
> +                                      const struct native_config *nconf,
> +                                      const struct native_surface_attribs *attr)
>  {
>    struct android_display *adpy = android_display(ndpy);
>    struct android_config *aconf = android_config(nconf);
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c
> index b5e3d99..233867b 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d.c
> @@ -262,6 +262,9 @@ init_config_attributes(_EGLConfig *conf, const struct native_config *nconf,
>       surface_type |= EGL_PBUFFER_BIT;
>    }
>
> +   if (nconf->alpha_format_pre_bit)
> +      surface_type |= EGL_VG_ALPHA_FORMAT_PRE_BIT;
> +
>    conf->Conformant = api_mask;
>    conf->RenderableType = api_mask;
>
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> index f897054..1b81e78 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> @@ -217,6 +217,13 @@ struct egl_g3d_create_surface_arg {
>    } u;
>  };
>
> +static void
> +egl_g3d_fill_surface_attribs(struct egl_g3d_surface *gsurf,
> +                             struct native_surface_attribs *attr)
> +{
> +   attr->alpha_format = gsurf->base.VGAlphaFormat;
> +}
> +
>  static _EGLSurface *
>  egl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
>                        struct egl_g3d_create_surface_arg *arg,
> @@ -226,6 +233,7 @@ egl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
>    struct egl_g3d_config *gconf = egl_g3d_config(conf);
>    struct egl_g3d_surface *gsurf;
>    struct native_surface *nsurf;
> +   struct native_surface_attribs nsurf_attr;
>    const char *err;
>
>    switch (arg->type) {
> @@ -255,16 +263,17 @@ egl_g3d_create_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf,
>       FREE(gsurf);
>       return NULL;
>    }
> +   egl_g3d_fill_surface_attribs(gsurf, &nsurf_attr);
>
>    /* create the native surface */
>    switch (arg->type) {
>    case EGL_WINDOW_BIT:
>       nsurf = gdpy->native->create_window_surface(gdpy->native,
> -            arg->u.win, gconf->native);
> +            arg->u.win, gconf->native, &nsurf_attr);
>       break;
>    case EGL_PIXMAP_BIT:
>       nsurf = gdpy->native->create_pixmap_surface(gdpy->native,
> -            arg->u.pix, gconf->native);
> +            arg->u.pix, gconf->native, &nsurf_attr);
>       break;
>  #ifdef EGL_MESA_screen_surface
>    case EGL_SCREEN_BIT_MESA:
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_image.c b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
> index 4d90c40..6d3315a 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d_image.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_image.c
> @@ -48,7 +48,7 @@ egl_g3d_reference_native_pixmap(_EGLDisplay *dpy, EGLNativePixmapType pix)
>    struct pipe_resource *textures[NUM_NATIVE_ATTACHMENTS];
>    enum native_attachment natt;
>
> -   nsurf = gdpy->native->create_pixmap_surface(gdpy->native, pix, NULL);
> +   nsurf = gdpy->native->create_pixmap_surface(gdpy->native, pix, NULL, NULL);
>    if (!nsurf)
>       return NULL;
>
> diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h
> index 58593a4..5df8e7d 100644
> --- a/src/gallium/state_trackers/egl/common/native.h
> +++ b/src/gallium/state_trackers/egl/common/native.h
> @@ -111,6 +111,10 @@ struct native_surface {
>    void (*wait)(struct native_surface *nsurf);
>  };
>
> +struct native_surface_attribs {
> +   uint alpha_format;
> +};
> +
>  /**
>  * Describe a native display config.
>  */
> @@ -123,6 +127,7 @@ struct native_config {
>    boolean window_bit;
>    boolean pixmap_bit;
>    boolean scanout_bit;
> +   boolean alpha_format_pre_bit;
>
>    int native_visual_id;
>    int native_visual_type;
> @@ -196,7 +201,8 @@ struct native_display {
>     */
>    struct native_surface *(*create_window_surface)(struct native_display *ndpy,
>                                                    EGLNativeWindowType win,
> -                                                   const struct native_config *nconf);
> +                                                   const struct native_config *nconf,
> +                                                   const struct native_surface_attribs *attribs);
>
>    /**
>     * Create a pixmap surface.  The native config may be NULL.  In that case, a
> @@ -205,7 +211,8 @@ struct native_display {
>     */
>    struct native_surface *(*create_pixmap_surface)(struct native_display *ndpy,
>                                                    EGLNativePixmapType pix,
> -                                                   const struct native_config *nconf);
> +                                                   const struct native_config *nconf,
> +                                                   const struct native_surface_attribs *attribs);
>
>    const struct native_display_buffer *buffer;
>    const struct native_display_modeset *modeset;
> diff --git a/src/gallium/state_trackers/egl/common/native_helper.c b/src/gallium/state_trackers/egl/common/native_helper.c
> index cca1e1c..bea7635 100644
> --- a/src/gallium/state_trackers/egl/common/native_helper.c
> +++ b/src/gallium/state_trackers/egl/common/native_helper.c
> @@ -383,7 +383,7 @@ native_display_copy_to_pixmap(struct native_display *ndpy,
>    if (!pipe)
>       return FALSE;
>
> -   nsurf = ndpy->create_pixmap_surface(ndpy, pix, NULL);
> +   nsurf = ndpy->create_pixmap_surface(ndpy, pix, NULL, NULL);
>    if (!nsurf)
>       return FALSE;
>
> diff --git a/src/gallium/state_trackers/egl/drm/native_drm.c b/src/gallium/state_trackers/egl/drm/native_drm.c
> index c013769..0c4e496 100644
> --- a/src/gallium/state_trackers/egl/drm/native_drm.c
> +++ b/src/gallium/state_trackers/egl/drm/native_drm.c
> @@ -247,7 +247,8 @@ static struct native_display_wayland_bufmgr drm_display_wayland_bufmgr = {
>  static struct native_surface *
>  drm_create_pixmap_surface(struct native_display *ndpy,
>                               EGLNativePixmapType pix,
> -                              const struct native_config *nconf)
> +                              const struct native_config *nconf,
> +                              const struct native_surface_attribs *attr)
>  {
>    struct gbm_gallium_drm_bo *bo = (void *) pix;
>
> diff --git a/src/gallium/state_trackers/egl/gdi/native_gdi.c b/src/gallium/state_trackers/egl/gdi/native_gdi.c
> index 6bf0d4e..548d402 100644
> --- a/src/gallium/state_trackers/egl/gdi/native_gdi.c
> +++ b/src/gallium/state_trackers/egl/gdi/native_gdi.c
> @@ -229,7 +229,8 @@ gdi_surface_destroy(struct native_surface *nsurf)
>  static struct native_surface *
>  gdi_display_create_window_surface(struct native_display *ndpy,
>                                   EGLNativeWindowType win,
> -                                  const struct native_config *nconf)
> +                                  const struct native_config *nconf,
> +                                  const struct native_surface_attribs *attr)
>  {
>    struct gdi_display *gdpy = gdi_display(ndpy);
>    struct gdi_surface *gsurf;
> diff --git a/src/gallium/state_trackers/egl/wayland/native_wayland.c b/src/gallium/state_trackers/egl/wayland/native_wayland.c
> index 544d4be..548a340 100644
> --- a/src/gallium/state_trackers/egl/wayland/native_wayland.c
> +++ b/src/gallium/state_trackers/egl/wayland/native_wayland.c
> @@ -352,7 +352,8 @@ wayland_surface_destroy(struct native_surface *nsurf)
>  static struct native_surface *
>  wayland_create_pixmap_surface(struct native_display *ndpy,
>                               EGLNativePixmapType pix,
> -                              const struct native_config *nconf)
> +                              const struct native_config *nconf,
> +                              const struct native_surface_attribs *attr)
>  {
>    struct wayland_display *display = wayland_display(ndpy);
>    struct wayland_surface *surface;
> @@ -406,7 +407,8 @@ wayland_create_pixmap_surface(struct native_display *ndpy,
>  static struct native_surface *
>  wayland_create_window_surface(struct native_display *ndpy,
>                               EGLNativeWindowType win,
> -                              const struct native_config *nconf)
> +                              const struct native_config *nconf,
> +                              const struct native_surface_attribs *attr)
>  {
>    struct wayland_display *display = wayland_display(ndpy);
>    struct wayland_config *config = wayland_config(nconf);
> diff --git a/src/gallium/state_trackers/egl/x11/native_dri2.c b/src/gallium/state_trackers/egl/x11/native_dri2.c
> index 4b8be7b..385810e 100644
> --- a/src/gallium/state_trackers/egl/x11/native_dri2.c
> +++ b/src/gallium/state_trackers/egl/x11/native_dri2.c
> @@ -475,7 +475,8 @@ dri2_display_create_surface(struct native_display *ndpy,
>  static struct native_surface *
>  dri2_display_create_window_surface(struct native_display *ndpy,
>                                    EGLNativeWindowType win,
> -                                   const struct native_config *nconf)
> +                                   const struct native_config *nconf,
> +                                   const struct native_surface_attribs *attr)
>  {
>    struct dri2_surface *dri2surf;
>
> @@ -487,7 +488,8 @@ dri2_display_create_window_surface(struct native_display *ndpy,
>  static struct native_surface *
>  dri2_display_create_pixmap_surface(struct native_display *ndpy,
>                                    EGLNativePixmapType pix,
> -                                   const struct native_config *nconf)
> +                                   const struct native_config *nconf,
> +                                   const struct native_surface_attribs *attr)
>  {
>    struct dri2_surface *dri2surf;
>
> diff --git a/src/gallium/state_trackers/egl/x11/native_ximage.c b/src/gallium/state_trackers/egl/x11/native_ximage.c
> index e7794f0..e5cf860 100644
> --- a/src/gallium/state_trackers/egl/x11/native_ximage.c
> +++ b/src/gallium/state_trackers/egl/x11/native_ximage.c
> @@ -285,7 +285,8 @@ ximage_display_create_surface(struct native_display *ndpy,
>  static struct native_surface *
>  ximage_display_create_window_surface(struct native_display *ndpy,
>                                      EGLNativeWindowType win,
> -                                     const struct native_config *nconf)
> +                                     const struct native_config *nconf,
> +                                     const struct native_surface_attribs *attr)
>  {
>    struct ximage_surface *xsurf;
>
> @@ -323,7 +324,8 @@ get_pixmap_format(struct native_display *ndpy, EGLNativePixmapType pix)
>  static struct native_surface *
>  ximage_display_create_pixmap_surface(struct native_display *ndpy,
>                                      EGLNativePixmapType pix,
> -                                     const struct native_config *nconf)
> +                                     const struct native_config *nconf,
> +                                     const struct native_surface_attribs *attr)
>  {
>    struct ximage_surface *xsurf;
>
> --
> 1.7.3.4
>
>



-- 
olv at LunarG.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: native-alpha-format.patch
Type: text/x-patch
Size: 1390 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110902/82d8eb21/attachment-0001.bin>


More information about the mesa-dev mailing list