diff options
| author | Chia-I Wu <olv@lunarg.com> | 2010-11-03 16:20:26 +0800 | 
|---|---|---|
| committer | Chia-I Wu <olv@lunarg.com> | 2010-11-03 16:26:57 +0800 | 
| commit | b8cb14209a3a694eaaa6451e19d79e5b2f789a30 (patch) | |
| tree | c1df8fd58fa28f6363fc4d50fc93e3071e358640 /src | |
| parent | 828d944fd6670b44b2dd640a92bc0f9fe983a520 (diff) | |
st/egl: Add support for swap interval and swap behavior.
The value of EGL_MAX_SWAP_INTERVAL and whether
EGL_SWAP_BEHAVIOR_PRESERVED_BIT is set will depend on the native
backend used.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/state_trackers/egl/common/egl_g3d.c | 23 | ||||
| -rw-r--r-- | src/gallium/state_trackers/egl/common/egl_g3d_api.c | 4 | 
2 files changed, 22 insertions, 5 deletions
| diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c index 30ddcd5bc1..3d0d13cfb1 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d.c @@ -156,7 +156,8 @@ egl_g3d_add_screens(_EGLDriver *drv, _EGLDisplay *dpy)   */  static EGLBoolean  init_config_attributes(_EGLConfig *conf, const struct native_config *nconf, -                       EGLint api_mask, enum pipe_format depth_stencil_format) +                       EGLint api_mask, enum pipe_format depth_stencil_format, +                       EGLBoolean preserve_buffer, EGLint max_swap_interval)  {     uint rgba[4], depth_stencil[2], buffer_size;     EGLint surface_type; @@ -238,6 +239,11 @@ init_config_attributes(_EGLConfig *conf, const struct native_config *nconf,        conf->TransparentBlueValue = nconf->transparent_rgb_values[2];     } +   conf->MinSwapInterval = 0; +   conf->MaxSwapInterval = max_swap_interval; +   if (preserve_buffer) +      conf->SurfaceType |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT; +     return _eglValidateConfig(conf, EGL_FALSE);  } @@ -247,7 +253,8 @@ init_config_attributes(_EGLConfig *conf, const struct native_config *nconf,  static EGLBoolean  egl_g3d_init_config(_EGLDriver *drv, _EGLDisplay *dpy,                      _EGLConfig *conf, const struct native_config *nconf, -                    enum pipe_format depth_stencil_format) +                    enum pipe_format depth_stencil_format, +                    int preserve_buffer, int max_swap_interval)  {     struct egl_g3d_config *gconf = egl_g3d_config(conf);     EGLint buffer_mask, api_mask; @@ -288,7 +295,8 @@ egl_g3d_init_config(_EGLDriver *drv, _EGLDisplay *dpy,     }     valid = init_config_attributes(&gconf->base, -         nconf, api_mask, depth_stencil_format); +         nconf, api_mask, depth_stencil_format, +         preserve_buffer, max_swap_interval);     if (!valid) {        _eglLog(_EGL_DEBUG, "skip invalid config 0x%x", nconf->native_visual_id);        return EGL_FALSE; @@ -349,6 +357,7 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)     const struct native_config **native_configs;     enum pipe_format depth_stencil_formats[8];     int num_formats, num_configs, i, j; +   int preserve_buffer, max_swap_interval;     native_configs = gdpy->native->get_configs(gdpy->native, &num_configs);     if (!num_configs) { @@ -357,6 +366,11 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)        return id;     } +   preserve_buffer = +      gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER); +   max_swap_interval = +      gdpy->native->get_param(gdpy->native, NATIVE_PARAM_MAX_SWAP_INTERVAL); +     num_formats = egl_g3d_fill_depth_stencil_formats(dpy,           depth_stencil_formats); @@ -368,7 +382,8 @@ egl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id)           if (gconf) {              _eglInitConfig(&gconf->base, dpy, id);              if (!egl_g3d_init_config(drv, dpy, &gconf->base, -                     native_configs[i], depth_stencil_formats[j])) { +                     native_configs[i], depth_stencil_formats[j], +                     preserve_buffer, max_swap_interval)) {                 FREE(gconf);                 break;              } 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 7f85cf1290..8fc9d1cb93 100644 --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c @@ -540,7 +540,9 @@ egl_g3d_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf)     }     return gsurf->native->present(gsurf->native, -         NATIVE_ATTACHMENT_BACK_LEFT, FALSE, 0); +         NATIVE_ATTACHMENT_BACK_LEFT, +         gsurf->base.SwapBehavior == EGL_BUFFER_PRESERVED, +         gsurf->base.SwapInterval);  }  /** | 
