From 3ed4b3e6fdfd8ff637f1efd402ab77fa4210b5f9 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Thu, 4 Feb 2016 09:14:31 -0500 Subject: [PATCH] ecore-drm: Add internal function to create planes for an output This patch adds an internal function that we use during output creation in order to create the planes necessary and get the supported rotation values for an output Signed-off-by: Chris Michael --- src/lib/ecore_drm/ecore_drm_output.c | 188 ++++++++++++++------------- 1 file changed, 96 insertions(+), 92 deletions(-) diff --git a/src/lib/ecore_drm/ecore_drm_output.c b/src/lib/ecore_drm/ecore_drm_output.c index aba2164b33..1ac8f9a220 100644 --- a/src/lib/ecore_drm/ecore_drm_output.c +++ b/src/lib/ecore_drm/ecore_drm_output.c @@ -424,6 +424,95 @@ _ecore_drm_output_subpixel_get(int subpixel) } } +static void +_ecore_drm_output_planes_get(Ecore_Drm_Output *output) +{ + Ecore_Drm_Device *dev; + Ecore_Drm_Plane *eplane; + drmModePlaneRes *pres; + unsigned int i = 0, j = 0; + int k = 0; + + dev = output->dev; + pres = drmModeGetPlaneResources(dev->drm.fd); + if (!pres) return; + + for (; i < pres->count_planes; i++) + { + drmModePlane *plane; + drmModeObjectPropertiesPtr props; + int type = -1; + + plane = drmModeGetPlane(dev->drm.fd, pres->planes[i]); + if (!plane) continue; + + if (!(plane->possible_crtcs & (1 << output->crtc_index))) + goto free_plane; + + props = + drmModeObjectGetProperties(dev->drm.fd, plane->plane_id, + DRM_MODE_OBJECT_PLANE); + if (!props) goto free_plane; + + eplane = calloc(1, sizeof(Ecore_Drm_Plane)); + if (!eplane) goto free_plane; + + eplane->id = plane->plane_id; + + for (j = 0; type == -1 && j < props->count_props; j++) + { + drmModePropertyPtr prop; + + prop = drmModeGetProperty(dev->drm.fd, props->props[j]); + if (!prop) continue; + + if (!strcmp(prop->name, "type")) + { + eplane->type = props->prop_values[j]; + if (eplane->type == ECORE_DRM_PLANE_TYPE_PRIMARY) + output->primary_plane_id = eplane->id; + } + else if (!strcmp(prop->name, "rotation")) + { + output->rotation_prop_id = props->props[j]; + eplane->rotation = props->prop_values[j]; + + for (k = 0; k < prop->count_enums; k++) + { + int r = -1; + + if (!strcmp(prop->enums[k].name, "rotate-0")) + r = ECORE_DRM_PLANE_ROTATION_NORMAL; + else if (!strcmp(prop->enums[k].name, "rotate-90")) + r = ECORE_DRM_PLANE_ROTATION_90; + else if (!strcmp(prop->enums[k].name, "rotate-180")) + r = ECORE_DRM_PLANE_ROTATION_180; + else if (!strcmp(prop->enums[k].name, "rotate-270")) + r = ECORE_DRM_PLANE_ROTATION_270; + else if (!strcmp(prop->enums[k].name, "reflect-x")) + r = ECORE_DRM_PLANE_ROTATION_REFLECT_X; + else if (!strcmp(prop->enums[k].name, "reflect-y")) + r = ECORE_DRM_PLANE_ROTATION_REFLECT_Y; + + if (r != -1) + { + eplane->supported_rotations |= r; + eplane->rotation_map[ffs(r)] = + 1 << prop->enums[k].value; + } + } + } + + drmModeFreeProperty(prop); + } + + output->planes = eina_list_append(output->planes, eplane); + +free_plane: + drmModeFreePlane(plane); + } +} + static Ecore_Drm_Output * _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnector *conn, int x, int y, Eina_Bool cloned) { @@ -467,6 +556,7 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto snprintf(name, sizeof(name), "%s-%d", type, conn->connector_type_id); eina_stringshare_replace(&output->name, name); + output->crtc_index = i; output->crtc_id = res->crtcs[i]; output->pipe = i; dev->crtc_allocator |= (1 << output->crtc_id); @@ -558,6 +648,8 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto (conn->count_modes == 0) ? ", built-in" : ""); } + _ecore_drm_output_planes_get(output); + return output; err: @@ -578,6 +670,7 @@ static void _ecore_drm_output_free(Ecore_Drm_Output *output) { Ecore_Drm_Output_Mode *mode; + Ecore_Drm_Plane *plane; /* check for valid output */ if (!output) return; @@ -605,6 +698,9 @@ _ecore_drm_output_free(Ecore_Drm_Output *output) EINA_LIST_FREE(output->modes, mode) free(mode); + EINA_LIST_FREE(output->planes, plane) + free(plane); + /* free strings */ if (output->name) eina_stringshare_del(output->name); if (output->model) eina_stringshare_del(output->model); @@ -789,95 +885,6 @@ _ecore_drm_output_render_disable(Ecore_Drm_Output *output) ecore_drm_output_dpms_set(output, DRM_MODE_DPMS_OFF); } -static void -_ecore_drm_output_planes_get(Ecore_Drm_Device *dev) -{ - drmModePlaneRes *pres; - unsigned int i = 0, j = 0; - int k = 0; - - pres = drmModeGetPlaneResources(dev->drm.fd); - if (!pres) return; - - for (; i < pres->count_planes; i++) - { - drmModePlane *plane; - drmModeObjectPropertiesPtr props; - int type = -1; - - plane = drmModeGetPlane(dev->drm.fd, pres->planes[i]); - if (!plane) continue; - - props = drmModeObjectGetProperties(dev->drm.fd, plane->plane_id, - DRM_MODE_OBJECT_PLANE); - if (!props) goto free_plane; - - DBG("Plane %u Properties:", plane->plane_id); - - for (j = 0; type == -1 && j < props->count_props; j++) - { - drmModePropertyPtr prop; - - prop = drmModeGetProperty(dev->drm.fd, props->props[j]); - if (!prop) continue; - - if (!strcmp(prop->name, "type")) - type = props->prop_values[j]; - - drmModeFreeProperty(prop); - } - - DBG("\tFormats:"); - for (j = 0; j < plane->count_formats; j++) - DBG("\t\t%4.4s", (char *)&plane->formats[j]); - - for (j = 0; j < props->count_props; j++ ) - { - drmModePropertyPtr prop; - - prop = drmModeGetProperty(dev->drm.fd, props->props[j]); - if (!prop) continue; - - DBG("\tProperty Name: %s", prop->name); - - if (prop->flags & DRM_MODE_PROP_RANGE) - { - DBG("\t\tRange Property"); - for (k = 0; k < prop->count_values; k++) - DBG("\t\t\t%"PRIu64, prop->values[k]); - } - if (prop->flags & DRM_MODE_PROP_ENUM) - { - DBG("\t\tEnum Property"); - for (k = 0; k < prop->count_enums; k++) - DBG("\t\t\t%s=%llu", prop->enums[k].name, - prop->enums[k].value); - } - if (prop->flags & DRM_MODE_PROP_BITMASK) - { - DBG("\t\tBitmask Property"); - for (k = 0; k < prop->count_enums; k++) - DBG("\t\t\t%s=0x%llx", prop->enums[k].name, - (1LL << prop->enums[k].value)); - } - - DBG("\t\tValue: %"PRIu64, props->prop_values[j]); - - drmModeFreeProperty(prop); - } - - DBG("\tCurrent Crtc: %d", plane->crtc_id); - DBG("\tPossible Crtcs: 0x%08x", plane->possible_crtcs); - - drmModeFreeObjectProperties(props); - -free_plane: - drmModeFreePlane(plane); - } - - drmModeFreePlaneResources(pres); -} - /* public functions */ /** @@ -950,9 +957,6 @@ next: drmModeFreeConnector(conn); } - /* TODO: Planes */ - _ecore_drm_output_planes_get(dev); - ret = EINA_TRUE; if (eina_list_count(dev->outputs) < 1) ret = EINA_FALSE;