ecore_drm2: Add code to fill Display Modes
This commit is contained in:
parent
eb4940d94e
commit
ef070b7816
|
@ -120,6 +120,9 @@ _ecore_drm2_display_edid_get(Ecore_Drm2_Display *disp)
|
||||||
static void
|
static void
|
||||||
_ecore_drm2_display_state_debug(Ecore_Drm2_Display *disp)
|
_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("Display Atomic State Fill Complete");
|
||||||
|
|
||||||
DBG("\tName: %s", disp->name);
|
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);
|
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("\tCloned: %d", disp->cloned); */
|
||||||
DBG("\tPrimary: %d", disp->primary);
|
DBG("\tPrimary: %d", disp->primary);
|
||||||
DBG("\tEnabled: %d", disp->enabled);
|
DBG("\tEnabled: %d", disp->enabled);
|
||||||
|
@ -234,8 +247,8 @@ _ecore_drm2_display_mode_create(const drmModeModeInfo *info)
|
||||||
mode->width = info->hdisplay;
|
mode->width = info->hdisplay;
|
||||||
mode->height = info->vdisplay;
|
mode->height = info->vdisplay;
|
||||||
|
|
||||||
refresh = (info->clock * 1000LL / info->htotal + info->vtotal / 2) /
|
refresh = (info->clock * 1000000LL / info->htotal +
|
||||||
info->vtotal;
|
info->vtotal / 2) / info->vtotal;
|
||||||
|
|
||||||
if (info->flags & DRM_MODE_FLAG_INTERLACE)
|
if (info->flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
refresh *= 2;
|
refresh *= 2;
|
||||||
|
@ -259,6 +272,8 @@ _ecore_drm2_display_modes_get(Ecore_Drm2_Display *disp)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
drmModeModeInfo crtc_mode;
|
drmModeModeInfo crtc_mode;
|
||||||
Ecore_Drm2_Display_Mode *dmode;
|
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));
|
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);
|
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
|
static void
|
||||||
|
|
|
@ -168,7 +168,7 @@ struct _Ecore_Drm2_Plane
|
||||||
|
|
||||||
struct _Ecore_Drm2_Display_Mode
|
struct _Ecore_Drm2_Display_Mode
|
||||||
{
|
{
|
||||||
uint32_t id, flags, refresh;
|
uint32_t flags, refresh;
|
||||||
int32_t width, height;
|
int32_t width, height;
|
||||||
drmModeModeInfo info;
|
drmModeModeInfo info;
|
||||||
};
|
};
|
||||||
|
@ -202,6 +202,7 @@ struct _Ecore_Drm2_Display
|
||||||
Ecore_Drm2_Connector *conn;
|
Ecore_Drm2_Connector *conn;
|
||||||
|
|
||||||
Eina_List *modes;
|
Eina_List *modes;
|
||||||
|
Ecore_Drm2_Display_Mode *current_mode;
|
||||||
|
|
||||||
Ecore_Thread *thread;
|
Ecore_Thread *thread;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue