[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