[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