From c151fae054d12ef9b392f5b6dcc1bafe894005b0 Mon Sep 17 00:00:00 2001 From: Anton Kindestam Date: Sat, 2 Jun 2018 12:54:05 +0200 Subject: drm_atomic: Add general primary/overlay plane option Add general primary/overlay plane option to drm-osd-plane-id and drm-video-plane-id, so that the user can just request any usable primary or overlay plane for either of these two options. This should be somewhat more user-friendly (especially as neither of these two options currently have a useful help function), as usually you would only be interested in the type of the plane, and not exactly which plane gets picked. --- DOCS/interface-changes.rst | 5 +++++ DOCS/man/vo.rst | 28 +++++++++++++++------------- video/out/drm_atomic.c | 32 +++++++++++++++++++------------- video/out/drm_atomic.h | 5 ++++- video/out/drm_common.c | 13 +++++++++---- 5 files changed, 52 insertions(+), 31 deletions(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index 34d90447af..f7ed1597ab 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -20,6 +20,11 @@ Interface changes :: --- mpv 0.30.0 --- + - the `--drm-osd-plane-id` and `--drm-video-plane-id` + options now accept either an integer index, or the values primary or overlay. + `--drm-osd-plane-id` now defaults to primary and `--drm-video-plane-id` + defaults to overlay. This should be similar to previous behavior on most drivers + due to how planes are usually sorted. - rename --opensles-frames-per-buffer to --opensles-frames-per-enqueue to better reflect its purpose. In the past it overrides the buffer size the AO requests (but not the default/value of the generic --audio-buffer option). diff --git a/DOCS/man/vo.rst b/DOCS/man/vo.rst index ccde336264..a3cc328b1d 100644 --- a/DOCS/man/vo.rst +++ b/DOCS/man/vo.rst @@ -488,19 +488,21 @@ Available video output drivers are: Mode ID to use (resolution and frame rate). (default: 0) - ``--drm-osd-plane-id=`` - Select the DRM plane index to use for OSD (or OSD and video). - Index is zero based, and related to crtc. - When using this option with the drm_prime renderer, it will only affect - the OSD contents. Otherwise it will set OSD & video plane. - (default: primary plane) - - ``--drm-video-plane-id=`` - Select the DRM plane index to use for video layer. - Index is zero based, and related to crtc. - This option only has effect when using the drm_prime renderer (which - supports several layers) together with ``vo=gpu`` and ``gpu-context=drm``. - (default: first overlay plane) + ``--drm-osd-plane-id=`` + Select the DRM plane to use for OSD (or OSD and video). The plane can be + specified as ``primary``, which will pick the first applicable primary + plane; ``overlay``, which will pick the first applicable overlay plane; + or by index. The index is zero based, and related to the CRTC. When using + this option with the drm_prime renderer, it will only affect the OSD + contents. Otherwise it will set OSD & video plane. + (default: primary) + + ``--drm-video-plane-id=`` + Select the DRM plane index to use for video layer. This option accepts + the same values as ``--drm-osd-plane-id``. This option has an effect + only when using the drm_prime renderer (which supports several layers) + together with ``vo=gpu`` and ``gpu-context=drm``. + (default: overlay) ``--drm-format=`` Select the DRM format to use (default: xrgb8888). This allows you to diff --git a/video/out/drm_atomic.c b/video/out/drm_atomic.c index f530d91b66..fea8ffa88e 100644 --- a/video/out/drm_atomic.c +++ b/video/out/drm_atomic.c @@ -138,7 +138,8 @@ void drm_object_print_info(struct mp_log *log, struct drm_object *object) } struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd, int crtc_id, - int connector_id, int osd_plane_id, int video_plane_id) + int connector_id, + int osd_plane_idx, int video_plane_idx) { drmModePlaneRes *plane_res = NULL; drmModeRes *res = NULL; @@ -228,12 +229,12 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd, if ((!overlay_id) && (value == DRM_PLANE_TYPE_OVERLAY)) overlay_id = plane_id; - if (layercount == osd_plane_id) { + if (layercount == osd_plane_idx) { ctx->osd_plane = plane; continue; } - if (layercount == video_plane_id) { + if (layercount == video_plane_idx) { ctx->video_plane = plane; continue; } @@ -244,26 +245,31 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd, } } - // default OSD plane to primary if unspecified + // OSD plane was specified as either of the special options: any primary plane or any overlay plane if (!ctx->osd_plane) { - if (primary_id) { - mp_verbose(log, "Using default plane %d for OSD\n", primary_id); - ctx->osd_plane = drm_object_create(log, ctx->fd, primary_id, DRM_MODE_OBJECT_PLANE); + const int osd_plane_id = (osd_plane_idx == DRM_OPTS_OVERLAY_PLANE) ? overlay_id : primary_id; + const char *plane_type = (osd_plane_idx == DRM_OPTS_OVERLAY_PLANE) ? "overlay" : "primary"; + if (osd_plane_id) { + mp_verbose(log, "Using %s plane %d for OSD\n", plane_type, osd_plane_id); + ctx->osd_plane = drm_object_create(log, ctx->fd, osd_plane_id, DRM_MODE_OBJECT_PLANE); } else { - mp_err(log, "Failed to find OSD plane with id=%d\n", osd_plane_id); + mp_err(log, "Failed to find OSD plane with idx=%d\n", osd_plane_idx); goto fail; } } else { mp_verbose(log, "Found OSD plane with ID %d\n", ctx->osd_plane->id); } - // default video plane to overlay if unspecified + // video plane was specified as either of the special options: any primary plane or any overlay plane if (!ctx->video_plane) { - if (overlay_id) { - mp_verbose(log, "Using default plane %d for video\n", overlay_id); - ctx->video_plane = drm_object_create(log, ctx->fd, overlay_id, DRM_MODE_OBJECT_PLANE); + const int video_plane_id = (video_plane_idx == DRM_OPTS_PRIMARY_PLANE) ? primary_id : overlay_id; + const char *plane_type = (video_plane_idx == DRM_OPTS_PRIMARY_PLANE) ? "primary" : "overlay"; + + if (video_plane_id) { + mp_verbose(log, "Using %s plane %d for video\n", plane_type, video_plane_id); + ctx->video_plane = drm_object_create(log, ctx->fd, video_plane_id, DRM_MODE_OBJECT_PLANE); } else { - mp_verbose(log, "Failed to find video plane with id=%d. drmprime-drm hwdec interop will not work\n", video_plane_id); + mp_verbose(log, "Failed to find video plane with idx=%d. drmprime-drm hwdec interop will not work\n", video_plane_idx); } } else { mp_verbose(log, "Found video plane with ID %d\n", ctx->video_plane->id); diff --git a/video/out/drm_atomic.h b/video/out/drm_atomic.h index cd0252a767..bfbec2bde2 100644 --- a/video/out/drm_atomic.h +++ b/video/out/drm_atomic.h @@ -25,6 +25,9 @@ #include "common/msg.h" +#define DRM_OPTS_PRIMARY_PLANE -1 +#define DRM_OPTS_OVERLAY_PLANE -2 + struct drm_mode { drmModeModeInfo mode; uint32_t blob_id; @@ -89,7 +92,7 @@ struct drm_object * drm_object_create(struct mp_log *log, int fd, uint32_t objec void drm_object_free(struct drm_object *object); void drm_object_print_info(struct mp_log *log, struct drm_object *object); struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd, int crtc_id, int connector_id, - int osd_plane_id, int video_plane_id); + int osd_plane_idx, int video_plane_idx); void drm_atomic_destroy_context(struct drm_atomic_context *ctx); bool drm_atomic_save_old_state(struct drm_atomic_context *ctx); diff --git a/video/out/drm_common.c b/video/out/drm_common.c index aa3d0998c4..647d545eb9 100644 --- a/video/out/drm_common.c +++ b/video/out/drm_common.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "drm_common.h" @@ -47,8 +48,12 @@ const struct m_sub_options drm_conf = { OPT_STRING_VALIDATE("drm-connector", drm_connector_spec, 0, drm_validate_connector_opt), OPT_INT("drm-mode", drm_mode_id, 0), - OPT_INT("drm-osd-plane-id", drm_osd_plane_id, 0), - OPT_INT("drm-video-plane-id", drm_video_plane_id, 0), + OPT_CHOICE_OR_INT("drm-osd-plane-id", drm_osd_plane_id, 0, 0, INT_MAX, + ({"primary", DRM_OPTS_PRIMARY_PLANE}, + {"overlay", DRM_OPTS_OVERLAY_PLANE})), + OPT_CHOICE_OR_INT("drm-video-plane-id", drm_video_plane_id, 0, 0, INT_MAX, + ({"primary", DRM_OPTS_PRIMARY_PLANE}, + {"overlay", DRM_OPTS_OVERLAY_PLANE})), OPT_CHOICE("drm-format", drm_format, 0, ({"xrgb8888", DRM_OPTS_FORMAT_XRGB8888}, {"xrgb2101010", DRM_OPTS_FORMAT_XRGB2101010})), @@ -56,8 +61,8 @@ const struct m_sub_options drm_conf = { {0}, }, .defaults = &(const struct drm_opts) { - .drm_osd_plane_id = -1, - .drm_video_plane_id = -1, + .drm_osd_plane_id = DRM_OPTS_PRIMARY_PLANE, + .drm_video_plane_id = DRM_OPTS_OVERLAY_PLANE, }, .size = sizeof(struct drm_opts), }; -- cgit v1.2.3