Esempio n. 1
0
int set_sp_plane_pset(struct sp_dev *dev, struct sp_plane *plane,
		      drmModePropertySetPtr pset, struct sp_crtc *crtc, int x, int y) {
	int ret;
	uint32_t w, h;

	w = plane->bo->width;
	h = plane->bo->height;

	if ((w + x) > crtc->crtc->mode.hdisplay)
		w = crtc->crtc->mode.hdisplay - x;
	if ((h + y) > crtc->crtc->mode.vdisplay)
		h = crtc->crtc->mode.vdisplay - y;

	ret = drmModePropertySetAdd(pset, plane->plane->plane_id,
				    plane->crtc_pid, crtc->crtc->crtc_id)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->fb_pid, plane->bo->fb_id)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->crtc_x_pid, x)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->crtc_y_pid, y)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->crtc_w_pid, w)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->crtc_h_pid, h)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->src_x_pid, 0)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->src_y_pid, 0)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->src_w_pid, w << 16)
		|| drmModePropertySetAdd(pset, plane->plane->plane_id,
					 plane->src_h_pid, h << 16);
	if (ret) {
		printf("failed to add properties to the set\n");
		return -1;
	}

	return ret;
}
Esempio n. 2
0
int DrmResources::SetDisplayActiveMode(int display, const DrmMode &mode) {
    DrmConnector *connector = GetConnectorForDisplay(display);
    if (!connector) {
        ALOGE("Could not locate connector for display %d", display);
        return -ENODEV;
    }

    int ret = CreateDisplayPipe(connector);
    if (ret) {
        ALOGE("Failed CreateDisplayPipe with %d", ret);
        return ret;
    }

    DrmCrtc *crtc = connector->encoder()->crtc();
    DrmProperty old_mode;
    ret = GetCrtcProperty(*crtc, crtc->mode_property().name().c_str(), &old_mode);
    if (ret) {
        ALOGE("Failed to get old mode property from crtc %d", crtc->id());
        return ret;
    }

    struct drm_mode_modeinfo drm_mode;
    memset(&drm_mode, 0, sizeof(drm_mode));
    mode.ToDrmModeModeInfo(&drm_mode);

    uint32_t blob_id;
    ret =
        CreatePropertyBlob(&drm_mode, sizeof(struct drm_mode_modeinfo), &blob_id);
    if (ret) {
        ALOGE("Failed to create mode property blob %d", ret);
        return ret;
    }

    drmModePropertySetPtr pset = drmModePropertySetAlloc();
    if (!pset) {
        ALOGE("Failed to allocate property set");
        DestroyPropertyBlob(blob_id);
        return -ENOMEM;
    }

    ret = drmModePropertySetAdd(pset, crtc->id(), crtc->mode_property().id(),
                                blob_id) ||
          drmModePropertySetAdd(pset, connector->id(),
                                connector->crtc_id_property().id(), crtc->id());
    if (ret) {
        ALOGE("Failed to add blob %d to pset", blob_id);
        DestroyPropertyBlob(blob_id);
        drmModePropertySetFree(pset);
        return ret;
    }

    ret =
        drmModePropertySetCommit(fd_, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL, pset);

    drmModePropertySetFree(pset);

    if (ret) {
        ALOGE("Failed to commit pset ret=%d\n", ret);
        DestroyPropertyBlob(blob_id);
        return ret;
    }

    connector->set_active_mode(mode);

    uint64_t old_blob_id;
    ret = old_mode.value(&old_blob_id);
    if (ret) {
        ALOGE("Could not get old blob id value %d", ret);
        return ret;
    }
    if (!old_blob_id)
        return 0;

    ret = DestroyPropertyBlob(old_blob_id);
    if (ret) {
        ALOGE("Failed to destroy old mode property blob", old_blob_id);
        return ret;
    }

    return 0;
}
Esempio n. 3
0
static void plane_commit(struct my_ctx *ctx, struct my_plane *p)
{
    struct my_crtc *c = container_of(p->base.crtc, struct my_crtc, base);
    int r;

    if (!p->dirty && !c->primary->dirty && !c->dirty_mode)
        return;

    if (c->primary != p)
        plane_commit(ctx, c->primary);

    assert(p->buf == NULL);

#ifndef LEGACY_API
    if (!ctx->set) {
        ctx->set = drmModePropertySetAlloc();
        if (!ctx->set)
            return;
        ctx->flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
    }
#endif

    if (p->dirty && p->enable) {
        p->buf = surface_get_front(ctx->fd, &p->surf.base);
        if (!p->buf) {
            if (c->primary->buf) {
                surface_buffer_put_fb(&c->primary->surf.base, c->primary->buf);
                c->primary->buf = NULL;
            }
            return;
        }
        p->buf->fence = next_fence;
    }

#ifndef LEGACY_API
    if (c->dirty_mode) {
        r = drmModeSetCrtc(ctx->fd, c->base.crtc_id, c->primary->buf->fb_id,
                           0, 0, &c->base.connector_id, 1, &c->mode);
        if (r)
            printf("drmModeSetCrtc() failed %d:%s\n", errno, strerror(errno));
    }

    if (p->dirty) {
        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.fb,
                              p->buf ? p->buf->fb_id : 0);

        /* note: setting CRTC but not FB angers danvet */
        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.crtc,
                              p->buf ? p->base.crtc->crtc_id : 0);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.src_x,
                              p->src.x1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.src_y,
                              p->src.y1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.src_w,
                              p->src.x2 - p->src.x1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.src_h,
                              p->src.y2 - p->src.y1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.crtc_x,
                              p->dst.x1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.crtc_y,
                              p->dst.y1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.crtc_w,
                              p->dst.x2 - p->dst.x1);

        drmModePropertySetAdd(ctx->set,
                              p->base.plane_id,
                              p->prop.crtc_h,
                              p->dst.y2 - p->dst.y1);
    }

#else
    if (c->dirty || c->dirty_mode) {
        r = drmModeSetCrtc(ctx->fd, c->base.crtc_id, c->buf->fb_id,
                           0, 0, &c->base.connector_id, 1, &c->mode);
        if (r)
            printf("drmModeSetCrtc() failed %d:%s\n", errno, strerror(errno));
    }

    if (p->dirty) {
        r = drmModeSetPlane(ctx->fd, p->base.plane_id,
                            p->base.crtc->crtc_id,
                            p->buf ? p->buf->fb_id : 0,
                            0,
                            p->dst.x1, p->dst.y1,
                            p->dst.x2 - p->dst.x1,
                            p->dst.y2 - p->dst.y1,
                            p->src.x1, p->src.y1,
                            p->src.x2 - p->src.x1,
                            p->src.y2 - p->src.y1);
        if (r)
            printf("drmModeSetPlane() failed %d:%s\n", errno, strerror(errno));
    }
#endif
}
Esempio n. 4
0
static void drmModePropertySetAdd2(drmModePropertySetPtr set, uint32_t obj_id, uint32_t prop_id, uint64_t value)
{
    printf("obj=%u, prop=%u, value=%llu\n", obj_id, prop_id, value);
    drmModePropertySetAdd(set, obj_id, prop_id, value);
}