From d8e6231f960821b0e98a69207935c23cea91d7e0 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Tue, 21 Nov 2023 09:07:53 -0500 Subject: [PATCH] ecore_drm2: Add API function to return if a possible crtc --- src/lib/ecore_drm2/Ecore_Drm2.h | 1 + src/lib/ecore_drm2/ecore_drm2_displays.c | 32 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/lib/ecore_drm2/Ecore_Drm2.h b/src/lib/ecore_drm2/Ecore_Drm2.h index fa63e4ea3a..fff06679cb 100644 --- a/src/lib/ecore_drm2/Ecore_Drm2.h +++ b/src/lib/ecore_drm2/Ecore_Drm2.h @@ -81,6 +81,7 @@ EAPI int ecore_drm2_display_rotation_get(Ecore_Drm2_Display *disp); EAPI void ecore_drm2_display_rotation_set(Ecore_Drm2_Display *disp, uint64_t rotation); EAPI void ecore_drm2_display_mode_set(Ecore_Drm2_Display *disp, Ecore_Drm2_Display_Mode *mode, int x, int y); EAPI Ecore_Drm2_Crtc *ecore_drm2_display_crtc_get(Ecore_Drm2_Display *disp); +EAPI Eina_Bool ecore_drm2_display_possible_crtc_get(Ecore_Drm2_Display *disp, Ecore_Drm2_Crtc *crtc); # endif diff --git a/src/lib/ecore_drm2/ecore_drm2_displays.c b/src/lib/ecore_drm2/ecore_drm2_displays.c index f8ff84dd4d..4e5161e8a9 100644 --- a/src/lib/ecore_drm2/ecore_drm2_displays.c +++ b/src/lib/ecore_drm2/ecore_drm2_displays.c @@ -883,3 +883,35 @@ ecore_drm2_display_crtc_get(Ecore_Drm2_Display *disp) EINA_SAFETY_ON_NULL_RETURN_VAL(disp, NULL); return disp->crtc; } + +EAPI Eina_Bool +ecore_drm2_display_possible_crtc_get(Ecore_Drm2_Display *disp, Ecore_Drm2_Crtc *crtc) +{ + drmModeConnector *conn; + drmModeEncoder *enc; + int i = 0; + Eina_Bool ret = EINA_FALSE; + + EINA_SAFETY_ON_NULL_RETURN_VAL(disp, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(disp->conn, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(disp->conn->drmConn, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(crtc, EINA_FALSE); + + conn = disp->conn->drmConn; + for (; i < conn->count_encoders; i++) + { + enc = sym_drmModeGetEncoder(disp->conn->fd, conn->encoders[i]); + if (!enc) continue; + + if (enc->crtc_id != crtc->id) goto next; + + if (enc->possible_crtcs & (1 << crtc->pipe)) + ret = EINA_TRUE; + +next: + sym_drmModeFreeEncoder(enc); + if (ret) break; + } + + return ret; +}