summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--libmpv/opengl_cb.h3
-rw-r--r--video/out/drm_atomic.c28
-rw-r--r--video/out/drm_atomic.h5
-rw-r--r--video/out/drm_common.c3
-rw-r--r--video/out/opengl/context_drm_egl.c1
-rw-r--r--video/out/opengl/hwdec_drmprime_drm.c2
6 files changed, 38 insertions, 4 deletions
diff --git a/libmpv/opengl_cb.h b/libmpv/opengl_cb.h
index dd9ab2cf09..682068133a 100644
--- a/libmpv/opengl_cb.h
+++ b/libmpv/opengl_cb.h
@@ -177,6 +177,9 @@ struct mpv_opengl_cb_drm_params {
// currently used crtc id
int crtc_id;
+ // currently used connector id
+ int connector_id;
+
// pointer to the drmModeAtomicReq that is being used for the renderloop.
// This atomic request pointer should be usually created at every renderloop.
struct _drmModeAtomicReq *atomic_request;
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);
diff --git a/video/out/drm_atomic.h b/video/out/drm_atomic.h
index d0ebdb910e..d4d5707274 100644
--- a/video/out/drm_atomic.h
+++ b/video/out/drm_atomic.h
@@ -25,6 +25,7 @@
#include "common/msg.h"
struct drm_object {
+ int fd;
uint32_t id;
uint32_t type;
drmModeObjectProperties *props;
@@ -35,6 +36,7 @@ struct drm_atomic_context {
int fd;
struct drm_object *crtc;
+ struct drm_object *connector;
struct drm_object *primary_plane;
struct drm_object *overlay_plane;
@@ -46,10 +48,11 @@ int drm_object_create_properties(struct mp_log *log, int fd, struct drm_object *
void drm_object_free_properties(struct drm_object *object);
int drm_object_get_property(struct drm_object *object, char *name, uint64_t *value);
int drm_object_set_property(drmModeAtomicReq *request, struct drm_object *object, char *name, uint64_t value);
+drmModePropertyBlobPtr drm_object_get_property_blob(struct drm_object *object, char *name);
struct drm_object * drm_object_create(struct mp_log *log, int fd, uint32_t object_id, uint32_t type);
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 overlay_id);
+struct drm_atomic_context *drm_atomic_create_context(struct mp_log *log, int fd, int crtc_id, int connector_id, int overlay_id);
void drm_atomic_destroy_context(struct drm_atomic_context *ctx);
#endif // MP_DRMATOMIC_H
diff --git a/video/out/drm_common.c b/video/out/drm_common.c
index 8723f59bd3..e0b0581834 100644
--- a/video/out/drm_common.c
+++ b/video/out/drm_common.c
@@ -285,7 +285,8 @@ struct kms *kms_create(struct mp_log *log, const char *connector_spec,
mp_verbose(log, "No DRM Atomic support found\n");
} else {
mp_verbose(log, "DRM Atomic support found\n");
- kms->atomic_context = drm_atomic_create_context(kms->log, kms->fd, kms->crtc_id, overlay_id);
+ kms->atomic_context = drm_atomic_create_context(kms->log, kms->fd, kms->crtc_id,
+ kms->connector->connector_id, overlay_id);
if (!kms->atomic_context) {
mp_err(log, "Failed to create DRM atomic context\n");
goto err;
diff --git a/video/out/opengl/context_drm_egl.c b/video/out/opengl/context_drm_egl.c
index cf37cb524a..27b1ab968a 100644
--- a/video/out/opengl/context_drm_egl.c
+++ b/video/out/opengl/context_drm_egl.c
@@ -567,6 +567,7 @@ static bool drm_egl_init(struct ra_ctx *ctx)
p->drm_params.fd = p->kms->fd;
p->drm_params.connector_id = p->kms->connector->connector_id;
p->drm_params.crtc_id = p->kms->crtc_id;
+ p->drm_params.connector_id = p->kms->connector->connector_id;
if (p->kms->atomic_context)
p->drm_params.atomic_request_ptr = &p->kms->atomic_context->request;
struct ra_gl_ctx_params params = {
diff --git a/video/out/opengl/hwdec_drmprime_drm.c b/video/out/opengl/hwdec_drmprime_drm.c
index 0c7f86a584..f99550442a 100644
--- a/video/out/opengl/hwdec_drmprime_drm.c
+++ b/video/out/opengl/hwdec_drmprime_drm.c
@@ -224,7 +224,7 @@ static int init(struct ra_hwdec *hw)
drm_params = ra_get_native_resource(hw->ra, "drm_params");
if (drm_params) {
p->ctx = drm_atomic_create_context(p->log, drm_params->fd, drm_params->crtc_id,
- drm_overlay);
+ drm_params->connector_id, drm_overlay);
if (!p->ctx) {
mp_err(p->log, "Failed to retrieve DRM atomic context.\n");
goto err;