Compare commits

...

2 Commits

2 changed files with 66 additions and 30 deletions

View File

@ -4,6 +4,25 @@
# define DRM_MODE_CONNECTOR_WRITEBACK 18 # define DRM_MODE_CONNECTOR_WRITEBACK 18
#endif #endif
static Eina_Thread_Queue *thq = NULL;
typedef struct
{
Eina_Thread_Queue_Msg head;
Ecore_Drm2_Thread_Op_Code code;
} Thread_Msg;
static void
_ecore_drm2_connector_state_thread_send(Ecore_Drm2_Thread_Op_Code code)
{
Thread_Msg *msg;
void *ref;
msg = eina_thread_queue_send(thq, sizeof(Thread_Msg), &ref);
msg->code = code;
eina_thread_queue_send_done(thq, ref);
}
static void static void
_ecore_drm2_connector_state_debug(Ecore_Drm2_Connector *conn) _ecore_drm2_connector_state_debug(Ecore_Drm2_Connector *conn)
{ {
@ -106,39 +125,56 @@ cont:
} }
sym_drmModeFreeObjectProperties(oprops); sym_drmModeFreeObjectProperties(oprops);
/* send message to thread for debug printing connector state */
_ecore_drm2_connector_state_thread_send(ECORE_DRM2_THREAD_CODE_DEBUG);
} }
static void static void
_ecore_drm2_connector_state_thread(void *data, Ecore_Thread *thread EINA_UNUSED) _ecore_drm2_connector_state_commit(Ecore_Drm2_Connector *conn EINA_UNUSED)
{
DBG("Connector State Commit");
}
static void
_ecore_drm2_connector_state_thread(void *data, Ecore_Thread *thread)
{ {
Ecore_Drm2_Connector *conn; Ecore_Drm2_Connector *conn;
Thread_Msg *msg;
void *ref;
conn = data; conn = data;
if (!conn->state)
_ecore_drm2_connector_state_fill(conn); eina_thread_name_set(eina_thread_self(), "Ecore-drm2-connector");
else
while (!ecore_thread_check(thread))
{ {
/* TODO: update atomic state for commit */ msg = eina_thread_queue_wait(thq, &ref);
if (msg)
{
switch (msg->code)
{
case ECORE_DRM2_THREAD_CODE_FILL:
_ecore_drm2_connector_state_fill(conn);
break;
case ECORE_DRM2_THREAD_CODE_COMMIT:
_ecore_drm2_connector_state_commit(conn);
break;
case ECORE_DRM2_THREAD_CODE_DEBUG:
_ecore_drm2_connector_state_debug(conn);
break;
default:
break;
}
eina_thread_queue_wait_done(thq, ref);
}
} }
} }
static void static void
_ecore_drm2_connector_state_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED) _ecore_drm2_connector_state_thread_notify(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED, void *msg)
{ {
Ecore_Drm2_Connector *conn; free(msg);
conn = data;
/* conn->thread = NULL; */
_ecore_drm2_connector_state_debug(conn);
}
static void
_ecore_drm2_connector_state_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
{
Ecore_Drm2_Connector *conn;
conn = data;
conn->thread = NULL;
} }
static Ecore_Drm2_Connector * static Ecore_Drm2_Connector *
@ -179,6 +215,8 @@ _ecore_drm2_connectors_create(Ecore_Drm2_Device *dev)
/* TOOD: set dev->min/max width & height ? */ /* TOOD: set dev->min/max width & height ? */
thq = eina_thread_queue_new();
for (; i < res->count_connectors; i++) for (; i < res->count_connectors; i++)
{ {
uint32_t conn_id; uint32_t conn_id;
@ -196,10 +234,8 @@ _ecore_drm2_connectors_create(Ecore_Drm2_Device *dev)
/* NB: Use an explicit thread to fill crtc atomic state */ /* NB: Use an explicit thread to fill crtc atomic state */
c->thread = c->thread =
ecore_thread_feedback_run(_ecore_drm2_connector_state_thread, ecore_thread_feedback_run(_ecore_drm2_connector_state_thread,
NULL, //_ecore_drm2_connector_state_thread_notify, _ecore_drm2_connector_state_thread_notify,
_ecore_drm2_connector_state_thread_end, NULL, NULL, c, EINA_TRUE);
_ecore_drm2_connector_state_thread_cancel,
c, EINA_TRUE);
} }
@ -225,4 +261,7 @@ _ecore_drm2_connectors_destroy(Ecore_Drm2_Device *dev)
free(conn->state); free(conn->state);
free(conn); free(conn);
} }
eina_thread_queue_free(thq);
thq = NULL;
} }

View File

@ -181,7 +181,7 @@ _ecore_drm2_crtc_create(Ecore_Drm2_Device *dev, drmModeCrtcPtr dcrtc, uint32_t p
if (!crtc) if (!crtc)
{ {
ERR("Could not allocate space for CRTC"); ERR("Could not allocate space for CRTC");
goto err; return NULL;
} }
crtc->id = dcrtc->crtc_id; crtc->id = dcrtc->crtc_id;
@ -193,10 +193,6 @@ _ecore_drm2_crtc_create(Ecore_Drm2_Device *dev, drmModeCrtcPtr dcrtc, uint32_t p
dev->crtcs = eina_list_append(dev->crtcs, crtc); dev->crtcs = eina_list_append(dev->crtcs, crtc);
return crtc; return crtc;
err:
free(crtc);
return NULL;
} }
Eina_Bool Eina_Bool
@ -211,6 +207,8 @@ _ecore_drm2_crtcs_create(Ecore_Drm2_Device *dev)
res = sym_drmModeGetResources(dev->fd); res = sym_drmModeGetResources(dev->fd);
if (!res) return EINA_FALSE; if (!res) return EINA_FALSE;
thq = eina_thread_queue_new();
for (; i < res->count_crtcs; i++) for (; i < res->count_crtcs; i++)
{ {
/* try to get this crtc from drm */ /* try to get this crtc from drm */
@ -221,7 +219,6 @@ _ecore_drm2_crtcs_create(Ecore_Drm2_Device *dev)
if (!crtc) goto err; if (!crtc) goto err;
/* NB: Use an explicit thread to fill crtc atomic state */ /* NB: Use an explicit thread to fill crtc atomic state */
thq = eina_thread_queue_new();
crtc->thread = crtc->thread =
ecore_thread_feedback_run(_ecore_drm2_crtc_state_thread, ecore_thread_feedback_run(_ecore_drm2_crtc_state_thread,
_ecore_drm2_crtc_state_thread_notify, _ecore_drm2_crtc_state_thread_notify,