diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2015-02-24 13:43:13 -0500 |
---|---|---|
committer | Chad Versace <chad.versace@intel.com> | 2015-02-26 12:47:50 -0800 |
commit | 4b8568deebd554180e2c432c0e9379f35fcc456d (patch) | |
tree | 0a22e6219c15d2c9329c5f5a02d269c9153b812d | |
parent | 475b44fa05fb59d12e143d278b42d9fc9f7f968c (diff) | |
download | waffle-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.c | 26 | ||||
-rw-r--r-- | src/waffle/gbm/wgbm_config.h | 4 | ||||
-rw-r--r-- | src/waffle/gbm/wgbm_window.c | 3 |
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, |