Skip to content
Permalink
Browse files

Add Atomic path

  • Loading branch information
LongChair committed Sep 25, 2017
1 parent cd9e3f9 commit 11f531265b0043446ed5a7cd19863a7afc0b1242
Showing with 68 additions and 7 deletions.
  1. +35 −0 video/out/drm_common.c
  2. +3 −0 video/out/drm_common.h
  3. +30 −7 video/out/opengl/hwdec_drmprime_drm.c
@@ -291,6 +291,14 @@ struct kms *kms_create(struct mp_log *log, const char *connector_spec,
goto err;
}

if (drmSetClientCap(kms->fd, DRM_CLIENT_CAP_ATOMIC, 1)) {
mp_info(log, "No DRM atomic support found\n");
}
else {
mp_info(log, "DRM atomic support found\n");
kms->hasAtomic = 1;
}

if (!setup_connector(kms, res, connector_name))
goto err;
if (!setup_crtc(kms, res, plane_res, layer_id))
@@ -410,7 +418,34 @@ int drm_validate_connector_opt(struct mp_log *log, const struct m_option *opt,
return 1;
}

int drm_add_plane_property(const struct kms *kms, drmModeAtomicReq *req, uint32_t plane_id,
const char *name, uint64_t value)
{
drmModeObjectPropertiesPtr props;
drmModePropertyPtr prop_info;
int ret;

props = drmModeObjectGetProperties(kms->fd, plane_id, DRM_MODE_OBJECT_PLANE);
if (props) {
for (int i = 0; i < props->count_props; i++) {
prop_info = drmModeGetProperty(kms->fd, props->props[i]);
if (prop_info) {
if (strcmp(prop_info->name, name) == 0) {
ret = drmModeAtomicAddProperty(req, plane_id, prop_info->prop_id, value);
drmModeFreeProperty(prop_info);
drmModeFreeObjectProperties(props);
return ret;
}
drmModeFreeProperty(prop_info);
}
}
drmModeFreeObjectProperties(props);
}
else
MP_ERR(kms,"Failed to get object properties for plane %d\n", plane_id);

return -1;
}

// VT switcher ----------------------------------------------------------------

@@ -32,6 +32,7 @@ struct kms {
uint32_t crtc_id;
uint32_t plane_id;
int card_no;
int hasAtomic;
};

struct vt_switcher {
@@ -63,5 +64,7 @@ void kms_show_available_cards_and_connectors(struct mp_log *log);

int drm_validate_connector_opt(struct mp_log *log, const struct m_option *opt,
struct bstr name, struct bstr param);
int drm_add_plane_property(const struct kms *kms, drmModeAtomicReq *req, uint32_t plane_id,
const char *name, uint64_t value);

#endif
@@ -182,13 +182,36 @@ static int overlay_frame(struct ra_hwdec *hw, struct mp_image *hw_image,
goto err;
}

ret = drmModeSetPlane(p->kms->fd, p->kms->plane_id, p->kms->crtc_id, next_frame.fb_id, 0,
MP_ALIGN_DOWN(p->dst.x0, 2), MP_ALIGN_DOWN(p->dst.y0, 2), dstw, dsth,
p->src.x0 << 16, p->src.y0 << 16 , srcw << 16, srch << 16);
if (ret < 0) {
MP_ERR(hw, "Failed to set the plane %d (buffer %d).\n", p->kms->plane_id,
next_frame.fb_id);
goto err;
if (p->kms->hasAtomic) {
drmModeAtomicReq *req = drmModeAtomicAlloc();

if (req) {
drm_add_plane_property(p->kms, req, p->kms->plane_id, "FB_ID", next_frame.fb_id);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "CRTC_ID", p->kms->crtc_id);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "SRC_X", p->src.x0 << 16);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "SRC_Y", p->src.y0 << 16);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "SRC_W", srcw << 16);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "SRC_H", srch << 16);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "CRTC_X", MP_ALIGN_DOWN(p->dst.x0, 2));
drm_add_plane_property(p->kms, req, p->kms->plane_id, "CRTC_Y", MP_ALIGN_DOWN(p->dst.y0, 2));
drm_add_plane_property(p->kms, req, p->kms->plane_id, "CRTC_W", dstw);
drm_add_plane_property(p->kms, req, p->kms->plane_id, "CRTC_H", dsth);

ret = drmModeAtomicCommit(p->kms->fd, req, DRM_MODE_ATOMIC_NONBLOCK, NULL);
if (ret)
MP_ERR(hw, "Atomic commit failed with error code %d.\n", ret);
} else
MP_ERR(hw, "Failed to create Atomic request\n");

} else {
ret = drmModeSetPlane(p->kms->fd, p->kms->plane_id, p->kms->crtc_id, next_frame.fb_id, 0,
MP_ALIGN_DOWN(p->dst.x0, 2), MP_ALIGN_DOWN(p->dst.y0, 2), dstw, dsth,
p->src.x0 << 16, p->src.y0 << 16 , srcw << 16, srch << 16);
if (ret < 0) {
MP_ERR(hw, "Failed to set the plane %d (buffer %d).\n", p->kms->plane_id,
next_frame.fb_id);
goto err;
}
}

next_frame.image = hw_image;

0 comments on commit 11f5312

Please sign in to comment.