forked from enlightenment/efl
ecore_drm: Added internal function for drm output updates when device is hotplug
Summary: Added internal function _ecore_drm_update_outputs which will update the outputs if the drm device is hotplug @fix Signed-off-by: vivek <vivek.ellur@samsung.com> Reviewers: devilhorns Reviewed By: devilhorns Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1565
This commit is contained in:
parent
5a13e97c1b
commit
6e5a4a7156
|
@ -84,6 +84,7 @@ struct _Ecore_Drm_Device
|
||||||
unsigned int crtc_count;
|
unsigned int crtc_count;
|
||||||
unsigned int *crtcs;
|
unsigned int *crtcs;
|
||||||
unsigned int crtc_allocator;
|
unsigned int crtc_allocator;
|
||||||
|
unsigned int conn_allocator;
|
||||||
|
|
||||||
Eina_List *seats;
|
Eina_List *seats;
|
||||||
Eina_List *inputs;
|
Eina_List *inputs;
|
||||||
|
|
|
@ -335,6 +335,7 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto
|
||||||
output->crtc_id = res->crtcs[i];
|
output->crtc_id = res->crtcs[i];
|
||||||
dev->crtc_allocator |= (1 << output->crtc_id);
|
dev->crtc_allocator |= (1 << output->crtc_id);
|
||||||
output->conn_id = conn->connector_id;
|
output->conn_id = conn->connector_id;
|
||||||
|
dev->conn_allocator |= (1 << output->conn_id);
|
||||||
output->crtc = drmModeGetCrtc(dev->drm.fd, output->crtc_id);
|
output->crtc = drmModeGetCrtc(dev->drm.fd, output->crtc_id);
|
||||||
|
|
||||||
memset(&mode, 0, sizeof(mode));
|
memset(&mode, 0, sizeof(mode));
|
||||||
|
@ -391,6 +392,7 @@ mode_err:
|
||||||
free(mode);
|
free(mode);
|
||||||
drmModeFreeCrtc(output->crtc);
|
drmModeFreeCrtc(output->crtc);
|
||||||
dev->crtc_allocator &= ~(1 << output->crtc_id);
|
dev->crtc_allocator &= ~(1 << output->crtc_id);
|
||||||
|
dev->conn_allocator &= ~(1 << output->conn_id);
|
||||||
free(output);
|
free(output);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -493,6 +495,93 @@ _ecore_drm_output_device_is_hotplug(Ecore_Drm_Output *output)
|
||||||
return (strcmp(val, "1") == 0);
|
return (strcmp(val, "1") == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_drm_update_outputs(Ecore_Drm_Output *output)
|
||||||
|
{
|
||||||
|
Ecore_Drm_Output *new_output;
|
||||||
|
drmModeConnector *connector;
|
||||||
|
drmModeRes *res;
|
||||||
|
drmModeCrtc *crtc;
|
||||||
|
int x = 0, y = 0;
|
||||||
|
uint32_t connected = 0, disconnects = 0;
|
||||||
|
int i;
|
||||||
|
Eina_List *l;
|
||||||
|
|
||||||
|
res = drmModeGetResources(output->drm_fd);
|
||||||
|
if (!res)
|
||||||
|
{
|
||||||
|
ERR("Could not get resources for drm card: %m");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < res->count_connectors; i++)
|
||||||
|
{
|
||||||
|
int connector_id = res->connectors[i];
|
||||||
|
|
||||||
|
connector = drmModeGetConnector(output->drm_fd, connector_id);
|
||||||
|
if (connector == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (connector->connection != DRM_MODE_CONNECTED)
|
||||||
|
{
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
connected |= (1 << connector_id);
|
||||||
|
|
||||||
|
if (!(output->dev->conn_allocator & (1 << connector_id)))
|
||||||
|
{
|
||||||
|
drmModeEncoder *enc;
|
||||||
|
|
||||||
|
if (!(new_output = _ecore_drm_output_create(output->dev, res, connector, x, y)))
|
||||||
|
{
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
_ecore_drm_output_free(new_output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_output->drm_fd = output->dev->drm.fd;
|
||||||
|
|
||||||
|
if (!(enc = drmModeGetEncoder(new_output->dev->drm.fd, connector->encoder_id)))
|
||||||
|
{
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
_ecore_drm_output_free(new_output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(crtc = drmModeGetCrtc(new_output->dev->drm.fd, enc->crtc_id)))
|
||||||
|
{
|
||||||
|
drmModeFreeEncoder(enc);
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
_ecore_drm_output_free(new_output);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
x += crtc->width;
|
||||||
|
|
||||||
|
drmModeFreeCrtc(crtc);
|
||||||
|
drmModeFreeEncoder(enc);
|
||||||
|
|
||||||
|
output->dev->outputs = eina_list_append(output->dev->outputs, new_output);
|
||||||
|
}
|
||||||
|
drmModeFreeConnector(connector);
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnects = output->dev->conn_allocator & ~connected;
|
||||||
|
if (disconnects)
|
||||||
|
{
|
||||||
|
EINA_LIST_FOREACH(output->dev->outputs, l, new_output)
|
||||||
|
{
|
||||||
|
if (disconnects & (1 << new_output->conn_id))
|
||||||
|
{
|
||||||
|
disconnects &= ~(1 << new_output->conn_id);
|
||||||
|
ecore_drm_output_free(new_output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ecore_drm_output_event(const char *device EINA_UNUSED, Eeze_Udev_Event event EINA_UNUSED, void *data, Eeze_Udev_Watch *watch EINA_UNUSED)
|
_ecore_drm_output_event(const char *device EINA_UNUSED, Eeze_Udev_Event event EINA_UNUSED, void *data, Eeze_Udev_Watch *watch EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -502,7 +591,7 @@ _ecore_drm_output_event(const char *device EINA_UNUSED, Eeze_Udev_Event event EI
|
||||||
|
|
||||||
if (_ecore_drm_output_device_is_hotplug(output))
|
if (_ecore_drm_output_device_is_hotplug(output))
|
||||||
{
|
{
|
||||||
DBG("Output Hotplug Event");
|
_ecore_drm_update_outputs(output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue