/**
* Compute the bucket for this key.
*/
-static INLINE unsigned
+static inline unsigned
svga_screen_cache_bucket(const struct svga_host_surface_cache_key *key)
{
return util_hash_crc32(key, sizeof *key) % SVGA_HOST_SURFACE_CACHE_BUCKETS;
* found, remove it from the cache and return the surface pointer.
* Return NULL otherwise.
*/
-static INLINE struct svga_winsys_surface *
+static struct svga_winsys_surface *
svga_screen_cache_lookup(struct svga_screen *svgascreen,
const struct svga_host_surface_cache_key *key)
{
}
-/*
+/**
* Transfers a handle reference.
*/
-static INLINE void
+static void
svga_screen_cache_add(struct svga_screen *svgascreen,
const struct svga_host_surface_cache_key *key,
struct svga_winsys_surface **p_handle)
assert(key->cachable);
- assert(handle);
if (!handle)
return;
}
+/**
+ * Free all the surfaces in the cache.
+ * Called when destroying the svga screen object.
+ */
void
svga_screen_cache_cleanup(struct svga_screen *svgascreen)
{
}
+/**
+ * Allocate a new host-side surface. If the surface is marked as cachable,
+ * first try re-using a surface in the cache of freed surfaces. Otherwise,
+ * allocate a new surface.
+ */
struct svga_winsys_surface *
svga_screen_surface_create(struct svga_screen *svgascreen,
struct svga_host_surface_cache_key *key)
handle = sws->surface_create(sws,
key->flags,
key->format,
+ key->cachable ?
+ 0 : SVGA_SURFACE_USAGE_SHARED,
key->size,
key->numFaces,
key->numMipLevels);
}
+/**
+ * Release a surface. We don't actually free the surface- we put
+ * it into the cache of freed surfaces (if it's cachable).
+ */
void
svga_screen_surface_destroy(struct svga_screen *svgascreen,
const struct svga_host_surface_cache_key *key,
sws->surface_reference(sws, p_handle, NULL);
}
}
+
+
+/**
+ * Print/dump the contents of the screen cache. For debugging.
+ */
+void
+svga_screen_cache_dump(const struct svga_screen *svgascreen)
+{
+ const struct svga_host_surface_cache *cache = &svgascreen->cache;
+ unsigned bucket;
+ unsigned count = 0;
+
+ debug_printf("svga3d surface cache:\n");
+ for (bucket = 0; bucket < SVGA_HOST_SURFACE_CACHE_BUCKETS; bucket++) {
+ struct list_head *curr;
+ curr = cache->bucket[bucket].next;
+ while (curr && curr != &cache->bucket[bucket]) {
+ struct svga_host_surface_cache_entry *entry =
+ LIST_ENTRY(struct svga_host_surface_cache_entry,
+ curr, bucket_head);
+ if (entry->key.format != 37) {
+ debug_printf(" %u x %u x %u format %u\n",
+ entry->key.size.width,
+ entry->key.size.height,
+ entry->key.size.depth,
+ entry->key.format);
+ }
+ curr = curr->next;
+ count++;
+ }
+ }
+
+ debug_printf("%u surfaces, %u bytes\n", count, cache->total_size);
+}