1bf215546Sopenharmony_ci/*
2bf215546Sopenharmony_ci * Copyright 2021 Google LLC
3bf215546Sopenharmony_ci * SPDX-License-Identifier: MIT
4bf215546Sopenharmony_ci */
5bf215546Sopenharmony_ci
6bf215546Sopenharmony_ci#ifndef VN_RENDERER_INTERNAL_H
7bf215546Sopenharmony_ci#define VN_RENDERER_INTERNAL_H
8bf215546Sopenharmony_ci
9bf215546Sopenharmony_ci#include "vn_renderer.h"
10bf215546Sopenharmony_ci
11bf215546Sopenharmony_citypedef void (*vn_renderer_shmem_cache_destroy_func)(
12bf215546Sopenharmony_ci   struct vn_renderer *renderer, struct vn_renderer_shmem *shmem);
13bf215546Sopenharmony_ci
14bf215546Sopenharmony_cistruct vn_renderer_shmem_cache {
15bf215546Sopenharmony_ci   bool initialized;
16bf215546Sopenharmony_ci
17bf215546Sopenharmony_ci   struct vn_renderer *renderer;
18bf215546Sopenharmony_ci   vn_renderer_shmem_cache_destroy_func destroy_func;
19bf215546Sopenharmony_ci
20bf215546Sopenharmony_ci   simple_mtx_t mutex;
21bf215546Sopenharmony_ci
22bf215546Sopenharmony_ci   /* cache shmems up to 2^26 in size (see choose_bucket) */
23bf215546Sopenharmony_ci   struct vn_renderer_shmem_bucket {
24bf215546Sopenharmony_ci      struct list_head shmems;
25bf215546Sopenharmony_ci   } buckets[27];
26bf215546Sopenharmony_ci
27bf215546Sopenharmony_ci   /* which buckets have shmems */
28bf215546Sopenharmony_ci   uint32_t bucket_mask;
29bf215546Sopenharmony_ci
30bf215546Sopenharmony_ci   struct {
31bf215546Sopenharmony_ci      uint32_t cache_skip_count;
32bf215546Sopenharmony_ci      uint32_t cache_hit_count;
33bf215546Sopenharmony_ci      uint32_t cache_miss_count;
34bf215546Sopenharmony_ci   } debug;
35bf215546Sopenharmony_ci};
36bf215546Sopenharmony_ci
37bf215546Sopenharmony_civoid
38bf215546Sopenharmony_civn_renderer_shmem_cache_init(
39bf215546Sopenharmony_ci   struct vn_renderer_shmem_cache *cache,
40bf215546Sopenharmony_ci   struct vn_renderer *renderer,
41bf215546Sopenharmony_ci   vn_renderer_shmem_cache_destroy_func destroy_func);
42bf215546Sopenharmony_ci
43bf215546Sopenharmony_civoid
44bf215546Sopenharmony_civn_renderer_shmem_cache_fini(struct vn_renderer_shmem_cache *cache);
45bf215546Sopenharmony_ci
46bf215546Sopenharmony_cibool
47bf215546Sopenharmony_civn_renderer_shmem_cache_add(struct vn_renderer_shmem_cache *cache,
48bf215546Sopenharmony_ci                            struct vn_renderer_shmem *shmem);
49bf215546Sopenharmony_ci
50bf215546Sopenharmony_cistruct vn_renderer_shmem *
51bf215546Sopenharmony_civn_renderer_shmem_cache_get(struct vn_renderer_shmem_cache *cache,
52bf215546Sopenharmony_ci                            size_t size);
53bf215546Sopenharmony_ci
54bf215546Sopenharmony_civoid
55bf215546Sopenharmony_civn_renderer_shmem_cache_debug_dump(struct vn_renderer_shmem_cache *cache);
56bf215546Sopenharmony_ci
57bf215546Sopenharmony_ci#endif /* VN_RENDERER_INTERNAL_H */
58