summaryrefslogtreecommitdiffstats
path: root/video/out/drm_atomic.c
diff options
context:
space:
mode:
authorLongChair <longchair@hotmail.com>2018-03-17 08:21:56 +0100
committerJan Ekström <jeebjp@gmail.com>2018-05-01 20:48:02 +0300
commit49bc07faea5f3c621eed437fadf68653b4b2498b (patch)
tree4d29c3655bd56ba9a6687445947203dff29c7178 /video/out/drm_atomic.c
parent9f2970f28a28076897fda1100de2b6eb9a92be79 (diff)
downloadmpv-49bc07faea5f3c621eed437fadf68653b4b2498b.tar.bz2
mpv-49bc07faea5f3c621eed437fadf68653b4b2498b.tar.xz
drm/atomic: add connector to atomic context
This patch adds - DRM connector object to atomic context. - fd property to the drm atomic object as well as a method to read blob type properties. This allows to ensure that the proper connector is picked up, especially when specifying it from the commandline, and also allows to make sure we're using the right one when embedding with interop into an application.
Diffstat (limited to 'video/out/drm_atomic.c')
-rw-r--r--video/out/drm_atomic.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/video/out/drm_atomic.c b/video/out/drm_atomic.c
index 7a55483675..fb63c2b277 100644
--- a/video/out/drm_atomic.c
+++ b/video/out/drm_atomic.c
@@ -78,6 +78,17 @@ int drm_object_get_property(struct drm_object *object, char *name, uint64_t *val
return -EINVAL;
}
+drmModePropertyBlobPtr drm_object_get_property_blob(struct drm_object *object, char *name)
+{
+ uint64_t blob_id;
+
+ if (!drm_object_get_property(object, name, &blob_id)) {
+ return drmModeGetPropertyBlob(object->fd, blob_id);
+ }
+
+ return NULL;
+}
+
int drm_object_set_property(drmModeAtomicReq *request, struct drm_object *object,
char *name, uint64_t value)
{
@@ -98,6 +109,7 @@ struct drm_object * drm_object_create(struct mp_log *log, int fd,
obj = talloc_zero(NULL, struct drm_object);
obj->id = object_id;
obj->type = type;
+ obj->fd = fd;
if (drm_object_create_properties(log, fd, obj)) {
talloc_free(obj);
@@ -126,7 +138,7 @@ 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 overlay_id)
+ int crtc_id, int connector_id, int overlay_id)
{
drmModePlane *drmplane = NULL;
drmModePlaneRes *plane_res = NULL;
@@ -169,6 +181,19 @@ struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd,
}
}
+ for (int i = 0; i < res->count_connectors; i++) {
+ drmModeConnector *connector = drmModeGetConnector(fd, res->connectors[i]);
+ if (connector) {
+ if (connector->connector_id == connector_id)
+ ctx->connector = drm_object_create(log, ctx->fd, connector->connector_id,
+ DRM_MODE_OBJECT_CONNECTOR);
+
+ drmModeFreeConnector(connector);
+ if (ctx->connector)
+ break;
+ }
+ }
+
for (unsigned int j = 0; j < plane_res->count_planes; j++) {
drmplane = drmModeGetPlane (ctx->fd, plane_res->planes[j]);
@@ -239,6 +264,7 @@ fail:
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);
talloc_free(ctx);