[Mesa-dev] [PATCH 1/2] st/egl: Add support for EGL_NOK_swap_region

Chia-I Wu olvaffe at gmail.com
Tue Dec 13 04:44:38 PST 2011


On Fri, Dec 9, 2011 at 11:36 PM, Fredrik Höglund <fredrik at kde.org> wrote:
> Backends indicate that they support this extension by returning
> EGL_TRUE when native_display::get_param() is called with
> NATIVE_PARAM_PRESENT_REGION.
>
> native_present_control is extended to include the region that should
> be presented. When the whole surface is to be presented, this region
> will be a single rect containing the dimensions of the surface.
>
> Signed-off-by: Fredrik Höglund <fredrik at kde.org>
> ---
>  src/gallium/state_trackers/egl/common/egl_g3d.c    |    5 +++
>  .../state_trackers/egl/common/egl_g3d_api.c        |   31 ++++++++++++++++++-
>  src/gallium/state_trackers/egl/common/native.h     |   12 +++++++-
>  3 files changed, 45 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c
> index 182ce68..feebfaf 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d.c
> @@ -606,6 +606,11 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy)
>       dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
>  #endif
>
> +#ifdef EGL_NOK_swap_region
> +   if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_REGION))
> +      dpy->Extensions.NOK_swap_region = EGL_TRUE;
> +#endif
> +
Does EGL_NOK_swap_region require the contents of the back buffer to be
preserved?  If so, NATIVE_PARAM_PRESERVE_BUFFER needs to be checked
too.
>    if (egl_g3d_add_configs(drv, dpy, 1) == 1) {
>       _eglError(EGL_NOT_INITIALIZED, "eglInitialize(unable to add configs)");
>       goto fail;
> 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 911540e..e8f2abc 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> @@ -546,7 +546,8 @@ egl_g3d_make_current(_EGLDriver *drv, _EGLDisplay *dpy,
>  }
>
>  static EGLBoolean
> -egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
> +swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
> +             EGLint num_rects, const EGLint *rects, EGLBoolean preserve)
>  {
>    struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
>    _EGLContext *ctx = _eglGetCurrentContext();
> @@ -572,14 +573,36 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
>
>    memset(&ctrl, 0, sizeof(ctrl));
>    ctrl.natt = NATIVE_ATTACHMENT_BACK_LEFT;
> -   ctrl.preserve = (gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED);
> +   ctrl.preserve = preserve;
>    ctrl.swap_interval = gsurf->base.SwapInterval;
>    ctrl.premultiplied_alpha = (gsurf->base.VGAlphaFormat == EGL_VG_ALPHA_FORMAT_PRE);
> +   ctrl.num_rects = num_rects;
> +   ctrl.rects = rects;
>
>    return gsurf->native->present(gsurf->native, &ctrl);
>  }
>
>  static EGLBoolean
> +egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)
> +{
> +   struct egl_g3d_surface *gsurf = egl_g3d_surface(surf);
> +   const EGLint rect[4] = { 0, 0, gsurf->base.Width, gsurf->base.Height };
> +
> +   return swap_buffers(drv, dpy, surf, 1, rect,
"return swap_buffers(drv, dpy, surf, 0, NULL, ...);" seems simpler here.
> +                       (gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED));
> +}
> +
> +#ifdef EGL_NOK_swap_region
> +static EGLBoolean
> +egl_g3d_swap_buffers_region(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
> +                            EGLint num_rects, const EGLint *rects)
> +{
> +   /* Note: y=0=top */
> +   return swap_buffers(drv, dpy, surf, num_rects, rects, EGL_TRUE);
This assumes the native display supports buffer preservation.  If the
extension requires that, then NATIVE_PARAM_PRESERVE_BUFFER should be
checked.  If not, EGL_SWAP_BEHAVIOR should be honored.
> +}
> +#endif /* EGL_NOK_swap_region */
> +
> +static EGLBoolean
>  egl_g3d_copy_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
>                      EGLNativePixmapType target)
>  {
> @@ -867,4 +890,8 @@ egl_g3d_init_driver_api(_EGLDriver *drv)
>    drv->API.CreateScreenSurfaceMESA = egl_g3d_create_screen_surface;
>    drv->API.ShowScreenSurfaceMESA = egl_g3d_show_screen_surface;
>  #endif
> +
> +#ifdef EGL_NOK_swap_region
> +   drv->API.SwapBuffersRegionNOK = egl_g3d_swap_buffers_region;
> +#endif
>  }
> diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h
> index ee24c22..f1e067e 100644
> --- a/src/gallium/state_trackers/egl/common/native.h
> +++ b/src/gallium/state_trackers/egl/common/native.h
> @@ -81,7 +81,13 @@ enum native_param_type {
>     * EGL_ALPHA_SIZE.  EGL_VG_ALPHA_FORMAT attribute of a surface will affect
>     * how the surface is presented.
>     */
> -   NATIVE_PARAM_PREMULTIPLIED_ALPHA
> +   NATIVE_PARAM_PREMULTIPLIED_ALPHA,
> +
> +   /**
> +    * Return TRUE if native_surface::present supports presenting a partial
> +    * surface.
> +    */
> +   NATIVE_PARAM_PRESENT_REGION
>  };
>
>  /**
> @@ -99,6 +105,10 @@ struct native_present_control {
>
>    /**< pixels use premultiplied alpha */
>    boolean premultiplied_alpha;
> +
> +   /**< the region to present. y=0=top */
> +   int num_rects;
> +   const int *rects; /* x, y, width, height */
>  };
>
>  struct native_surface {
> --
> 1.7.7.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev



-- 
olv at LunarG.com


More information about the mesa-dev mailing list