void *(*sym_drmModeObjectGetProperties)(int fd, uint32_t object_id, uint32_t object_type) = NULL;
void (*sym_drmModeFreeObjectProperties)(drmModeObjectPropertiesPtr ptr) = NULL;
int (*sym_drmModeCreatePropertyBlob)(int fd, const void *data, size_t size, uint32_t *id) = NULL;
-# ifdef HAVE_ATOMIC_DRM
void *(*sym_drmModeAtomicAlloc)(void) = NULL;
void (*sym_drmModeAtomicFree)(drmModeAtomicReqPtr req) = NULL;
int (*sym_drmModeAtomicAddProperty)(drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value) = NULL;
int (*sym_drmModeAtomicCommit)(int fd, drmModeAtomicReqPtr req, uint32_t flags, void *user_data) = NULL;
void (*sym_drmModeAtomicSetCursor)(drmModeAtomicReqPtr req, int cursor) = NULL;
int (*sym_drmModeAtomicMerge)(drmModeAtomicReqPtr base, drmModeAtomicReqPtr augment);
-# endif
void *(*sym_drmModeGetEncoder)(int fd, uint32_t encoder_id) = NULL;
void (*sym_drmModeFreeEncoder)(drmModeEncoderPtr ptr) = NULL;
void *(*sym_drmModeGetCrtc)(int fd, uint32_t crtcId) = NULL;
SYM(drm_lib, drmModeObjectGetProperties);
SYM(drm_lib, drmModeFreeObjectProperties);
SYM(drm_lib, drmModeCreatePropertyBlob);
-#ifdef HAVE_ATOMIC_DRM
SYM(drm_lib, drmModeAtomicAlloc);
SYM(drm_lib, drmModeAtomicFree);
SYM(drm_lib, drmModeAtomicAddProperty);
SYM(drm_lib, drmModeAtomicCommit);
SYM(drm_lib, drmModeAtomicSetCursor);
SYM(drm_lib, drmModeAtomicMerge);
-#endif
SYM(drm_lib, drmModeGetEncoder);
SYM(drm_lib, drmModeFreeEncoder);
SYM(drm_lib, drmModeGetCrtc);
# define DRM_CAP_DUMB_PREFER_SHADOW 0x4
#endif
-#ifdef HAVE_ATOMIC_DRM
-# include <sys/utsname.h>
-#endif
+#include <sys/utsname.h>
Eina_Bool _ecore_drm2_use_atomic = EINA_TRUE;
return ret;
}
-#ifdef HAVE_ATOMIC_DRM
# if 0
static Eina_Bool
_drm2_atomic_usable(int fd)
return ret;
}
# endif
-#endif
static void
_drm2_atomic_state_crtc_fill(Ecore_Drm2_Crtc_State *cstate, int fd)
DBG("Device Path: %s", device->path);
DBG("Device Fd: %d", device->fd);
-#ifdef HAVE_ATOMIC_DRM
# if 0
/* check that this system can do atomic */
_ecore_drm2_use_atomic = _drm2_atomic_usable(device->fd);
# endif
+
if (getenv("ECORE_DRM2_ATOMIC_DISABLE"))
_ecore_drm2_use_atomic = EINA_FALSE;
+
if (_ecore_drm2_use_atomic)
-#endif
{
if (sym_drmSetClientCap(device->fd,
DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) < 0)
if (output->release_cb) output->release_cb(output->release_data, s->fb);
_ecore_drm2_fb_deref(s->fb);
s->fb = NULL;
-#ifdef HAVE_ATOMIC_DRM
- if (s->atomic_req)
- sym_drmModeAtomicFree(s->atomic_req);
- s->atomic_req = NULL;
-#endif
+ if (_ecore_drm2_use_atomic)
+ {
+ if (s->atomic_req)
+ sym_drmModeAtomicFree(s->atomic_req);
+ s->atomic_req = NULL;
+ }
}
EAPI Eina_Bool
output->current.fb = output->pending.fb;
output->pending.fb = NULL;
-#ifdef HAVE_ATOMIC_DRM
- Eina_List *l, *ll;
- Ecore_Drm2_Plane *plane;
+ if (_ecore_drm2_use_atomic)
+ {
+ Eina_List *l, *ll;
+ Ecore_Drm2_Plane *plane;
- output->current.atomic_req = output->pending.atomic_req;
- output->pending.atomic_req = NULL;
+ output->current.atomic_req = output->pending.atomic_req;
+ output->pending.atomic_req = NULL;
- EINA_LIST_FOREACH_SAFE(output->planes, l, ll, plane)
- {
- if (!plane->dead) continue;
- output->planes = eina_list_remove_list(output->planes, l);
- free(plane);
+ EINA_LIST_FOREACH_SAFE(output->planes, l, ll, plane)
+ {
+ if (!plane->dead) continue;
+ output->planes = eina_list_remove_list(output->planes, l);
+ free(plane);
+ }
}
-#endif
EINA_LIST_FREE(output->fbs, fb)
_ecore_drm2_fb_deref(fb);
output->fbs = NULL;
Eina_Bool
_fb_atomic_flip_test(Ecore_Drm2_Output *output)
{
-#ifdef HAVE_ATOMIC_DRM
int ret = 0;
Eina_List *l;
Ecore_Drm2_Crtc_State *cstate;
uint32_t flags = DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_ATOMIC_ALLOW_MODESET |
DRM_MODE_ATOMIC_TEST_ONLY;
+ if (!_ecore_drm2_use_atomic) return EINA_FALSE;
+
req = sym_drmModeAtomicAlloc();
if (!req) return EINA_FALSE;
err:
DBG("Failed Atomic Test: %m");
sym_drmModeAtomicFree(req);
-#endif
return EINA_FALSE;
}
static int
_fb_atomic_flip(Ecore_Drm2_Output *output)
{
-#ifdef HAVE_ATOMIC_DRM
int res = 0;
uint32_t flags =
DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT |
DRM_MODE_ATOMIC_ALLOW_MODESET;
+ if (!_ecore_drm2_use_atomic) return -1;
+
/* If we have no req yet, we're flipping to current state.
* rebuild the current state in the prep state */
if (!output->prep.atomic_req) _fb_atomic_flip_test(output);
}
return 0;
-#endif
-
- return -1;
}
static int
}
output->pending.fb = output->prep.fb;
output->prep.fb = NULL;
-#ifdef HAVE_ATOMIC_DRM
- output->pending.atomic_req = output->prep.atomic_req;
- output->prep.atomic_req = NULL;
-#endif
+
+ if (_ecore_drm2_use_atomic)
+ {
+ output->pending.atomic_req = output->prep.atomic_req;
+ output->prep.atomic_req = NULL;
+ }
+
return 0;
}
return 0;
}
-//#ifdef HAVE_ATOMIC_DRM
static void
_output_edid_atomic_find(Ecore_Drm2_Output *output)
{
eina_stringshare_replace(&output->serial, output->edid.serial);
}
}
-//#endif
static void
_output_edid_find(Ecore_Drm2_Output *output, const drmModeConnector *conn)
eina_matrix4_inverse(&output->inverse, &output->matrix);
}
-//#ifdef HAVE_ATOMIC_DRM
static Ecore_Drm2_Crtc_State *
_atomic_state_crtc_duplicate(Ecore_Drm2_Crtc_State *state)
{
return states;
}
-//#endif
static Eina_Bool
_output_create(Ecore_Drm2_Device *dev, const drmModeRes *res, const drmModeConnector *conn, int x, int y, int *w, Eina_Bool cloned)
_output_modes_create(dev, output, conn);
-#ifdef HAVE_ATOMIC_DRM
if (_ecore_drm2_use_atomic)
_output_edid_atomic_find(output);
else
-#endif
_output_edid_find(output, conn);
if (output->connected) output->enabled = EINA_TRUE;
Ecore_Drm2_Plane *plane;
Ecore_Drm2_Plane_State *pstate;
-#ifdef HAVE_ATOMIC_DRM
if (_ecore_drm2_use_atomic)
{
if (output->prep.atomic_req)
sym_drmModeAtomicFree(output->prep.atomic_req);
}
-#endif
if (_ecore_drm2_use_atomic)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(output, NULL);
-#ifdef HAVE_ATOMIC_DRM
if (_ecore_drm2_use_atomic)
blob = output->conn_state->edid.data;
else
-#endif
{
EINA_SAFETY_ON_NULL_RETURN_VAL(output->edid.blob, NULL);
blob = output->edid.blob;
if (flags) *flags = mode->flags;
}
-#ifdef HAVE_ATOMIC_DRM
static Eina_Bool
_output_mode_atomic_set(Ecore_Drm2_Output *output, Ecore_Drm2_Output_Mode *mode)
{
sym_drmModeAtomicFree(req);
return ret;
}
-#endif
EAPI Eina_Bool
ecore_drm2_output_mode_set(Ecore_Drm2_Output *output, Ecore_Drm2_Output_Mode *mode, int x, int y)
output->y = y;
output->current_mode = mode;
-#ifdef HAVE_ATOMIC_DRM
if (_ecore_drm2_use_atomic)
ret = _output_mode_atomic_set(output, mode);
else
-#endif
{
if (mode)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
-#ifdef HAVE_ATOMIC_DRM
if (_ecore_drm2_use_atomic)
{
Eina_List *l;
err:
sym_drmModeAtomicFree(req);
}
-#endif
return ret;
}
typedef struct _Ecore_Drm2_Output_State
{
Ecore_Drm2_Fb *fb;
-# ifdef HAVE_ATOMIC_DRM
drmModeAtomicReq *atomic_req;
-# endif
} Ecore_Drm2_Output_State;
struct _Ecore_Drm2_Output
extern void *(*sym_drmModeObjectGetProperties)(int fd, uint32_t object_id, uint32_t object_type);
extern void (*sym_drmModeFreeObjectProperties)(drmModeObjectPropertiesPtr ptr);
extern int (*sym_drmModeCreatePropertyBlob)(int fd, const void *data, size_t size, uint32_t *id);
-# ifdef HAVE_ATOMIC_DRM
extern void *(*sym_drmModeAtomicAlloc)(void);
extern void (*sym_drmModeAtomicFree)(drmModeAtomicReqPtr req);
extern int (*sym_drmModeAtomicAddProperty)(drmModeAtomicReqPtr req, uint32_t object_id, uint32_t property_id, uint64_t value);
extern int (*sym_drmModeAtomicCommit)(int fd, drmModeAtomicReqPtr req, uint32_t flags, void *user_data);
extern void (*sym_drmModeAtomicSetCursor)(drmModeAtomicReqPtr req, int cursor);
extern int (*sym_drmModeAtomicMerge)(drmModeAtomicReqPtr base, drmModeAtomicReqPtr augment);
-# endif
extern void *(*sym_drmModeGetEncoder)(int fd, uint32_t encoder_id);
extern void (*sym_drmModeFreeEncoder)(drmModeEncoderPtr ptr);
extern void *(*sym_drmModeGetCrtc)(int fd, uint32_t crtcId);