diff options
author | 2018-04-21 15:16:12 +0200 | |
---|---|---|
committer | 2018-05-01 20:48:02 +0300 | |
commit | e60728a622a89bb792de41106ec969aad7d3dd28 (patch) | |
tree | adb714945f8d7c9d35c079a03c99c08e80082889 /video/out/opengl | |
parent | ba3d90d9edbb379d23591da5b63c25be41664924 (diff) |
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.
Diffstat (limited to 'video/out/opengl')
-rw-r--r-- | video/out/opengl/context_drm_egl.c | 58 |
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; } } |