static DFBResult drmkmsPlaneSetLevel( CoreLayer *layer, void *driver_data, void *layer_data, int level ) { DRMKMSData *drmkms = driver_data; DRMKMSDataShared *shared = drmkms->shared; DRMKMSLayerData *data = layer_data; int ret; if (!data->zpos_propid) return DFB_UNSUPPORTED; if (level < 1 || level > shared->plane_index_count) return DFB_INVARG; ret = drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->zpos_propid, level ); if (ret) { D_ERROR( "DirectFB/DRMKMS: drmModeObjectSetProperty() failed setting zpos\n"); return DFB_FAILURE; } data->level = level; return DFB_OK; }
bool CDRMUtils::SetProperty(struct drm_object *object, const char *name, uint64_t value) { uint32_t property_id = GetPropertyId(object, name); if (!property_id) return false; if (drmModeObjectSetProperty(m_fd, object->id, object->type, property_id, value) < 0) { CLog::Log(LOGERROR, "CDRMUtils::%s - could not set property %s", __FUNCTION__, name); return false; } return true; }
static int setProperty(char *argv[]) { uint32_t obj_id, obj_type, prop_id; uint64_t value; obj_id = atoi(argv[0]); if (!strcmp(argv[1], "connector")) { obj_type = DRM_MODE_OBJECT_CONNECTOR; } else if (!strcmp(argv[1], "crtc")) { obj_type = DRM_MODE_OBJECT_CRTC; } else { fprintf(stderr, "Invalid object type.\n"); return 1; } prop_id = atoi(argv[2]); value = atoll(argv[3]); return drmModeObjectSetProperty(fd, obj_id, obj_type, prop_id, value); }
static DFBResult drmkmsPlaneSetRegion( CoreLayer *layer, void *driver_data, void *layer_data, void *region_data, CoreLayerRegionConfig *config, CoreLayerRegionConfigFlags updated, CoreSurface *surface, CorePalette *palette, CoreSurfaceBufferLock *left_lock, CoreSurfaceBufferLock *right_lock ) { int ret; bool unmute = false; DRMKMSData *drmkms = driver_data; DRMKMSLayerData *data = layer_data; D_DEBUG_AT( DRMKMS_Layer, "%s()\n", __FUNCTION__ ); if ((updated & CLRCF_OPACITY) && data->muted && config->opacity) unmute = true; if ((updated & (CLRCF_WIDTH | CLRCF_HEIGHT | CLRCF_BUFFERMODE | CLRCF_DEST | CLRCF_SOURCE)) || unmute) { ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, (u32)(long)left_lock->handle, /* plane_flags */ 0, config->dest.x, config->dest.y, config->dest.w, config->dest.h, config->source.x << 16, config->source.y <<16, config->source.w << 16, config->source.h << 16); if (ret) { D_INFO( "DirectFB/DRMKMS: drmModeSetPlane(plane_id=%d, fb_id=%d , dest=%d,%d-%dx%d, src=%d,%d-%dx%d) failed! (%d)\n", data->plane->plane_id, (u32)(long)left_lock->handle, DFB_RECTANGLE_VALS(&config->dest), DFB_RECTANGLE_VALS(&config->source), ret ); return DFB_FAILURE; } data->config = config; data->muted = false; } if ((updated & (CLRCF_SRCKEY | CLRCF_OPTIONS)) && data->colorkey_propid) { uint32_t drm_colorkey = config->src_key.r << 16 | config->src_key.g << 8 | config->src_key.b; if (config->options & DLOP_SRC_COLORKEY) drm_colorkey |= 0x01000000; ret = drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->colorkey_propid, drm_colorkey ); if (ret) { D_ERROR( "DirectFB/DRMKMS: drmModeObjectSetProperty() failed setting colorkey\n"); return DFB_FAILURE; } } if (updated & CLRCF_OPACITY) { if (config->opacity == 0) { ret = drmModeSetPlane(drmkms->fd, data->plane->plane_id, drmkms->encoder[0]->crtc_id, 0, /* plane_flags */ 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0); if (ret) { D_ERROR( "DirectFB/DRMKMS: drmModeSetPlane() failed disabling plane\n"); return DFB_FAILURE; } data->muted = true; } else if (data->alpha_propid) { ret = drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->alpha_propid, config->opacity ); if (ret) { D_ERROR( "DirectFB/DRMKMS: drmModeObjectSetProperty() failed setting alpha\n"); return DFB_FAILURE; } } } return DFB_OK; }
static DFBResult drmkmsPlaneInitLayer( CoreLayer *layer, void *driver_data, void *layer_data, DFBDisplayLayerDescription *description, DFBDisplayLayerConfig *config, DFBColorAdjustment *adjustment ) { DRMKMSData *drmkms = driver_data; DRMKMSDataShared *shared = drmkms->shared; DRMKMSLayerData *data = layer_data; drmModeObjectPropertiesPtr props; D_DEBUG_AT( DRMKMS_Layer, "%s()\n", __FUNCTION__ ); data->index = shared->layerplane_index_count++; data->plane_index = shared->plane_index_count++; data->level = data->index; D_DEBUG_AT( DRMKMS_Layer, " -> getting plane with index %d\n", data->plane_index ); data->plane = drmModeGetPlane(drmkms->fd, drmkms->plane_resources->planes[data->plane_index]); D_DEBUG_AT( DRMKMS_Layer, " -> plane_id is %d\n", data->plane->plane_id ); description->type = DLTF_GRAPHICS; description->caps = DLCAPS_SURFACE | DLCAPS_SCREEN_POSITION | DLCAPS_ALPHACHANNEL; description->surface_caps = DSCAPS_NONE; description->surface_accessor = CSAID_LAYER0; snprintf( description->name, DFB_DISPLAY_LAYER_DESC_NAME_LENGTH, "DRMKMS Plane Layer %d", data->plane_index ); config->flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE; config->width = dfb_config->mode.width ?: shared->mode[0].hdisplay; config->height = dfb_config->mode.height ?: shared->mode[0].vdisplay; config->pixelformat = dfb_config->mode.format ?: DSPF_ARGB; config->buffermode = DLBM_FRONTONLY; props = drmModeObjectGetProperties( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE ); if (props) { int i; drmModePropertyPtr prop; D_INFO( "DirectFB/DRMKMS: supported properties for layer id %d\n", data->plane->plane_id ); for (i = 0; i < props->count_props; i++) { prop = drmModeGetProperty( drmkms->fd, props->props[i] ); if (!strcmp(prop->name, "colorkey")) { description->caps |= DLCAPS_SRC_COLORKEY; data->colorkey_propid = prop->prop_id; D_INFO( " colorkey\n" ); } else if (!strcmp(prop->name, "zpos")) { description->caps |= DLCAPS_LEVELS; data->zpos_propid = prop->prop_id; D_INFO( " zpos\n" ); drmModeObjectSetProperty( drmkms->fd, data->plane->plane_id, DRM_MODE_OBJECT_PLANE, data->zpos_propid, data->level ); } else if (!strcmp(prop->name, "alpha")) { description->caps |= DLCAPS_OPACITY; data->alpha_propid = prop->prop_id; D_INFO( " alpha\n" ); } drmModeFreeProperty( prop ); } drmModeFreeObjectProperties( props ); } shared->layer_data[data->index] = data; return DFB_OK; }