egl_dri2: Set NativeVisualID to the matching GBM config for the gbm platform
authorKristian Høgsberg <krh@bitplanet.net>
Wed, 25 Sep 2013 21:57:22 +0000 (14:57 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 16 Oct 2013 05:07:52 +0000 (22:07 -0700)
The EGLConfig doesn't have the rgba masks, only the rgba sizes.  To
make sure a config is usable with a given GBM/KMS format, we need a way
to make sure the formats really match.

src/egl/drivers/dri2/platform_drm.c

index fb28bd91c0a682b0dc33d1d158d4a2633954ccce..7b1e3a1779725cd0e0358d15ec580840c1f5d2c5 100644 (file)
@@ -476,9 +476,28 @@ dri2_initialize_drm(_EGLDriver *drv, _EGLDisplay *disp)
 
    dri2_setup_screen(disp);
 
-   for (i = 0; dri2_dpy->driver_configs[i]; i++)
+   for (i = 0; dri2_dpy->driver_configs[i]; i++) {
+      EGLint format, attr_list[3];
+      unsigned int mask;
+
+      dri2_dpy->core->getConfigAttrib(dri2_dpy->driver_configs[i],
+                                       __DRI_ATTRIB_RED_MASK, &mask);
+      if (mask == 0x3ff00000)
+         format = GBM_FORMAT_XRGB2101010;
+      else if (mask == 0x00ff0000)
+         format = GBM_FORMAT_XRGB8888;
+      else if (mask == 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, NULL, NULL);
+                      i + 1, EGL_WINDOW_BIT, attr_list, NULL);
+   }
 
    drv->API.CreateWindowSurface = dri2_create_window_surface;
    drv->API.DestroySurface = dri2_destroy_surface;