summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;