[Mesa-dev] [PATCH kmscube] formats: use weston's egl config matching logic, move format defines up
Eric Engestrom
eric.engestrom at imgtec.com
Thu Feb 8 09:39:20 UTC 2018
On Wednesday, 2018-02-07 23:17:48 -0500, Ilia Mirkin wrote:
> The GBM surface format has to match the DRM mode. Both are used in a
> couple of places, so move the defines to a common place so that they can
> be adjusted easily.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> Tested with both RGB565 and ARGB2101010. Predictably the RGB565 cube has
> a lot of artifacts, while the 10bpc one avoids the occasional artifacts
> that show up at 8bpc.
>
> common.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
> common.h | 3 +++
> drm-common.c | 4 ++--
> 3 files changed, 76 insertions(+), 7 deletions(-)
>
> diff --git a/common.c b/common.c
> index b76c994..2ee3b85 100644
> --- a/common.c
> +++ b/common.c
> @@ -54,7 +54,7 @@ const struct gbm * init_gbm(int drm_fd, int w, int h, uint64_t modifier)
> return NULL;
> }
> gbm.surface = gbm_surface_create(gbm.dev, w, h,
> - GBM_FORMAT_XRGB8888,
> + GBM_FORMAT,
> GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
> #else
> uint64_t *mods;
> @@ -66,7 +66,7 @@ const struct gbm * init_gbm(int drm_fd, int w, int h, uint64_t modifier)
> count = get_modifiers(&mods);
> }
> gbm.surface = gbm_surface_create_with_modifiers(gbm.dev, w, h,
> - GBM_FORMAT_XRGB8888, mods, count);
> + GBM_FORMAT, mods, count);
> #endif
>
> if (!gbm.surface) {
> @@ -100,9 +100,75 @@ static bool has_ext(const char *extension_list, const char *ext)
> }
> }
>
> +static int
> +match_config_to_visual(EGLDisplay egl_display,
> + EGLint visual_id,
> + EGLConfig *configs,
> + int count)
> +{
> + int i;
> +
> + for (i = 0; i < count; ++i) {
> + EGLint id;
> +
> + if (!eglGetConfigAttrib(egl_display,
> + configs[i], EGL_NATIVE_VISUAL_ID,
> + &id))
> + continue;
> +
> + if (id == visual_id)
> + return i;
> + }
> +
> + return -1;
> +}
> +
> +static int
> +egl_choose_config(struct egl *egl, const EGLint *attribs, EGLint visual_id,
`display` is the only member of `egl` used; pass `egl->display` directly?
> + EGLConfig *config_out)
> +{
> + EGLint count = 0;
> + EGLint matched = 0;
> + EGLConfig *configs;
> + int config_index = -1;
> +
> + if (!eglGetConfigs(egl->display, NULL, 0, &count) || count < 1) {
> + printf("No EGL configs to choose from.\n");
> + return -1;
> + }
> + configs = calloc(count, sizeof *configs);
Nit: no need to calloc, malloc is enough; we'll never read past
how many configs eglChooseConfig() says it returned, and barring
any implementation bug, that should mean all indices up to `matched`
are initialised.
> + if (!configs)
> + return -1;
> +
> + if (!eglChooseConfig(egl->display, attribs, configs,
> + count, &matched) || !matched) {
> + printf("No EGL configs with appropriate attributes.\n");
> + goto out;
> + }
> +
> + if (!visual_id)
> + config_index = 0;
> +
> + if (config_index == -1)
> + config_index = match_config_to_visual(egl->display,
> + visual_id,
> + configs,
> + matched);
> +
> + if (config_index != -1)
> + *config_out = configs[config_index];
> +
> +out:
> + free(configs);
> + if (config_index == -1)
> + return -1;
> +
> + return 0;
can we make that `return true/false` ?
Other than these nit-picks, lgtm:
Reviewed-by: Eric Engestrom <eric.engestrom at imgtec.com>
> +}
> +
> int init_egl(struct egl *egl, const struct gbm *gbm)
> {
> - EGLint major, minor, n;
> + EGLint major, minor;
>
> static const EGLint context_attribs[] = {
> EGL_CONTEXT_CLIENT_VERSION, 2,
> @@ -174,8 +240,8 @@ int init_egl(struct egl *egl, const struct gbm *gbm)
> return -1;
> }
>
> - if (!eglChooseConfig(egl->display, config_attribs, &egl->config, 1, &n) || n != 1) {
> - printf("failed to choose config: %d\n", n);
> + if (egl_choose_config(egl, config_attribs, GBM_FORMAT, &egl->config)) {
> + printf("failed to choose config\n");
> return -1;
> }
>
> diff --git a/common.h b/common.h
> index 11ec26e..0c9cd62 100644
> --- a/common.h
> +++ b/common.h
> @@ -40,6 +40,9 @@
> #define DRM_FORMAT_MOD_INVALID ((((__u64)0) << 56) | ((1ULL << 56) - 1))
> #endif
>
> +#define GBM_FORMAT GBM_FORMAT_XRGB8888
> +#define DRM_FORMAT DRM_FORMAT_XRGB8888
> +
> #ifndef EGL_KHR_platform_gbm
> #define EGL_KHR_platform_gbm 1
> #define EGL_PLATFORM_GBM_KHR 0x31D7
> diff --git a/drm-common.c b/drm-common.c
> index 4b55745..f022eb0 100644
> --- a/drm-common.c
> +++ b/drm-common.c
> @@ -78,7 +78,7 @@ struct drm_fb * drm_fb_get_from_bo(struct gbm_bo *bo)
> }
>
> ret = drmModeAddFB2WithModifiers(drm_fd, width, height,
> - DRM_FORMAT_XRGB8888, handles, strides, offsets,
> + DRM_FORMAT, handles, strides, offsets,
> modifiers, &fb->fb_id, flags);
> #endif
> if (ret) {
> @@ -88,7 +88,7 @@ struct drm_fb * drm_fb_get_from_bo(struct gbm_bo *bo)
> memcpy(handles, (uint32_t [4]){gbm_bo_get_handle(bo).u32,0,0,0}, 16);
> memcpy(strides, (uint32_t [4]){gbm_bo_get_stride(bo),0,0,0}, 16);
> memset(offsets, 0, 16);
> - ret = drmModeAddFB2(drm_fd, width, height, DRM_FORMAT_XRGB8888,
> + ret = drmModeAddFB2(drm_fd, width, height, DRM_FORMAT,
> handles, strides, offsets, &fb->fb_id, 0);
> }
>
> --
> 2.13.6
>
More information about the mesa-dev
mailing list