This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch devs/devilhorns/apos
in repository efl.

View the commit online.

commit 192597cb688c4fc7ae4dba3e1daa2167e5234d88
Author: Christopher Michael <devilho...@comcast.net>
AuthorDate: Thu Aug 7 08:39:24 2025 -0500

    ecore_drm2: Assign a crtc to the display when it gets created
---
 src/lib/ecore_drm2/ecore_drm2_displays.c | 89 ++++++++++++++++++++++++++++----
 1 file changed, 78 insertions(+), 11 deletions(-)

diff --git a/src/lib/ecore_drm2/ecore_drm2_displays.c b/src/lib/ecore_drm2/ecore_drm2_displays.c
index 3a7ef3173b..132c68fb69 100644
--- a/src/lib/ecore_drm2/ecore_drm2_displays.c
+++ b/src/lib/ecore_drm2/ecore_drm2_displays.c
@@ -551,13 +551,83 @@ _ecore_drm2_display_msc_update(Ecore_Drm2_Display *disp, unsigned int sequence)
    disp->msc = ((uint64_t)mh << 32) + sequence;
 }
 
+static Ecore_Drm2_Crtc *
+_ecore_drm2_possible_crtcs_find(Ecore_Drm2_Device *dev, uint32_t enc_crtc_id)
+{
+   Ecore_Drm2_Crtc *crtc;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(dev->crtcs, l, crtc)
+     {
+        if (crtc->id == enc_crtc_id)
+          return crtc;
+     }
+
+   return NULL;
+}
+
+Ecore_Drm2_Crtc *
+_ecore_drm2_displays_crtc_find(Ecore_Drm2_Display *disp, Ecore_Drm2_Connector *conn, uint32_t enc_crtc_id)
+{
+   Ecore_Drm2_Crtc *crtc, *ecrtcs[32], *bcrtc, *fcrtc;
+   uint32_t pcrtcs = 0xffffffff;
+   Eina_Bool match = EINA_FALSE;
+   Eina_List  *l;
+   unsigned int n = 0, i = 0;
+
+   EINA_LIST_FOREACH(disp->dev->crtcs, l, crtc)
+     {
+        pcrtcs &= _ecore_drm2_connectors_possible_crtcs_get(conn);
+
+        if (enc_crtc_id > 0 && n < EINA_C_ARRAY_LENGTH(ecrtcs))
+          ecrtcs[n++] = _ecore_drm2_possible_crtcs_find(disp->dev, enc_crtc_id);
+     }
+
+   EINA_LIST_FOREACH(disp->dev->crtcs, l, crtc)
+     {
+        if (!(pcrtcs & (1 << crtc->pipe)))
+          continue;
+
+        if (crtc->in_use) continue;
+
+        for (i = 0; i < n; i++)
+          {
+             if (ecrtcs[i] == crtc)
+               return crtc;
+          }
+
+        match = EINA_FALSE;
+        if (crtc->id == enc_crtc_id)
+          {
+             match = EINA_TRUE;
+             break;
+          }
+
+        if (!match) bcrtc = crtc;
+        fcrtc = crtc;
+     }
+
+   if (bcrtc) return bcrtc;
+   if (fcrtc) return fcrtc;
+
+   for (i = 0; i < n; i++)
+     {
+        crtc = ecrtcs[i];
+        if (!crtc->in_use) return crtc;
+     }
+
+   EINA_LIST_FOREACH(disp->dev->crtcs, l, crtc)
+     if (!crtc->in_use) return crtc;
+
+   return NULL;
+}
+
 Eina_Bool
 _ecore_drm2_displays_create(Ecore_Drm2_Device *dev)
 {
    Ecore_Drm2_Display *disp;
    Ecore_Drm2_Connector *c;
-   Ecore_Drm2_Crtc *crtc;
-   Eina_List *l = NULL, *ll = NULL;
+   Eina_List *l = NULL;
 
    thq = eina_thread_queue_new();
 
@@ -586,21 +656,18 @@ _ecore_drm2_displays_create(Ecore_Drm2_Device *dev)
 
         disp->dev = dev;
 
-        /* try to find crtc matching dcrtc->crtc_id and assign to display */
-        EINA_LIST_FOREACH(dev->crtcs, ll, crtc)
-          {
-             if (crtc->id == dcrtc->crtc_id)
-               {
-                  disp->crtc = crtc;
-                  break;
-               }
-          }
+        disp->crtc = _ecore_drm2_displays_crtc_find(disp, c, encoder->crtc_id);
+        if (disp->crtc) disp->crtc->in_use = EINA_TRUE;
 
         sym_drmModeFreeCrtc(dcrtc);
 
         /* disp->fd = dev->fd; */
         disp->conn = c;
 
+        /* TODO: init planes */
+        /* TODO: init gamma size */
+        /* TODO: init backlight */
+
         /* append this display to the list */
         dev->displays = eina_list_append(dev->displays, disp);
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to