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 ef070b7816113f2b9fc86a828711d498e2727dfe
Author: Christopher Michael <devilho...@comcast.net>
AuthorDate: Fri Sep 23 09:16:42 2022 -0400
ecore_drm2: Add code to fill Display Modes
---
src/lib/ecore_drm2/ecore_drm2_displays.c | 50 ++++++++++++++++++++++++++++++--
src/lib/ecore_drm2/ecore_drm2_private.h | 3 +-
2 files changed, 49 insertions(+), 4 deletions(-)
diff --git a/src/lib/ecore_drm2/ecore_drm2_displays.c b/src/lib/ecore_drm2/ecore_drm2_displays.c
index 7a22587ee4..b3ba81fbf6 100644
--- a/src/lib/ecore_drm2/ecore_drm2_displays.c
+++ b/src/lib/ecore_drm2/ecore_drm2_displays.c
@@ -120,6 +120,9 @@ _ecore_drm2_display_edid_get(Ecore_Drm2_Display *disp)
static void
_ecore_drm2_display_state_debug(Ecore_Drm2_Display *disp)
{
+ Eina_List *l = NULL;
+ Ecore_Drm2_Display_Mode *mode;
+
DBG("Display Atomic State Fill Complete");
DBG("\tName: %s", disp->name);
@@ -149,6 +152,16 @@ _ecore_drm2_display_state_debug(Ecore_Drm2_Display *disp)
DBG("\t\tPath: %s", disp->backlight.path);
}
+ EINA_LIST_FOREACH(disp->modes, l, mode)
+ {
+ DBG("\tAdded Mode: %dx%d@%.1f%s%s%s, %.1f MHz",
+ mode->width, mode->height, mode->refresh / 1000.0,
+ (mode->flags & DRM_MODE_TYPE_PREFERRED) ? ", preferred" : "",
+ (mode->flags & DRM_MODE_TYPE_DEFAULT) ? ", current" : "",
+ (disp->conn->drmConn->count_modes == 0) ? ", built-in" : "",
+ mode->info.clock / 1000.0);
+ }
+
/* DBG("\tCloned: %d", disp->cloned); */
DBG("\tPrimary: %d", disp->primary);
DBG("\tEnabled: %d", disp->enabled);
@@ -234,8 +247,8 @@ _ecore_drm2_display_mode_create(const drmModeModeInfo *info)
mode->width = info->hdisplay;
mode->height = info->vdisplay;
- refresh = (info->clock * 1000LL / info->htotal + info->vtotal / 2) /
- info->vtotal;
+ refresh = (info->clock * 1000000LL / info->htotal +
+ info->vtotal / 2) / info->vtotal;
if (info->flags & DRM_MODE_FLAG_INTERLACE)
refresh *= 2;
@@ -259,6 +272,8 @@ _ecore_drm2_display_modes_get(Ecore_Drm2_Display *disp)
int i = 0;
drmModeModeInfo crtc_mode;
Ecore_Drm2_Display_Mode *dmode;
+ Ecore_Drm2_Display_Mode *current = NULL, *pref = NULL, *best = NULL;
+ Eina_List *l = NULL;
memset(&crtc_mode, 0, sizeof(crtc_mode));
@@ -276,7 +291,36 @@ _ecore_drm2_display_modes_get(Ecore_Drm2_Display *disp)
disp->modes = eina_list_append(disp->modes, dmode);
}
- /* TODO: select current mode */
+ /* try to select current mode */
+ EINA_LIST_REVERSE_FOREACH(disp->modes, l, dmode)
+ {
+ if (!memcmp(&crtc_mode, &dmode->info, sizeof(crtc_mode)))
+ current = dmode;
+ if (dmode->flags & DRM_MODE_TYPE_PREFERRED)
+ pref = dmode;
+ best = dmode;
+ }
+
+ if ((!current) && (crtc_mode.clock != 0))
+ {
+ current = _ecore_drm2_display_mode_create(&crtc_mode);
+ if (!current) goto err;
+ disp->modes = eina_list_append(disp->modes, current);
+ }
+
+ if (current) disp->current_mode = current;
+ else if (pref) disp->current_mode = pref;
+ else if (best) disp->current_mode = best;
+
+ if (!disp->current_mode) goto err;
+
+ disp->current_mode->flags |= DRM_MODE_TYPE_DEFAULT;
+
+ return;
+
+err:
+ EINA_LIST_FREE(disp->modes, dmode)
+ free(dmode);
}
static void
diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h
index bed978255b..1565870969 100644
--- a/src/lib/ecore_drm2/ecore_drm2_private.h
+++ b/src/lib/ecore_drm2/ecore_drm2_private.h
@@ -168,7 +168,7 @@ struct _Ecore_Drm2_Plane
struct _Ecore_Drm2_Display_Mode
{
- uint32_t id, flags, refresh;
+ uint32_t flags, refresh;
int32_t width, height;
drmModeModeInfo info;
};
@@ -202,6 +202,7 @@ struct _Ecore_Drm2_Display
Ecore_Drm2_Connector *conn;
Eina_List *modes;
+ Ecore_Drm2_Display_Mode *current_mode;
Ecore_Thread *thread;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.