[PATCH weston v2] gl-renderer: If an XRGB format is requested but unavailable, try ARGB
Dima Ryazanov
dima at gmail.com
Wed May 6 13:28:46 PDT 2015
I don't know if the "alloca" change is a good idea. Some people consider it bad
practice
<http://stackoverflow.com/questions/1018853/why-is-alloca-not-considered-good-practice>,
and looks like it's not used anywhere in wayland/weston code - but someone
else should make that call.
Otherwise, though, looks good.
On Tue, May 5, 2015 at 2:22 PM, Derek Foreman <derekf at osg.samsung.com>
wrote:
> Recent versions of Mesa have stopped exposing XRGB visuals for gl on
> some Intel GPUs. While this may be changed in Mesa eventually, it's
> not impossible that some other hardware in the future won't provide
> XRGB visuals either.
>
> Let's try again with an ARGB visual if XRGB is unavailable. Since
> we're not changing the scanout buffer format, and our current
> rendering loop always results in saturated alpha in the frame buffer,
> it should be Just Fine(tm) - and probably better than just exiting.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
>
> Dima Ryazanov called me out for fallback_format() not working on all
> endians,
> and I've reworked the loop to be a single loop instead of two, similar to
> Daniel's suggestion (but still keeping the NULL visual_id means "give me
> the
> first match" semantic of the original)
>
> I've also replaced calloc with aloca so I don't have to worry about freeing
> the array on return, which simplifies things a little bit. I didn't bother
> zeroing out the array, since it's filled in by eglChooseConfig.
>
> It's still an ugly function. :)
>
> src/gl-renderer.c | 57
> +++++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 43 insertions(+), 14 deletions(-)
>
> diff --git a/src/gl-renderer.c b/src/gl-renderer.c
> index ae3122f..a4fd3a0 100644
> --- a/src/gl-renderer.c
> +++ b/src/gl-renderer.c
> @@ -934,6 +934,14 @@ output_rotate_damage(struct weston_output *output,
> go->border_damage[go->buffer_damage_index] = border_status;
> }
>
> +/* NOTE: We now allow falling back to ARGB gl visual ids when XRGB is
> + * unavailable, so we're assuming the background has no transparency
> + * and that everything with a blend, like drop shadows, will have
> something
> + * opaque (like the background) drawn underneath it.
> + *
> + * Depending on the underlying hardware, violating that assumption could
> + * result in seeing through to another display plane.
> + */
> static void
> gl_renderer_repaint_output(struct weston_output *output,
> pixman_region32_t *output_damage)
> @@ -1897,6 +1905,15 @@ log_egl_config_info(EGLDisplay egldpy, EGLConfig
> eglconfig)
> weston_log_continue(" unknown\n");
> }
>
> +static EGLint
> +fallback_format(EGLint format)
> +{
> + if ((format & 0xFF) != 'X')
> + return 0;
> +
> + return (format & 0xFFFFFF00) | 'A';
> +}
> +
> static int
> egl_choose_config(struct gl_renderer *gr, const EGLint *attribs,
> const EGLint *visual_id,
> @@ -1904,41 +1921,53 @@ egl_choose_config(struct gl_renderer *gr, const
> EGLint *attribs,
> {
> EGLint count = 0;
> EGLint matched = 0;
> + EGLint fallback_id;
> EGLConfig *configs;
> + EGLConfig fallback_config = 0;
> int i;
>
> if (!eglGetConfigs(gr->egl_display, NULL, 0, &count) || count < 1)
> return -1;
>
> - configs = calloc(count, sizeof *configs);
> + configs = alloca(count * sizeof *configs);
> if (!configs)
> return -1;
>
> if (!eglChooseConfig(gr->egl_display, attribs, configs,
> count, &matched))
> - goto out;
> + return -1;
> +
> + if (!matched)
> + return -1;
>
> + if (!visual_id) {
> + *config_out = configs[0];
> + return 0;
> + }
> +
> + fallback_id = fallback_format(*visual_id);
> for (i = 0; i < matched; ++i) {
> EGLint id;
>
> - if (visual_id) {
> - if (!eglGetConfigAttrib(gr->egl_display,
> - configs[i], EGL_NATIVE_VISUAL_ID,
> - &id))
> - continue;
> + if (!eglGetConfigAttrib(gr->egl_display,
> + configs[i], EGL_NATIVE_VISUAL_ID,
> + &id))
> + continue;
>
> - if (id != 0 && id != *visual_id)
> - continue;
> + if (id == *visual_id) {
> + *config_out = configs[i];
> + return 0;
> }
> + if (id == fallback_id)
> + fallback_config = configs[i];
> + }
>
> - *config_out = configs[i];
> -
> - free(configs);
> + if (fallback_config) {
> + weston_log("Falling back to ARGB visual\n");
> + *config_out = fallback_config;
> return 0;
> }
>
> -out:
> - free(configs);
> return -1;
> }
>
> --
> 2.1.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20150506/31fbae18/attachment.html>
More information about the wayland-devel
mailing list