From e90eab494007eab77408ec4eb62cf851e19911bb Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Sun, 21 Aug 2022 11:12:45 -0400 Subject: [PATCH] ecore-drm2: Add structures for Atomic Modesetting support --- src/lib/ecore_drm2/ecore_drm2_private.h | 112 +++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h index 8b53561174..fb73b72e6c 100644 --- a/src/lib/ecore_drm2/ecore_drm2_private.h +++ b/src/lib/ecore_drm2/ecore_drm2_private.h @@ -31,7 +31,7 @@ /* define necessary vars/macros for ecore_drm2 log domain */ extern int _ecore_drm2_log_dom; -/* define externval variable for atomic */ +/* define external variable for atomic usage */ extern Eina_Bool _ecore_drm2_atomic_use; # ifdef ECORE_DRM2_DEFAULT_LOG_COLOR @@ -64,12 +64,105 @@ extern Eina_Bool _ecore_drm2_atomic_use; # endif # define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_drm2_log_dom, __VA_ARGS__) -/* internal structures */ +/* internal structures (not exposed) */ +typedef struct _Ecore_Drm2_Atomic_Blob +{ + uint32_t id, value; + size_t len; + void *data; +} Ecore_Drm2_Atomic_Blob; + +typedef struct _Ecore_Drm2_Atomic_Property +{ + uint32_t id; + uint64_t value; +} Ecore_Drm2_Atomic_Property; + +typedef struct _Ecore_Drm2_Connector_State +{ + uint32_t obj_id; + Ecore_Drm2_Atomic_Property crtc; + Ecore_Drm2_Atomic_Property dpms; + Ecore_Drm2_Atomic_Property aspect; + Ecore_Drm2_Atomic_Property scaling; + Ecore_Drm2_Atomic_Blob edid; + + /* TODO ?? */ + /* Ecore_Drm2_Atomic_Property link-status; */ + /* Ecore_Drm2_Atomic_Property non-desktop; */ + /* Ecore_Drm2_Atomic_Property TILE; */ + /* Ecore_Drm2_Atomic_Property underscan; */ + /* Ecore_Drm2_Atomic_Property underscan hborder; */ + /* Ecore_Drm2_Atomic_Property underscan vborder; */ + /* Ecore_Drm2_Atomic_Property max bpc; */ + /* Ecore_Drm2_Atomic_Property HDR_OUTPUT_METADATA; */ + /* Ecore_Drm2_Atomic_Property vrr_capable; */ + /* Ecore_Drm2_Atomic_Property Content Protection; */ + /* Ecore_Drm2_Atomic_Property HDCP Content Type; */ + /* Ecore_Drm2_Atomic_Property subconnector; */ + +} Ecore_Drm2_Connector_State; + +typedef struct _Ecore_Drm2_Crtc_State +{ + uint32_t obj_id; + int index; + Ecore_Drm2_Atomic_Property active; + Ecore_Drm2_Atomic_Blob mode; + + /* TODO ?? */ + /* Ecore_Drm2_Atomic_Property background; */ + /* Ecore_Drm2_Atomic_Property OUT_FENCE_PTR; */ + /* Ecore_Drm2_Atomic_Property VRR_ENABLED; */ + /* Ecore_Drm2_Atomic_Property DEGAMMA_LUT; */ + /* Ecore_Drm2_Atomic_Property DEGAMMA_LUT_SIZE; */ + /* Ecore_Drm2_Atomic_Property CTM; */ + /* Ecore_Drm2_Atomic_Property GAMMA_LUT; */ + /* Ecore_Drm2_Atomic_Property GAMMA_LUT_SIZE; */ +} Ecore_Drm2_Crtc_State; + +typedef struct _Ecore_Drm2_Plane_State +{ + uint32_t obj_id, mask; + Ecore_Drm2_Atomic_Property type; + Ecore_Drm2_Atomic_Property cid, fid; + Ecore_Drm2_Atomic_Property sx, sy, sw, sh; + Ecore_Drm2_Atomic_Property cx, cy, cw, ch; + Ecore_Drm2_Atomic_Property rotation; + + /* NB: these are not part of an atomic state, but we store these here + * so that we do not have to refetch properties when iterating planes */ + uint32_t rotation_map[6]; + uint32_t supported_rotations; + + uint32_t num_formats; + uint32_t *formats; + + Eina_Bool in_use; + + /* TODO ?? */ + /* Ecore_Drm2_Atomic_Property IN_FENCE_FD; */ + /* Ecore_Drm2_Atomic_Property IN_FORMATS; */ + /* Ecore_Drm2_Atomic_Property COLOR_ENCODING; */ + /* Ecore_Drm2_Atomic_Property COLOR_RANGE; */ +} Ecore_Drm2_Plane_State; + +typedef struct _Ecore_Drm2_Atomic_State +{ + int crtcs, conns, planes; + Ecore_Drm2_Crtc_State *crtc_states; + Ecore_Drm2_Connector_State *conn_states; + Ecore_Drm2_Plane_State *plane_states; +} Ecore_Drm2_Atomic_State; + +/* opaque API structures */ struct _Ecore_Drm2_Device { Elput_Manager *em; int fd; + + Ecore_Drm2_Atomic_State *atomic_state; }; struct _Ecore_Drm2_Output @@ -77,9 +170,24 @@ struct _Ecore_Drm2_Output Eina_Stringshare *name, *make, *model, *serial; }; +/* internal function prototypes */ +Eina_Bool _ecore_drm2_atomic_state_fill(Ecore_Drm2_Atomic_State *state, int fd); + /* external drm function prototypes (for dlopen) */ extern void *(*sym_drmModeGetResources)(int fd); extern void (*sym_drmModeFreeResources)(drmModeResPtr ptr); extern int (*sym_drmSetClientCap)(int fd, uint64_t capability, uint64_t value); +extern void *(*sym_drmModeGetProperty)(int fd, uint32_t propertyId); +extern void (*sym_drmModeFreeProperty)(drmModePropertyPtr ptr); +extern void *(*sym_drmModeGetPropertyBlob)(int fd, uint32_t blob_id); +extern void (*sym_drmModeFreePropertyBlob)(drmModePropertyBlobPtr ptr); +extern int (*sym_drmModeCreatePropertyBlob)(int fd, const void *data, size_t size, uint32_t *id); +extern int (*sym_drmModeDestroyPropertyBlob)(int fd, uint32_t id); +extern void *(*sym_drmModeObjectGetProperties)(int fd, uint32_t object_id, uint32_t object_type); +extern void (*sym_drmModeFreeObjectProperties)(drmModeObjectPropertiesPtr ptr); +extern void *(*sym_drmModeGetPlaneResources)(int fd); +extern void (*sym_drmModeFreePlaneResources)(drmModePlaneResPtr ptr); +extern void *(*sym_drmModeGetPlane)(int fd, uint32_t plane_id); +extern void (*sym_drmModeFreePlane)(drmModePlanePtr ptr); #endif