glamor_fbo: Added a threshold value for the fbo cache pool.

Currently set it to 256MB. If cache pool watermark increases
to this value, then don't push any fbo to this pool, will purge
the fbo directly.

Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
Zhigang Gong 2012-04-26 18:31:07 +08:00 committed by Eric Anholt
parent 540846204c
commit 6e50ee9c10
2 changed files with 21 additions and 6 deletions

View File

@ -9,6 +9,7 @@
#define GLAMOR_CACHE_TEXTURE 2
//#define NO_FBO_CACHE 1
#define FBO_CACHE_THRESHOLD (256*1024*1024)
/* Loop from the tail to the head. */
#define xorg_list_for_each_entry_reverse(pos, head, member) \
@ -68,7 +69,7 @@ glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv,
int w, int h, GLenum format, int flag)
{
struct xorg_list *cache;
glamor_pixmap_fbo *fbo_entry;
glamor_pixmap_fbo *fbo_entry, *ret_fbo = NULL;
int size;
int n_format;
#ifdef NO_FBO_CACHE
@ -94,7 +95,8 @@ glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv,
fbo_entry, fbo_entry->width, fbo_entry->height,
fbo_entry->fb, fbo_entry->tex);
xorg_list_del(&fbo_entry->list);
return fbo_entry;
ret_fbo = fbo_entry;
break;
}
}
}
@ -108,12 +110,18 @@ glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv,
fbo_entry->fb, fbo_entry->tex, fbo_entry->format);
assert(format == fbo_entry->format);
xorg_list_del(&fbo_entry->list);
return fbo_entry;
ret_fbo = fbo_entry;
break;
}
}
}
return NULL;
if (ret_fbo)
glamor_priv->fbo_cache_watermark -= ret_fbo->width * ret_fbo->height;
assert(glamor_priv->fbo_cache_watermark >= 0);
return ret_fbo;
#endif
}
@ -144,7 +152,9 @@ glamor_pixmap_fbo_cache_put(glamor_pixmap_fbo *fbo)
#else
n_format = cache_format(fbo->format);
if (fbo->fb == 0 || n_format == -1) {
if (fbo->fb == 0 || n_format == -1
|| fbo->glamor_priv->fbo_cache_watermark >= FBO_CACHE_THRESHOLD) {
fbo->glamor_priv->tick ++;
glamor_purge_fbo(fbo);
return;
}
@ -159,6 +169,8 @@ glamor_pixmap_fbo_cache_put(glamor_pixmap_fbo *fbo)
[cache_hbucket(fbo->height)];
DEBUGF("Put cache entry %p to cache %p w %d h %d format %x fbo %d tex %d \n", fbo, cache,
fbo->width, fbo->height, fbo->format, fbo->fb, fbo->tex);
fbo->glamor_priv->fbo_cache_watermark += fbo->width * fbo->height;
xorg_list_add(&fbo->list, cache);
fbo->expire = fbo->glamor_priv->tick + GLAMOR_CACHE_EXPIRE_MAX;
#endif
@ -264,6 +276,8 @@ glamor_fbo_expire(glamor_screen_private *glamor_priv)
empty_cache = FALSE;
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);
@ -300,6 +314,7 @@ glamor_init_pixmap_fbo(ScreenPtr screen)
xorg_list_init(&glamor_priv->fbo_cache[i][j][k]);
xorg_list_init(&glamor_priv->tex_cache[i][j][k]);
}
glamor_priv->fbo_cache_watermark = 0;
}
void

View File

@ -209,6 +209,7 @@ typedef struct glamor_screen_private {
struct xorg_list fbo_cache[CACHE_FORMAT_COUNT][CACHE_BUCKET_WCOUNT][CACHE_BUCKET_HCOUNT];
struct xorg_list tex_cache[CACHE_FORMAT_COUNT][CACHE_BUCKET_WCOUNT][CACHE_BUCKET_HCOUNT];
unsigned long fbo_cache_watermark;
/* glamor_solid */
GLint solid_prog;
@ -742,7 +743,6 @@ glamor_poly_line(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
* this will increase performance obviously. */
#define GLAMOR_PIXMAP_DYNAMIC_UPLOAD
#define GLAMOR_DELAYED_FILLING
#ifndef GLAMOR_GLES2
//#define GLAMOR_GRADIENT_SHADER
#endif