aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2015-02-24 13:43:13 -0500
committerChad Versace <chad.versace@intel.com>2015-02-26 12:47:50 -0800
commit4b8568deebd554180e2c432c0e9379f35fcc456d (patch)
tree0a22e6219c15d2c9329c5f5a02d269c9153b812d
parent475b44fa05fb59d12e143d278b42d9fc9f7f968c (diff)
downloadwaffle-4b8568deebd554180e2c432c0e9379f35fcc456d.tar.gz
gbm: Use EGLConfig to select the correct gbm format
chadv: As of Mesa 10.4.3, there exists a Mesa bug that prevents this fix from being a real fix. eglGetConfigAttrib(EGL_NATIVE_VISUAL_ID) always returns a GBM format without alpha even when the EGLConfig contains alpha. Reviewed-by: Chad Versace <chad.versace@intel.com> (cherry picked from commit 2bb939095c1d09c79dad5ab5da123ec77eb4ea61)
-rw-r--r--src/waffle/gbm/wgbm_config.c26
-rw-r--r--src/waffle/gbm/wgbm_config.h4
-rw-r--r--src/waffle/gbm/wgbm_window.c3
3 files changed, 20 insertions, 13 deletions
diff --git a/src/waffle/gbm/wgbm_config.c b/src/waffle/gbm/wgbm_config.c
index 480c2bf..549e270 100644
--- a/src/waffle/gbm/wgbm_config.c
+++ b/src/waffle/gbm/wgbm_config.c
@@ -33,7 +33,8 @@ wgbm_config_choose(struct wcore_platform *wc_plat,
struct wcore_display *wc_dpy,
const struct wcore_config_attrs *attrs)
{
- if (wgbm_config_get_gbm_format(attrs) == 0) {
+ struct wcore_config *config = wegl_config_choose(wc_plat, wc_dpy, attrs);
+ if (wgbm_config_get_gbm_format(wc_plat, wc_dpy, config) == 0) {
wcore_errorf(WAFFLE_ERROR_UNSUPPORTED_ON_PLATFORM,
"requested config is unsupported on GBM");
return NULL;
@@ -43,19 +44,22 @@ wgbm_config_choose(struct wcore_platform *wc_plat,
}
uint32_t
-wgbm_config_get_gbm_format(const struct wcore_config_attrs *attrs)
+wgbm_config_get_gbm_format(struct wcore_platform *wc_plat,
+ struct wcore_display *wc_display,
+ struct wcore_config *wc_config)
{
- if (attrs->red_size > 8 || attrs->blue_size > 8 ||
- attrs->green_size > 8 || attrs->alpha_size > 8) {
+ EGLint gbm_format;
+ struct wgbm_display *dpy = wgbm_display(wc_display);
+ struct wegl_config *egl_config = wegl_config(wc_config);
+ bool ok = eglGetConfigAttrib(dpy->wegl.egl,
+ egl_config->egl,
+ EGL_NATIVE_VISUAL_ID,
+ &gbm_format);
+
+ if (!ok) {
return 0;
}
-
- if (attrs->alpha_size <= 0)
- return GBM_FORMAT_XRGB8888;
- else if (attrs->alpha_size <= 8)
- return GBM_FORMAT_ABGR8888;
-
- return 0;
+ return gbm_format;
}
union waffle_native_config*
diff --git a/src/waffle/gbm/wgbm_config.h b/src/waffle/gbm/wgbm_config.h
index 8c83270..2c58321 100644
--- a/src/waffle/gbm/wgbm_config.h
+++ b/src/waffle/gbm/wgbm_config.h
@@ -40,7 +40,9 @@ wgbm_config_choose(struct wcore_platform *wc_plat,
const struct wcore_config_attrs *attrs);
uint32_t
-wgbm_config_get_gbm_format(const struct wcore_config_attrs *attrs);
+wgbm_config_get_gbm_format(struct wcore_platform *wc_plat,
+ struct wcore_display *wc_dpy,
+ struct wcore_config *wc_config);
union waffle_native_config*
wgbm_config_get_native(struct wcore_config *wc_config);
diff --git a/src/waffle/gbm/wgbm_window.c b/src/waffle/gbm/wgbm_window.c
index bce32a4..5669435 100644
--- a/src/waffle/gbm/wgbm_window.c
+++ b/src/waffle/gbm/wgbm_window.c
@@ -70,7 +70,8 @@ wgbm_window_create(struct wcore_platform *wc_plat,
if (self == NULL)
return NULL;
- gbm_format = wgbm_config_get_gbm_format(&wc_config->attrs);
+ gbm_format = wgbm_config_get_gbm_format(wc_plat, wc_config->display,
+ wc_config);
assert(gbm_format != 0);
self->gbm_surface = gbm_surface_create(dpy->gbm_device, width, height,
gbm_format,