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; }
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; }
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 }
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); }