ecore_drm2: Remove connector bitfield

This is unreliable - there's no reason to expect these connector ids
will be low enough to sensibly store in a bit field.
This commit is contained in:
Derek Foreman 2017-08-03 13:42:32 -05:00
parent 2f9cb33f0b
commit 9b9d704292
2 changed files with 45 additions and 43 deletions

View File

@ -771,7 +771,6 @@ _output_create(Ecore_Drm2_Device *dev, const drmModeRes *res, const drmModeConne
output->enabled = EINA_FALSE;
}
dev->alloc.conn |= (1 << output->conn_id);
dev->outputs = eina_list_append(dev->outputs, output);
_output_debug(output, conn);
@ -784,17 +783,38 @@ _output_create(Ecore_Drm2_Device *dev, const drmModeRes *res, const drmModeConne
return EINA_TRUE;
}
static Ecore_Drm2_Output *
_output_find_by_con(Ecore_Drm2_Device *dev, uint32_t id)
{
Ecore_Drm2_Output *output;
Eina_List *l;
EINA_LIST_FOREACH(dev->outputs, l, output)
if (output->conn_id == id) return output;
return NULL;
}
static void
_outputs_update(Ecore_Drm2_Device *dev)
{
Ecore_Drm2_Output *output;
Eina_List *l, *ll;
drmModeRes *res;
drmModeConnector *conn;
uint32_t connected = 0, disconnected = 0;
uint32_t *connected;
int i = 0, x = 0, y = 0;
res = sym_drmModeGetResources(dev->fd);
if (!res) return;
connected = calloc(res->count_connectors, sizeof(uint32_t));
if (!connected)
{
sym_drmModeFreeResources(res);
return;
}
for (i = 0; i < res->count_connectors; i++)
{
conn = sym_drmModeGetConnector(dev->fd, res->connectors[i]);
@ -802,9 +822,8 @@ _outputs_update(Ecore_Drm2_Device *dev)
if (conn->connection != DRM_MODE_CONNECTED) goto next;
connected |= (1 << res->connectors[i]);
if (!(dev->alloc.conn & (1 << res->connectors[i])))
connected[i] = res->connectors[i];
if (!_output_find_by_con(dev, res->connectors[i]))
{
if (dev->outputs)
{
@ -827,41 +846,31 @@ next:
sym_drmModeFreeResources(res);
disconnected = (dev->alloc.conn & ~connected);
if (disconnected)
EINA_LIST_FOREACH_SAFE(dev->outputs, l, ll, output)
{
Ecore_Drm2_Output *output;
Eina_List *l;
Eina_Bool disconnected = EINA_TRUE;
EINA_LIST_FOREACH(dev->outputs, l, output)
for (i = 0; i < res->count_connectors; i++)
if (connected[i] == output->conn_id)
{
disconnected = EINA_FALSE;
break;
}
if (disconnected)
{
if (disconnected & (1 << output->conn_id))
{
disconnected &= ~(1 << output->conn_id);
output->connected = EINA_FALSE;
output->enabled = EINA_FALSE;
_output_event_send(output);
}
}
}
connected = (dev->alloc.conn & connected);
if (connected)
{
Ecore_Drm2_Output *output;
Eina_List *l;
EINA_LIST_FOREACH(dev->outputs, l, output)
{
if (connected & (1 << output->conn_id))
{
connected &= ~(1 << output->conn_id);
output->connected = EINA_TRUE;
output->enabled = EINA_TRUE;
_output_event_send(output);
}
output->connected = EINA_FALSE;
output->enabled = EINA_FALSE;
_output_event_send(output);
}
else
{
output->connected = EINA_TRUE;
output->enabled = EINA_TRUE;
_output_event_send(output);
}
}
free(connected);
}
static void
@ -874,7 +883,7 @@ _cb_output_event(const char *device EINA_UNUSED, Eeze_Udev_Event event EINA_UNUS
}
static void
_output_destroy(Ecore_Drm2_Device *dev, Ecore_Drm2_Output *output)
_output_destroy(Ecore_Drm2_Device *dev EINA_UNUSED, Ecore_Drm2_Output *output)
{
Ecore_Drm2_Output_Mode *mode;
Ecore_Drm2_Plane *plane;
@ -905,8 +914,6 @@ _output_destroy(Ecore_Drm2_Device *dev, Ecore_Drm2_Output *output)
free(mode);
}
dev->alloc.conn &= ~(1 << output->conn_id);
eina_stringshare_del(output->backlight.path);
eina_stringshare_del(output->name);
eina_stringshare_del(output->make);

View File

@ -274,11 +274,6 @@ struct _Ecore_Drm2_Device
int num_crtcs;
uint32_t *crtcs;
struct
{
uint32_t conn;
} alloc;
struct
{
uint32_t width, height;