hmmmm. i'm reading this code and it seems broken. let's start with the simple one.
1) ecore_evas_wayland_common.c: this shouldnt MESS with manual render at all. at most it should just have if (wdata->reset_pending) return 0; added to the top "not going to do this" section in _ecore_evas_wl_common_render () and remove all the other manual render things. ecore evas already forces all rendring to be driven by an animator out of the box. this animator should either be totally driven by frame request events from wayland (compositor) itself OR at least hook it up to the drm device... but either way this code is wrong as it messes ith the manual render flag that is ALSO altered via api from ecore_evas "public api" calls which are called by elm win etc. so this has to go... it's wrong at a minimum and likely causing issues. 2) ecore_evas_animator_tick() has a region but NO TIMESTAMP. please look at ecore_x_vsync.c and specifically ecore_loop_time_set() that uses the vblank timestamp to get EXACT vblank timing into. this is a must for having a STEADY animator with STEADY timepoints. a region - fine... but you need a timestamp too. now to the nasty one... 3) ecore evas drm engine using pageflips for animation. errrr... WHA? no. well ok. tell me if i'm wrong. to be able to tick the animator the code DOES a page flip... THEN uses the page flip event to drive the animator? what? this is just wrong on so many levels. animators are not a RESULT of altering the fb from some previous page flip. they are a tick that says "the screen scanout is refreshing NOW and you should time your animations NOW to THIS point". i suspect this code is a huge source of brokenness. why are we scheduling a flip ... we don't even HAVE a new frame yet? i know i know... it's "simpler" and you can get a flip event per output... BUT firstly the timestamp is not even USED from the page flip event in the code i'm reading, secondly i have no idea WHAT timestamp this would be (i know the vblank events are the vblank interrupt timestamp). the pageflip COULD be some other time during scanout (end of vblank, end of scanout? something else?). but either way it's not used and should absolutely be. but ... in order to GET an event you have to do a flip... and i'm reading ecore_drm2_fb_flip() and that is seemingly what is being done to just get this event. it seems to be able to do a "null flip" (flip the current buffer to itself), but i'm not so sure this is reliable given the api and code - is output-next always null when we register an animator with _drm_animator_register() ? what happens when we do a null page flip THEN do a real one? also here comes the stinker. what happens when we MISS a whole frame because something went slow? we're scheduling from the mainloop. since we are asking for the NEXT animator tick from a page flip... we only schedule a new page flip once we already have figured something changed in the ecore_evas or the animator is registered etc... imagine for a second we have a 16ms frame gap (approx 60hz). what if we spend 18ms this frame rendering or doing something? we MISS the next opportunity to page flip, so we actually have to wait another 14ms for the next frame. thus we do either 60hz, or 30hz... but can never play catch up and squeeze in another frame because we missed the opportunity to schedule one. this scheme using page flips is broken "by design" in this way. please have a look at ecore_x_vsync.c. yes it's complex. it does whitelisting of working drivers and handles some broken drm info stuff. it dlopens libdrm to not have to link or compile against it at all. it also handles timeouts on drm vblank events and after enough will switch to time based animation. but ignore that... it uses a dedicated thread JUST for scheduling vblank events and reading them so it will never miss one. in the dedicated thread ALL it does is schedule a vblank and sleep waiting for it to happen (or a command from mainloop to stop doing events, timeout in case of screen going off to fake animation ticks while vblanks are mising or exit etc.). so it can never (on even a heavily loaded system and irrespective of what the mainloop does) miss a frame... unless it literally cannot manage to wakeup from the fd coming alive. call drmHandlEvent, write the timestamp down an fd, check cancellation flag, the come back to scheduling it again within 16ms. you'd have a fundamentally broken system if this was not possible as this thread does nothing else. there is a good reason it is done this way. i have found that we HAVE managed to lose frames and drop from 60 to 30hz and the effects are not pretty. the drm engine really has to do the same. and i'm not so sure you can use page flip events then as you have a completely independent thread trying to use the drm fd to get these events and you don't want IT flipping pages to the same or a new one... so you likely have to use a separate drm fd like ecore_x_vsync.c does and rely on vblank events which are passive. chances are this code should become common/shared. but what i am reading right now smells of broken... and on my rpi i see broken... in fact the mouse just doesn't ever (barely) render/move unless i hold it over an ibar icon that is pulsing and animating... then it works, but move my mouse away... it basically doesn't work. i suspect this pageflip "to myself" trick is to blame. yes the vblank code only keys off a single screen and will ignore all other vblank events. i guess this would have to be figured out somehow. -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel