[Mesa-dev] [PATCH kmscube 3/4] Automatically select modifiers
Emil Velikov
emil.l.velikov at gmail.com
Thu Apr 5 14:21:50 UTC 2018
On 5 April 2018 at 14:44, Thierry Reding <thierry.reding at gmail.com> wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> If available, use the formats/modifiers blob from a DRM/KMS device to
> automatically detect which modifiers to use. In the absence of the blob,
> leave it up to the implementation to choose an appropriate format.
>
> Based on work by Lucas Stach <l.stach at pengutronix.de>.
>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
> ---
> common.c | 10 +++++----
> common.h | 2 +-
> drm-atomic.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> drm-common.h | 5 ++++-
> kmscube.c | 8 +++++--
> 5 files changed, 86 insertions(+), 9 deletions(-)
>
> diff --git a/common.c b/common.c
> index 3dcd9bd3d8f4..a886962ea7b1 100644
> --- a/common.c
> +++ b/common.c
> @@ -41,17 +41,19 @@ gbm_surface_create_with_modifiers(struct gbm_device *gbm,
> const uint64_t *modifiers,
> const unsigned int count);
>
> -const struct gbm * init_gbm(const struct drm *drm, uint64_t modifier)
> +const struct gbm * init_gbm(const struct drm *drm)
> {
> gbm.dev = gbm_create_device(drm->fd);
> gbm.format = GBM_FORMAT_XRGB8888;
>
> - if (gbm_surface_create_with_modifiers) {
> + if (gbm_surface_create_with_modifiers && drm->num_modifiers > 0) {
> gbm.surface = gbm_surface_create_with_modifiers(gbm.dev,
> drm->mode->hdisplay, drm->mode->vdisplay,
> - gbm.format, &modifier, 1);
> + gbm.format, drm->modifiers,
> + drm->num_modifiers);
> } else {
> - if (modifier != DRM_FORMAT_MOD_LINEAR) {
> + if (drm->num_modifiers > 0 &&
> + drm->modifiers[0] != DRM_FORMAT_MOD_LINEAR) {
> fprintf(stderr, "Modifiers requested but support isn't available\n");
> return NULL;
> }
> diff --git a/common.h b/common.h
> index 8ff1ed3a6aa3..bed316786557 100644
> --- a/common.h
> +++ b/common.h
> @@ -84,7 +84,7 @@ struct gbm {
> };
>
> struct drm;
> -const struct gbm *init_gbm(const struct drm *drm, uint64_t modifier);
> +const struct gbm *init_gbm(const struct drm *drm);
>
> struct egl {
> EGLDisplay display;
> diff --git a/drm-atomic.c b/drm-atomic.c
> index 99ac33d6a686..a68f036a9aab 100644
> --- a/drm-atomic.c
> +++ b/drm-atomic.c
> @@ -337,7 +337,66 @@ static int get_plane_id(void)
> return ret;
> }
>
> -const struct drm * init_drm_atomic(const char *device)
> +static unsigned int
> +get_modifiers(drmModePropertyBlobPtr blob, struct drm_format_modifier **modsp)
> +{
> + struct drm_format_modifier_blob *data = blob->data;
> +
> + *modsp = blob->data + data->modifiers_offset;
> +
> + return data->count_modifiers;
> +}
> +
> +static int
> +drm_atomic_get_modifiers(struct drm *drm)
> +{
> + unsigned int i, j, format_index = 0;
> +
> + for (i = 0; i < drm->plane->plane->count_formats; i++) {
> + if (drm->plane->plane->formats[i] == DRM_FORMAT_XRGB8888)
Use gbm.format? The {DRM,GBM}_FORMAT defines are identical.
> + format_index = i;
Shouldn't we bail out if no plane has the requested format?
> @@ -402,6 +464,12 @@ const struct drm * init_drm_atomic(const char *device)
> get_properties(crtc, CRTC, drm.crtc_id);
> get_properties(connector, CONNECTOR, drm.connector_id);
>
> + if (num_modifiers == 0) {
> + ret = drm_atomic_get_modifiers(&drm);
> + if (ret < 0)
> + return NULL;
Just print an {info,error} message and continue. As-is this will break
the (very odd) legacy case.
With the above suggestions (or some clarification) the series is
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
-Emil
More information about the mesa-dev
mailing list