[PATCH xserver 2/2] glamor: Always purge the FBO cache in BlockHandler

Michel Dänzer michel at daenzer.net
Fri Mar 3 08:46:55 UTC 2017


From: Michel Dänzer <michel.daenzer at 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.daenzer at 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



More information about the xorg-devel mailing list