Re: [Mesa-dev] [PATCH v3 6/7] disk cache: add callback functionality
On 31.01.2018 11:18, Jordan Justen wrote: On 2018-01-30 23:17:05, Tapani Pälli wrote: v2: add disk_cache_has_key, disk_cache_put_key support using blob cache (Nicolai, Jordan) v3: rename set_cb as put_cb to match existing naming (Timothy) Signed-off-by: Tapani Pälli--- src/util/disk_cache.c | 49 + src/util/disk_cache.h | 19 +++ 2 files changed, 68 insertions(+) diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 9fa264440b..5af0346c7a 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -101,6 +101,9 @@ struct disk_cache { /* Driver cache keys. */ uint8_t *driver_keys_blob; size_t driver_keys_blob_size; + + disk_cache_put_cb blob_put_cb; + disk_cache_get_cb blob_get_cb; }; struct disk_cache_put_job { @@ -1012,6 +1015,11 @@ disk_cache_put(struct disk_cache *cache, const cache_key key, const void *data, size_t size, struct cache_item_metadata *cache_item_metadata) { + if (cache->blob_put_cb) { + cache->blob_put_cb(key, CACHE_KEY_SIZE, data, size); + return; + } + struct disk_cache_put_job *dc_job = create_put_job(cache, key, data, size, cache_item_metadata); @@ -1079,6 +1087,29 @@ disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size) if (size) *size = 0; + if (cache->blob_get_cb) { +/* This is what Android EGL defines as the maxValueSize in egl_cache_t + * class implementation. + */ +#define MAX_BLOB_SIZE 64 * 1024 What about 'const signed long max_blob_size = 64 * 1024;' instead? Yes, this is fine. I think earlier series I used it in 2 places and that's why it was left like this. Reviewed-by: Jordan Justen + void *blob = malloc(MAX_BLOB_SIZE); + if (!blob) + return NULL; + + signed long bytes = + cache->blob_get_cb(key, CACHE_KEY_SIZE, blob, MAX_BLOB_SIZE); + + if (!bytes) { + free(blob); + return NULL; + } + + if (size) + *size = bytes; + return blob; +#undef MAX_BLOB_SIZE + } + filename = get_cache_file(cache, key); if (filename == NULL) goto fail; @@ -1194,6 +1225,11 @@ disk_cache_put_key(struct disk_cache *cache, const cache_key key) int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; unsigned char *entry; + if (cache->blob_put_cb) { + cache->blob_put_cb(key, CACHE_KEY_SIZE, key_chunk, sizeof(uint32_t)); + return; + } + if (!cache->path) return; @@ -1216,6 +1252,11 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key) int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; unsigned char *entry; + if (cache->blob_get_cb) { + uint32_t blob; + return cache->blob_get_cb(key, CACHE_KEY_SIZE, , sizeof(uint32_t)); + } + /* Initialize path if not initialized yet. */ if (cache->path_init_failed || (!cache->path && !disk_cache_path_init(cache))) @@ -1239,4 +1280,12 @@ disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, _mesa_sha1_final(, key); } +void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get) +{ + cache->blob_put_cb = put; + cache->blob_get_cb = get; +} + #endif /* ENABLE_SHADER_CACHE */ diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h index 488b297ead..f84840fb5c 100644 --- a/src/util/disk_cache.h +++ b/src/util/disk_cache.h @@ -50,6 +50,14 @@ typedef uint8_t cache_key[CACHE_KEY_SIZE]; #define CACHE_ITEM_TYPE_UNKNOWN 0x0 #define CACHE_ITEM_TYPE_GLSL 0x1 +typedef void +(*disk_cache_put_cb) (const void *key, signed long keySize, + const void *value, signed long valueSize); + +typedef signed long +(*disk_cache_get_cb) (const void *key, signed long keySize, + void *value, signed long valueSize); + struct cache_item_metadata { /** * The cache item type. This could be used to identify a GLSL cache item, @@ -207,6 +215,10 @@ void disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, cache_key key); +void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get); + #else static inline struct disk_cache * @@ -260,6 +272,13 @@ disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, return; } +static inline void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get) +{ + return; +} + #endif /* ENABLE_SHADER_CACHE */ #ifdef __cplusplus -- 2.13.6 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org
Re: [Mesa-dev] [PATCH v3 6/7] disk cache: add callback functionality
On 2018-01-30 23:17:05, Tapani Pälli wrote: > v2: add disk_cache_has_key, disk_cache_put_key support > using blob cache (Nicolai, Jordan) > > v3: rename set_cb as put_cb to match existing naming (Timothy) > > Signed-off-by: Tapani Pälli> --- > src/util/disk_cache.c | 49 + > src/util/disk_cache.h | 19 +++ > 2 files changed, 68 insertions(+) > > diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c > index 9fa264440b..5af0346c7a 100644 > --- a/src/util/disk_cache.c > +++ b/src/util/disk_cache.c > @@ -101,6 +101,9 @@ struct disk_cache { > /* Driver cache keys. */ > uint8_t *driver_keys_blob; > size_t driver_keys_blob_size; > + > + disk_cache_put_cb blob_put_cb; > + disk_cache_get_cb blob_get_cb; > }; > > struct disk_cache_put_job { > @@ -1012,6 +1015,11 @@ disk_cache_put(struct disk_cache *cache, const > cache_key key, > const void *data, size_t size, > struct cache_item_metadata *cache_item_metadata) > { > + if (cache->blob_put_cb) { > + cache->blob_put_cb(key, CACHE_KEY_SIZE, data, size); > + return; > + } > + > struct disk_cache_put_job *dc_job = >create_put_job(cache, key, data, size, cache_item_metadata); > > @@ -1079,6 +1087,29 @@ disk_cache_get(struct disk_cache *cache, const > cache_key key, size_t *size) > if (size) >*size = 0; > > + if (cache->blob_get_cb) { > +/* This is what Android EGL defines as the maxValueSize in egl_cache_t > + * class implementation. > + */ > +#define MAX_BLOB_SIZE 64 * 1024 What about 'const signed long max_blob_size = 64 * 1024;' instead? Reviewed-by: Jordan Justen > + void *blob = malloc(MAX_BLOB_SIZE); > + if (!blob) > + return NULL; > + > + signed long bytes = > + cache->blob_get_cb(key, CACHE_KEY_SIZE, blob, MAX_BLOB_SIZE); > + > + if (!bytes) { > + free(blob); > + return NULL; > + } > + > + if (size) > + *size = bytes; > + return blob; > +#undef MAX_BLOB_SIZE > + } > + > filename = get_cache_file(cache, key); > if (filename == NULL) >goto fail; > @@ -1194,6 +1225,11 @@ disk_cache_put_key(struct disk_cache *cache, const > cache_key key) > int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; > unsigned char *entry; > > + if (cache->blob_put_cb) { > + cache->blob_put_cb(key, CACHE_KEY_SIZE, key_chunk, sizeof(uint32_t)); > + return; > + } > + > if (!cache->path) >return; > > @@ -1216,6 +1252,11 @@ disk_cache_has_key(struct disk_cache *cache, const > cache_key key) > int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; > unsigned char *entry; > > + if (cache->blob_get_cb) { > + uint32_t blob; > + return cache->blob_get_cb(key, CACHE_KEY_SIZE, , > sizeof(uint32_t)); > + } > + > /* Initialize path if not initialized yet. */ > if (cache->path_init_failed || > (!cache->path && !disk_cache_path_init(cache))) > @@ -1239,4 +1280,12 @@ disk_cache_compute_key(struct disk_cache *cache, const > void *data, size_t size, > _mesa_sha1_final(, key); > } > > +void > +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, > + disk_cache_get_cb get) > +{ > + cache->blob_put_cb = put; > + cache->blob_get_cb = get; > +} > + > #endif /* ENABLE_SHADER_CACHE */ > diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h > index 488b297ead..f84840fb5c 100644 > --- a/src/util/disk_cache.h > +++ b/src/util/disk_cache.h > @@ -50,6 +50,14 @@ typedef uint8_t cache_key[CACHE_KEY_SIZE]; > #define CACHE_ITEM_TYPE_UNKNOWN 0x0 > #define CACHE_ITEM_TYPE_GLSL 0x1 > > +typedef void > +(*disk_cache_put_cb) (const void *key, signed long keySize, > + const void *value, signed long valueSize); > + > +typedef signed long > +(*disk_cache_get_cb) (const void *key, signed long keySize, > + void *value, signed long valueSize); > + > struct cache_item_metadata { > /** > * The cache item type. This could be used to identify a GLSL cache item, > @@ -207,6 +215,10 @@ void > disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t > size, > cache_key key); > > +void > +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, > + disk_cache_get_cb get); > + > #else > > static inline struct disk_cache * > @@ -260,6 +272,13 @@ disk_cache_compute_key(struct disk_cache *cache, const > void *data, size_t size, > return; > } > > +static inline void > +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, > + disk_cache_get_cb get) > +{ > + return; > +} > + > #endif /* ENABLE_SHADER_CACHE */ > > #ifdef __cplusplus > -- > 2.13.6 >
[Mesa-dev] [PATCH v3 6/7] disk cache: add callback functionality
v2: add disk_cache_has_key, disk_cache_put_key support using blob cache (Nicolai, Jordan) v3: rename set_cb as put_cb to match existing naming (Timothy) Signed-off-by: Tapani Pälli--- src/util/disk_cache.c | 49 + src/util/disk_cache.h | 19 +++ 2 files changed, 68 insertions(+) diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 9fa264440b..5af0346c7a 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -101,6 +101,9 @@ struct disk_cache { /* Driver cache keys. */ uint8_t *driver_keys_blob; size_t driver_keys_blob_size; + + disk_cache_put_cb blob_put_cb; + disk_cache_get_cb blob_get_cb; }; struct disk_cache_put_job { @@ -1012,6 +1015,11 @@ disk_cache_put(struct disk_cache *cache, const cache_key key, const void *data, size_t size, struct cache_item_metadata *cache_item_metadata) { + if (cache->blob_put_cb) { + cache->blob_put_cb(key, CACHE_KEY_SIZE, data, size); + return; + } + struct disk_cache_put_job *dc_job = create_put_job(cache, key, data, size, cache_item_metadata); @@ -1079,6 +1087,29 @@ disk_cache_get(struct disk_cache *cache, const cache_key key, size_t *size) if (size) *size = 0; + if (cache->blob_get_cb) { +/* This is what Android EGL defines as the maxValueSize in egl_cache_t + * class implementation. + */ +#define MAX_BLOB_SIZE 64 * 1024 + void *blob = malloc(MAX_BLOB_SIZE); + if (!blob) + return NULL; + + signed long bytes = + cache->blob_get_cb(key, CACHE_KEY_SIZE, blob, MAX_BLOB_SIZE); + + if (!bytes) { + free(blob); + return NULL; + } + + if (size) + *size = bytes; + return blob; +#undef MAX_BLOB_SIZE + } + filename = get_cache_file(cache, key); if (filename == NULL) goto fail; @@ -1194,6 +1225,11 @@ disk_cache_put_key(struct disk_cache *cache, const cache_key key) int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; unsigned char *entry; + if (cache->blob_put_cb) { + cache->blob_put_cb(key, CACHE_KEY_SIZE, key_chunk, sizeof(uint32_t)); + return; + } + if (!cache->path) return; @@ -1216,6 +1252,11 @@ disk_cache_has_key(struct disk_cache *cache, const cache_key key) int i = CPU_TO_LE32(*key_chunk) & CACHE_INDEX_KEY_MASK; unsigned char *entry; + if (cache->blob_get_cb) { + uint32_t blob; + return cache->blob_get_cb(key, CACHE_KEY_SIZE, , sizeof(uint32_t)); + } + /* Initialize path if not initialized yet. */ if (cache->path_init_failed || (!cache->path && !disk_cache_path_init(cache))) @@ -1239,4 +1280,12 @@ disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, _mesa_sha1_final(, key); } +void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get) +{ + cache->blob_put_cb = put; + cache->blob_get_cb = get; +} + #endif /* ENABLE_SHADER_CACHE */ diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h index 488b297ead..f84840fb5c 100644 --- a/src/util/disk_cache.h +++ b/src/util/disk_cache.h @@ -50,6 +50,14 @@ typedef uint8_t cache_key[CACHE_KEY_SIZE]; #define CACHE_ITEM_TYPE_UNKNOWN 0x0 #define CACHE_ITEM_TYPE_GLSL 0x1 +typedef void +(*disk_cache_put_cb) (const void *key, signed long keySize, + const void *value, signed long valueSize); + +typedef signed long +(*disk_cache_get_cb) (const void *key, signed long keySize, + void *value, signed long valueSize); + struct cache_item_metadata { /** * The cache item type. This could be used to identify a GLSL cache item, @@ -207,6 +215,10 @@ void disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, cache_key key); +void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get); + #else static inline struct disk_cache * @@ -260,6 +272,13 @@ disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size, return; } +static inline void +disk_cache_set_callbacks(struct disk_cache *cache, disk_cache_put_cb put, + disk_cache_get_cb get) +{ + return; +} + #endif /* ENABLE_SHADER_CACHE */ #ifdef __cplusplus -- 2.13.6 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev