uxa: Wakeup 3s after the last rendering to reap the bo-cache

libdrm expires its bo 2s after entry into the cache, but we need to free
a buffer to trigger the reaper. So schedule a timer event to trigger 3s
after the last rendering is submitted to free any resident bo during
long periods of idleness.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-12-13 11:20:25 +00:00
parent db7c9e8561
commit 1128825efb
3 changed files with 24 additions and 0 deletions

View File

@ -279,6 +279,7 @@ typedef struct intel_screen_private {
struct list flush_pixmaps;
struct list in_flight;
drm_intel_bo *wa_scratch_bo;
OsTimerPtr cache_expire;
/* For Xvideo */
Bool use_overlay;

View File

@ -1200,6 +1200,9 @@ static Bool I830CloseScreen(int scrnIndex, ScreenPtr screen)
intel_glamor_close_screen(screen);
TimerFree(intel->cache_expire);
intel->cache_expire = NULL;
if (intel->uxa_driver) {
uxa_driver_fini(screen);
free(intel->uxa_driver);

View File

@ -965,6 +965,23 @@ static Bool intel_uxa_get_image(PixmapPtr pixmap,
return ret;
}
static CARD32 intel_cache_expire(OsTimerPtr timer, CARD32 now, pointer data)
{
intel_screen_private *intel = data;
/* We just want to create and destroy a bo as this causes libdrm
* to reap its caches. However, since we can't remove that buffer
* from the cache due to its own activity, we want to use something
* that we know we will reuse later. The most frequently reused buffer
* we have is the batchbuffer, and the best way to trigger its
* reallocation is to submit a flush.
*/
intel_batch_emit_flush(intel->scrn);
intel_batch_submit(intel->scrn);
return 0;
}
static void intel_flush_rendering(intel_screen_private *intel)
{
if (intel->needs_flush == 0)
@ -978,6 +995,9 @@ static void intel_flush_rendering(intel_screen_private *intel)
intel_batch_submit(intel->scrn);
}
intel->cache_expire = TimerSet(intel->cache_expire, 0, 3000,
intel_cache_expire, intel);
intel->needs_flush = 0;
}