bool CDRMAtomic::AddPlaneProperty(drmModeAtomicReq *req, struct plane *obj, const char *name, int value) { int prop_id = -1; for (unsigned int i = 0 ; i < obj->props->count_props ; i++) { if (strcmp(obj->props_info[i]->name, name) == 0) { prop_id = obj->props_info[i]->prop_id; break; } } if (prop_id < 0) { CLog::Log(LOGERROR, "CDRMAtomic::%s - no plane property: %s", __FUNCTION__, name); return false; } auto ret = drmModeAtomicAddProperty(req, obj->plane->plane_id, prop_id, value); if (ret < 0) { return false; } return true; }
int drm_object_set_property(drmModeAtomicReq *request, struct drm_object *object, char *name, uint64_t value) { for (int i = 0; i < object->props->count_props; i++) { if (strcasecmp(name, object->props_info[i]->name) == 0) { return drmModeAtomicAddProperty(request, object->id, object->props_info[i]->prop_id, value); } } return -EINVAL; }
bool CDRMUtils::AddProperty(drmModeAtomicReqPtr req, struct drm_object *object, const char *name, uint64_t value) { uint32_t property_id = GetPropertyId(object, name); if (!property_id) return false; if (drmModeAtomicAddProperty(req, object->id, property_id, value) < 0) { CLog::Log(LOGERROR, "CDRMUtils::%s - could not add property %s", __FUNCTION__, name); return false; } return true; }
static int add_crtc_property(drmModeAtomicReq *req, uint32_t obj_id, const char *name, uint64_t value) { struct crtc *obj = drm.crtc; unsigned int i; int prop_id = -1; for (i = 0 ; i < obj->props->count_props ; i++) { if (strcmp(obj->props_info[i]->name, name) == 0) { prop_id = obj->props_info[i]->prop_id; break; } } if (prop_id < 0) { printf("no crtc property: %s\n", name); return -EINVAL; } return drmModeAtomicAddProperty(req, obj_id, prop_id, value); }
static void drm_page_flip(struct drm_surface *surface) { /* We alredy have the id of the FB_ID property of * the plane on which we are going to do a pageflip: * we got it back in drm_plane_setup() */ int ret; static drmModeAtomicReqPtr req = NULL; req = drmModeAtomicAlloc(); /* We add the buffer to the plane properties we want to * set on an atomically, in a single step. * We pass the plane id, the property id and the new fb id. */ ret = drmModeAtomicAddProperty(req, drm.plane_id, drm.plane_fb_prop_id, surface->pages[surface->flip_page].buf.fb_id); if (ret < 0) { RARCH_ERR ("DRM: failed to add atomic property for pageflip\n"); } /*... now we just need to do the commit */ /* REMEMBER!!! The DRM_MODE_PAGE_FLIP_EVENT flag asks the kernel * to send you an event to the drm.fd once the * pageflip is complete. If you don't want -12 errors * (ENOMEM), namely "Cannot allocate memory", then * you must drain the event queue of that fd. */ ret = drmModeAtomicCommit(drm.fd, req, 0, NULL); if (ret < 0) { RARCH_ERR ("DRM: failed to commit for pageflip: %s\n", strerror(errno)); } surface->flip_page = !(surface->flip_page); drmModeAtomicFree(req); }