[Mesa-dev] [PATCH 2/7] egl/drm: introduce drm_add_configs_for_visuals() helper

Eric Engestrom eric at engestrom.ch
Thu Aug 25 21:33:09 UTC 2016


On Thu, Aug 25, 2016 at 05:23:41PM +0100, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> Factor out and rework the existing code so that it prints a debug
> message if we have zero configs for any visual.
> 
> As a nice side effect we now provide a correct (sequential ID) when
> creating a config (via dri2_add_config).
> 
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  src/egl/drivers/dri2/platform_drm.c | 89 +++++++++++++++++++++++++------------
>  1 file changed, 61 insertions(+), 28 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c
> index 55dddd7..aa9a186 100644
> --- a/src/egl/drivers/dri2/platform_drm.c
> +++ b/src/egl/drivers/dri2/platform_drm.c
> @@ -575,6 +575,64 @@ swrast_get_image(__DRIdrawable *driDrawable,
>     gbm_dri_bo_unmap_dumb(bo);
>  }
>  
> +static EGLBoolean
> +drm_add_configs_for_visuals(_EGLDriver *drv, _EGLDisplay *disp)
> +{
> +   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
> +   static const struct {
> +      int format;
> +      unsigned int red_mask;
> +      unsigned int alpha_mask;
> +   } visuals[] = {
> +      { GBM_FORMAT_XRGB2101010, 0x3ff00000, 0x00000000 },
> +      { GBM_FORMAT_ARGB2101010, 0x3ff00000, 0xc0000000 },
> +      { GBM_FORMAT_XRGB8888,    0x00ff0000, 0x00000000 },
> +      { GBM_FORMAT_ARGB8888,    0x00ff0000, 0xff000000 },
> +      { GBM_FORMAT_RGB565,      0x0000f800, 0x00000000 },
> +   };
> +   EGLint attr_list[] = {
> +      EGL_NATIVE_VISUAL_ID, 0,
> +      EGL_NONE,
> +   };
> +   unsigned int format_count[ARRAY_SIZE(visuals)] = {};
> +   unsigned int count, i, j;
> +
> +   count = 0;
> +   for (i = 0; dri2_dpy->driver_configs[i]; i++) {
> +      unsigned int red, alpha;
> +
> +      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
> +                                      __DRI_ATTRIB_RED_MASK, &red);
> +      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
> +                                      __DRI_ATTRIB_ALPHA_MASK, &alpha);
> +
> +      for (j = 0; ARRAY_SIZE(visuals); j++) {

j < ARRAY_SIZE(visuals);

> +         struct dri2_egl_config *dri2_conf;
> +
> +         if (visuals[j].red_mask != red || visuals[j].alpha_mask != alpha)
> +            continue;
> +
> +         attr_list[1] = visuals[j].format;
> +
> +         dri2_conf = dri2_add_config(disp, dri2_dpy->driver_configs[i],
> +               count + 1, EGL_WINDOW_BIT, attr_list, NULL);
> +         if (dri2_conf) {
> +            count++;
> +            format_count[j]++;
> +         }
> +      }
> +   }
> +
> +   for (i = 0; ARRAY_SIZE(format_count); i++) {

Same here.

The rest looks good, so with that fixed:
Reviewed-by: Eric Engestrom <eric at engestrom.ch>

> +      if (!format_count[i]) {
> +         _eglLog(_EGL_DEBUG, "No DRI config supports native format 0x%x",
> +                 visuals[i].format);
> +      }
> +   }
> +
> +   return (count != 0);
> +}
> +
>  static struct dri2_egl_display_vtbl dri2_drm_display_vtbl = {
>     .authenticate = dri2_drm_authenticate,
>     .create_window_surface = dri2_drm_create_window_surface,
> @@ -600,7 +658,6 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
>     struct dri2_egl_display *dri2_dpy;
>     struct gbm_device *gbm;
>     int fd = -1;
> -   int i;
>  
>     loader_set_logger(_eglLog);
>  
> @@ -663,33 +720,9 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
>  
>     dri2_setup_screen(disp);
>  
> -   for (i = 0; dri2_dpy->driver_configs[i]; i++) {
> -      EGLint format, attr_list[3];
> -      unsigned int red, alpha;
> -
> -      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
> -                                       __DRI_ATTRIB_RED_MASK, &red);
> -      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
> -                                       __DRI_ATTRIB_ALPHA_MASK, &alpha);
> -      if (red == 0x3ff00000 && alpha == 0x00000000)
> -         format = GBM_FORMAT_XRGB2101010;
> -      else if (red == 0x3ff00000 && alpha == 0xc0000000)
> -         format = GBM_FORMAT_ARGB2101010;
> -      else if (red == 0x00ff0000 && alpha == 0x00000000)
> -         format = GBM_FORMAT_XRGB8888;
> -      else if (red == 0x00ff0000 && alpha == 0xff000000)
> -         format = GBM_FORMAT_ARGB8888;
> -      else if (red == 0xf800)
> -         format = GBM_FORMAT_RGB565;
> -      else
> -         continue;
> -
> -      attr_list[0] = EGL_NATIVE_VISUAL_ID;
> -      attr_list[1] = format;
> -      attr_list[2] = EGL_NONE;
> -
> -      dri2_add_config(disp, dri2_dpy->driver_configs[i],
> -                      i + 1, EGL_WINDOW_BIT, attr_list, NULL);
> +   if (!drm_add_configs_for_visuals(drv, disp)) {
> +      _eglError(EGL_NOT_INITIALIZED, "DRI2: failed to add configs");
> +      goto cleanup;
>     }
>  
>     disp->Extensions.KHR_image_pixmap = EGL_TRUE;
> -- 
> 2.9.0


More information about the mesa-dev mailing list