On Thu, Sep 1, 2011 at 5:53 PM, Benjamin Franzke <benjaminfran...@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 <o...@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 > > -- o...@lunarg.com
diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h index 58593a4..4a08a80 100644 --- a/src/gallium/state_trackers/egl/common/native.h +++ b/src/gallium/state_trackers/egl/common/native.h @@ -70,7 +70,23 @@ enum native_param_type { /** * Return the maximum supported swap interval. */ - NATIVE_PARAM_MAX_SWAP_INTERVAL + NATIVE_PARAM_MAX_SWAP_INTERVAL, + + /** + * When true, EGL can control how the window system intepret a buffer being + * presented and this functionality should be exposed to applications + * through EGL_VG_ALPHA_FORMAT. + */ + NATIVE_PARAM_USE_VG_ALPHA_FORMAT_PRE +}; + +struct native_surface_present { + enum native_attachment natt; + boolean preserve; + uint swap_interval; + + /**< how the window system should intepret and/or composite the buffer */ + boolean vg_alpha_format_pre; }; struct native_surface { @@ -85,9 +101,7 @@ struct native_surface { * Present the given buffer to the native engine. */ boolean (*present)(struct native_surface *nsurf, - enum native_attachment natt, - boolean preserve, - uint swap_interval); + const struct native_surface_present *info); /** * Validate the buffers of the surface. textures, if not NULL, points to an
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev