diff options
Diffstat (limited to 'video/out/drm_common.c')
-rw-r--r-- | video/out/drm_common.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/video/out/drm_common.c b/video/out/drm_common.c index df06744fbe..2971d77094 100644 --- a/video/out/drm_common.c +++ b/video/out/drm_common.c @@ -23,6 +23,7 @@ #include <sys/stat.h> #include <sys/vt.h> #include <unistd.h> +#include <limits.h> #include "drm_common.h" @@ -47,17 +48,25 @@ 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-draw-plane", drm_draw_plane, 0, 0, INT_MAX, + ({"primary", DRM_OPTS_PRIMARY_PLANE}, + {"overlay", DRM_OPTS_OVERLAY_PLANE})), + OPT_CHOICE_OR_INT("drm-drmprime-video-plane", drm_drmprime_video_plane, 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})), - OPT_SIZE_BOX("drm-osd-size", drm_osd_size, 0), + OPT_SIZE_BOX("drm-draw-surface-size", drm_draw_surface_size, 0), + + OPT_REPLACED("drm-osd-plane-id", "drm-draw-plane"), + OPT_REPLACED("drm-video-plane-id", "drm-drmprime-video-plane"), + OPT_REPLACED("drm-osd-size", "drm-draw-surface-size"), {0}, }, .defaults = &(const struct drm_opts) { - .drm_osd_plane_id = -1, - .drm_video_plane_id = -1, + .drm_draw_plane = DRM_OPTS_PRIMARY_PLANE, + .drm_drmprime_video_plane = DRM_OPTS_OVERLAY_PLANE, }, .size = sizeof(struct drm_opts), }; @@ -237,7 +246,7 @@ static bool setup_mode(struct kms *kms, int mode_id) return false; } - kms->mode = kms->connector->modes[mode_id]; + kms->mode.mode = kms->connector->modes[mode_id]; return true; } @@ -269,7 +278,7 @@ static void parse_connector_spec(struct mp_log *log, struct kms *kms_create(struct mp_log *log, const char *connector_spec, - int mode_id, int osd_plane_id, int video_plane_id) + int mode_id, int draw_plane, int drmprime_video_plane) { int card_no = -1; char *connector_name = NULL; @@ -281,7 +290,7 @@ struct kms *kms_create(struct mp_log *log, const char *connector_spec, .fd = open_card(card_no), .connector = NULL, .encoder = NULL, - .mode = { 0 }, + .mode = {{0}}, .crtc_id = -1, .card_no = card_no, }; @@ -317,14 +326,14 @@ struct kms *kms_create(struct mp_log *log, const char *connector_spec, } else { mp_verbose(log, "DRM Atomic support found\n"); kms->atomic_context = drm_atomic_create_context(kms->log, kms->fd, kms->crtc_id, - kms->connector->connector_id, osd_plane_id, video_plane_id); + kms->connector->connector_id, + draw_plane, drmprime_video_plane); if (!kms->atomic_context) { mp_err(log, "Failed to create DRM atomic context\n"); goto err; } } - drmModeFreeResources(res); return kms; @@ -341,6 +350,7 @@ void kms_destroy(struct kms *kms) { if (!kms) return; + drm_mode_destroy_blob(kms->fd, &kms->mode); if (kms->connector) { drmModeFreeConnector(kms->connector); kms->connector = NULL; @@ -425,7 +435,7 @@ void kms_show_available_cards_and_connectors(struct mp_log *log) double kms_get_display_fps(const struct kms *kms) { - return mode_get_Hz(&kms->mode); + return mode_get_Hz(&kms->mode.mode); } int drm_validate_connector_opt(struct mp_log *log, const struct m_option *opt, |