diff options
Diffstat (limited to 'video/out')
-rw-r--r-- | video/out/drm_atomic.c | 28 | ||||
-rw-r--r-- | video/out/drm_atomic.h | 5 | ||||
-rw-r--r-- | video/out/drm_common.c | 3 | ||||
-rw-r--r-- | video/out/opengl/context_drm_egl.c | 1 | ||||
-rw-r--r-- | video/out/opengl/hwdec_drmprime_drm.c | 2 |
5 files changed, 35 insertions, 4 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); 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; |