From: Michel Dänzer <michel.daen...@amd.com> Or if the cache watermark is reached, whichever comes earlier.
This slightly simplifies the FBO cache management, and prevents it from potentially holding entries for a long time, while preserving the main benefit of the cache for bursts of drawing operations. Signed-off-by: Michel Dänzer <michel.daen...@amd.com> --- glamor/glamor.c | 6 ++---- glamor/glamor_fbo.c | 24 ++++++++---------------- glamor/glamor_priv.h | 6 ------ 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/glamor/glamor.c b/glamor/glamor.c index feae7a21f..1a0fc4318 100644 --- a/glamor/glamor.c +++ b/glamor/glamor.c @@ -254,9 +254,7 @@ glamor_block_handler(ScreenPtr screen) glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); glamor_make_current(glamor_priv); - glamor_priv->tick++; glFlush(); - glamor_fbo_expire(glamor_priv); } static void @@ -264,8 +262,8 @@ _glamor_block_handler(ScreenPtr screen, void *timeout) { glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); - glamor_make_current(glamor_priv); - glFlush(); + glamor_block_handler(screen); + glamor_fbo_expire(glamor_priv); screen->BlockHandler = glamor_priv->saved_procs.block_handler; screen->BlockHandler(screen, timeout); diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c index a531f6052..c40de9bd1 100644 --- a/glamor/glamor_fbo.c +++ b/glamor/glamor_fbo.c @@ -30,11 +30,6 @@ #include "glamor_priv.h" -#define GLAMOR_CACHE_EXPIRE_MAX 100 - -#define GLAMOR_CACHE_DEFAULT 0 -#define GLAMOR_CACHE_EXACT_SIZE 1 - //#define NO_FBO_CACHE 1 #define FBO_CACHE_THRESHOLD (256*1024*1024) @@ -155,9 +150,13 @@ glamor_pixmap_fbo_cache_put(glamor_screen_private *glamor_priv, #else n_format = cache_format(fbo->format); - if (fbo->fb == 0 || fbo->external || n_format == -1 - || glamor_priv->fbo_cache_watermark >= FBO_CACHE_THRESHOLD) { - glamor_priv->tick += GLAMOR_CACHE_EXPIRE_MAX; + if (fbo->fb == 0 || fbo->external || n_format == -1) { + glamor_purge_fbo(glamor_priv, fbo); + return; + } + + glamor_priv->fbo_cache_watermark += fbo->width * fbo->height; + if (glamor_priv->fbo_cache_watermark >= FBO_CACHE_THRESHOLD) { glamor_fbo_expire(glamor_priv); glamor_purge_fbo(glamor_priv, fbo); return; @@ -182,9 +181,7 @@ glamor_pixmap_fbo_cache_put(glamor_screen_private *glamor_priv, glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA); } - glamor_priv->fbo_cache_watermark += fbo->width * fbo->height; xorg_list_add(&fbo->list, cache); - fbo->expire = glamor_priv->tick + GLAMOR_CACHE_EXPIRE_MAX; #endif } @@ -281,12 +278,6 @@ glamor_fbo_expire(glamor_screen_private *glamor_priv) cache = &glamor_priv->fbo_cache[i][j][k]; xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache, list) { - if (GLAMOR_TICK_AFTER(fbo_entry->expire, glamor_priv->tick)) { - break; - } - - glamor_priv->fbo_cache_watermark -= - fbo_entry->width * fbo_entry->height; xorg_list_del(&fbo_entry->list); DEBUGF("cache %p fbo %p expired %d current %d \n", cache, fbo_entry, fbo_entry->expire, glamor_priv->tick); @@ -294,6 +285,7 @@ glamor_fbo_expire(glamor_screen_private *glamor_priv) } } + glamor_priv->fbo_cache_watermark = 0; } void diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h index a9377ace1..ad7afec7e 100644 --- a/glamor/glamor_priv.h +++ b/glamor/glamor_priv.h @@ -189,11 +189,7 @@ struct glamor_saved_procs { #define CACHE_BUCKET_WCOUNT 4 #define CACHE_BUCKET_HCOUNT 4 -#define GLAMOR_TICK_AFTER(t0, t1) \ - (((int)(t1) - (int)(t0)) < 0) - typedef struct glamor_screen_private { - unsigned int tick; enum glamor_gl_flavor gl_flavor; int glsl_version; Bool has_pack_invert; @@ -328,8 +324,6 @@ enum glamor_fbo_state { typedef struct glamor_pixmap_fbo { struct xorg_list list; /**< linked list pointers when in the fbo cache */ - /** glamor_priv->tick number when this FBO will be expired from the cache. */ - unsigned int expire; GLuint tex; /**< GL texture name */ GLuint fb; /**< GL FBO name */ int width; /**< width in pixels */ -- 2.11.0 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel