summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Kindestam <antonki@kth.se>2018-04-21 15:16:12 +0200
committerJan Ekström <jeebjp@gmail.com>2018-05-01 20:48:02 +0300
commite60728a622a89bb792de41106ec969aad7d3dd28 (patch)
treeadb714945f8d7c9d35c079a03c99c08e80082889
parentba3d90d9edbb379d23591da5b63c25be41664924 (diff)
downloadmpv-e60728a622a89bb792de41106ec969aad7d3dd28.tar.bz2
mpv-e60728a622a89bb792de41106ec969aad7d3dd28.tar.xz
drm/atomic: Fix crtc_setup_atomic and crtc_release_atomic
Add some properties which where forgotten in crtc_setup_atomic. In both change to not use DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK flags. This should make it more similar to the drmSetCrtc which it aims to replace (take effect directly, and blocking call). This also saves us the trouble of having to set up a poll to wait for pageflip, which would've been neccesary with DRM_MODE_PAGE_FLIP_EVENT, in both crtc_setup_atomic and crtc_release_atomic.
-rw-r--r--video/out/opengl/context_drm_egl.c58
1 files changed, 33 insertions, 25 deletions
diff --git a/video/out/opengl/context_drm_egl.c b/video/out/opengl/context_drm_egl.c
index 1fddbb1c37..6368107327 100644
--- a/video/out/opengl/context_drm_egl.c
+++ b/video/out/opengl/context_drm_egl.c
@@ -247,39 +247,50 @@ static void update_framebuffer_from_bo(struct ra_ctx *ctx, struct gbm_bo *bo)
p->fb = fb;
}
-static bool crtc_setup_atomic(struct ra_ctx *ctx, drmModeModeInfo mode)
+static bool crtc_setup_atomic(struct ra_ctx *ctx)
{
struct priv *p = ctx->priv;
-
struct drm_atomic_context *atomic_ctx = p->kms->atomic_context;
+
drmModeAtomicReqPtr request = drmModeAtomicAlloc();
if (request) {
- drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->kms->crtc_id);
+ if (drm_object_set_property(request, atomic_ctx->connector, "CRTC_ID", p->kms->crtc_id) < 0) {
+ MP_ERR(ctx->vo, "Could not set CRTC_ID on connector\n");
+ return false;
+ }
uint32_t blob_id;
- if (drmModeCreatePropertyBlob(p->kms->fd, &mode, sizeof(drmModeModeInfo),
+ if (drmModeCreatePropertyBlob(p->kms->fd, &p->kms->mode, sizeof(drmModeModeInfo),
&blob_id) != 0) {
- MP_ERR(ctx->vo, "Failed to DRM mode blob\n");
- return 0;
+ MP_ERR(ctx->vo, "Failed to create DRM mode blob\n");
+ return false;
+ }
+ if (drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id) < 0) {
+ MP_ERR(ctx->vo, "Could not set MODE_ID on crtc\n");
+ return false;
+ }
+ if (drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1) < 0) {
+ MP_ERR(ctx->vo, "Could not set ACTIVE on crtc\n");
+ return false;
}
- drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id);
- drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1);
+ drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->fb->id);
+ drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_ID", p->kms->crtc_id);
drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_X", 0);
drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_Y", 0);
drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_W", p->osd_size.width << 16);
drm_object_set_property(request, atomic_ctx->osd_plane, "SRC_H", p->osd_size.height << 16);
drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_X", 0);
drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_Y", 0);
- drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_W", mode.hdisplay);
- drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_H", mode.vdisplay);
+ drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_W", p->kms->mode.hdisplay);
+ drm_object_set_property(request, atomic_ctx->osd_plane, "CRTC_H", p->kms->mode.vdisplay);
- int ret = drmModeAtomicCommit(p->kms->fd, request,
- DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT
- | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
-
- if (ret)
- MP_WARN(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret);
+ int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+ if (ret) {
+ MP_ERR(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret);
+ drmModeAtomicFree(request);
+ return false;
+ }
drmModeAtomicFree(request);
@@ -303,16 +314,14 @@ static bool crtc_release_atomic(struct ra_ctx *ctx)
uint32_t blob_id;
if (drmModeCreatePropertyBlob(p->kms->fd, &p->old_crtc->mode, sizeof(drmModeModeInfo),
&blob_id) != 0) {
- MP_ERR(ctx->vo, "Failed to DRM mode blob\n");
- return 0;
+ MP_ERR(ctx->vo, "Failed to create DRM mode blob\n");
+ return false;
}
drm_object_set_property(request, atomic_ctx->crtc, "MODE_ID", blob_id);
drm_object_set_property(request, atomic_ctx->crtc, "ACTIVE", 1);
- drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->old_crtc->buffer_id);
+ drm_object_set_property(request, atomic_ctx->osd_plane, "FB_ID", p->old_crtc->buffer_id);
- int ret = drmModeAtomicCommit(p->kms->fd, request,
- DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT
- | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+ int ret = drmModeAtomicCommit(p->kms->fd, request, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
if (ret)
MP_WARN(ctx->vo, "Failed to commit ModeSetting atomic request (%d)\n", ret);
@@ -335,10 +344,9 @@ static bool crtc_setup(struct ra_ctx *ctx)
p->old_crtc = drmModeGetCrtc(p->kms->fd, p->kms->crtc_id);
if (p->kms->atomic_context) {
- int ret = crtc_setup_atomic(ctx, p->kms->mode);
+ int ret = crtc_setup_atomic(ctx);
p->active = true;
return ret;
-
} else {
int ret = drmModeSetCrtc(p->kms->fd, p->kms->crtc_id, p->fb->id,
0, 0, &p->kms->connector->connector_id, 1,
@@ -376,7 +384,7 @@ static void crtc_release(struct ra_ctx *ctx)
&p->kms->connector->connector_id, 1,
&p->old_crtc->mode);
}
- drmModeFreeCrtc(p->old_crtc);
+ drmModeFreeCrtc(p->old_crtc);
p->old_crtc = NULL;
}
}