[Mesa-dev] [PATCH] st/egl: Prepare for EGL_ALPHA_FORMAT
Benjamin Franzke
benjaminfranzke at googlemail.com
Fri Sep 2 00:27:37 PDT 2011
2011/9/2 Chia-I Wu <olv at lunarg.com>:
> 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..
Yes, this is kind of a strange thing in the eglspec, to have an
attribute that shouldnt be relied on/used..?
As EGL wants EGL_VG_ALPHA_FORMAT only for OpenVG, we probably need an
extension or so.
Kristian can give better information what he plans here.
>
> 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.
Sounds good in genral, but I wanted to expose EGL_VG_ALPHA_FORMAT_PRE_BIT
only for configs which have an alpha format,
this comes into account when talking about the following point:
> As st/vega does not support pre-multiplied alpha, EGL_OPENVG_BIT
> should be cleared meanwhile.
...Thats abit of a problem, with that we couldnt use openvg with wayland,
since all configs have EGL_OPENVG_BIT cleared (because of the previous point).
> - Add a boolean to native_surface_present to indicate the
> presented buffer should be treated as with pre-multiplied alpha or
> not.
I'm not sure about that, dont we need to know about that attribute at
surface creation time,
to respect it when choosing a format that reflects that?
My main problem here is that I dont know how to choose between
premultiplied and non-premultiplied in gallium (thought this would be
a new format?).
>
> 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.
This is currently broken in wayland (due to the latest changes), but the idea is
that the compositor knows whether a wl_buffer has premulitplied alpha or not.
> - The display server expects EGL to expose the functionality through
> EGL_VG_ALPHA_FORMAT.
The display server in general doesnt care how things are done client side,
but in wayland+egl we currently try to expose buffer formats using EGLConfigs
with the use of vendor specific wayland interfaces (wl_drm in the mesa case),
that are implemented in egl (both client- and serverside).
So yes.
>
> 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
>
More information about the mesa-dev
mailing list