summaryrefslogtreecommitdiffstats
path: root/video/out/drm_atomic.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/out/drm_atomic.c')
-rw-r--r--video/out/drm_atomic.c73
1 files changed, 49 insertions, 24 deletions
diff --git a/video/out/drm_atomic.c b/video/out/drm_atomic.c
index fb63c2b277..84c46beb82 100644
--- a/video/out/drm_atomic.c
+++ b/video/out/drm_atomic.c
@@ -137,8 +137,8 @@ void drm_object_print_info(struct mp_log *log, struct drm_object *object)
(long long)object->props->prop_values[i]);
}
-struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd,
- int crtc_id, int connector_id, int overlay_id)
+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)
{
drmModePlane *drmplane = NULL;
drmModePlaneRes *plane_res = NULL;
@@ -146,7 +146,10 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd,
struct drm_object *plane = NULL;
struct drm_atomic_context *ctx;
int crtc_index = -1;
- int layercount = 0;
+ int layercount = -1;
+ int primary_id = 0;
+ int overlay_id = 0;
+
uint64_t value;
res = drmModeGetResources(fd);
@@ -206,20 +209,26 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd,
mp_err(log, "Unable to retrieve type property from plane %d\n", j);
goto fail;
} else {
- if ((value == DRM_PLANE_TYPE_OVERLAY) &&
- (layercount == overlay_id)) {
- ctx->overlay_plane = plane;
- }
- else if (value == DRM_PLANE_TYPE_PRIMARY) {
- ctx->primary_plane = plane;
+ layercount++;
+
+ if ((!primary_id) && (value == DRM_PLANE_TYPE_PRIMARY))
+ primary_id = drmplane->plane_id;
+
+ if ((!overlay_id) && (value == DRM_PLANE_TYPE_OVERLAY))
+ overlay_id = drmplane->plane_id;
+
+ if (layercount == osd_plane_id) {
+ ctx->osd_plane = plane;
+ continue;
}
- else {
- drm_object_free(plane);
- plane = NULL;
+
+ if (layercount == video_plane_id) {
+ ctx->video_plane = plane;
+ continue;
}
- if (value == DRM_PLANE_TYPE_OVERLAY)
- layercount++;
+ drm_object_free(plane);
+ plane = NULL;
}
} else {
mp_err(log, "Failed to create Plane object from plane ID %d\n",
@@ -231,18 +240,34 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd,
drmplane = NULL;
}
- if (!ctx->primary_plane) {
- mp_err(log, "Failed to find primary plane\n");
- goto fail;
+ // default OSD plane to primary if unspecified
+ 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);
+ } else {
+ mp_err(log, "Failed to find OSD plane with id=%d\n", osd_plane_id);
+ goto fail;
+ }
+ } else {
+ mp_verbose(log, "Found OSD plane with ID %d\n", ctx->osd_plane->id);
}
- if (!ctx->overlay_plane) {
- mp_err(log, "Failed to find overlay plane with id=%d\n", overlay_id);
- goto fail;
+ // default video plane to overlay if unspecified
+ 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);
+ } else {
+ mp_err(log, "Failed to find video plane with id=%d\n", video_plane_id);
+ goto fail;
+ }
+ } else {
+ mp_verbose(log, "Found video plane with ID %d\n", ctx->video_plane->id);
}
- mp_verbose(log, "Found Primary plane with ID %d, overlay with ID %d\n",
- ctx->primary_plane->id, ctx->overlay_plane->id);
+ mp_verbose(log, "Found Video plane with ID %d, OSD with ID %d\n",
+ ctx->video_plane->id, ctx->osd_plane->id);
drmModeFreePlaneResources(plane_res);
drmModeFreeResources(res);
@@ -265,7 +290,7 @@ void drm_atomic_destroy_context(struct drm_atomic_context *ctx)
{
drm_object_free(ctx->crtc);
drm_object_free(ctx->connector);
- drm_object_free(ctx->primary_plane);
- drm_object_free(ctx->overlay_plane);
+ drm_object_free(ctx->osd_plane);
+ drm_object_free(ctx->video_plane);
talloc_free(ctx);
}