radeonsi: Limit the size of the in-memory shader cache
The in-memory shader cache can get significantly huge in some rare cases. Limit its size to 64MB on 32 bits, and 1GB else. Signed-off-by: Axel Davy <davyaxel0@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9578>
This commit is contained in:
@@ -645,6 +645,9 @@ struct si_screen {
|
|||||||
*/
|
*/
|
||||||
simple_mtx_t shader_cache_mutex;
|
simple_mtx_t shader_cache_mutex;
|
||||||
struct hash_table *shader_cache;
|
struct hash_table *shader_cache;
|
||||||
|
/* Maximum and current size */
|
||||||
|
uint32_t shader_cache_size;
|
||||||
|
uint32_t shader_cache_max_size;
|
||||||
|
|
||||||
/* Shader cache of live shaders. */
|
/* Shader cache of live shaders. */
|
||||||
struct util_live_shader_cache live_shader_cache;
|
struct util_live_shader_cache live_shader_cache;
|
||||||
|
@@ -227,6 +227,10 @@ void si_shader_cache_insert_shader(struct si_screen *sscreen, unsigned char ir_s
|
|||||||
void *hw_binary;
|
void *hw_binary;
|
||||||
struct hash_entry *entry;
|
struct hash_entry *entry;
|
||||||
uint8_t key[CACHE_KEY_SIZE];
|
uint8_t key[CACHE_KEY_SIZE];
|
||||||
|
bool memory_cache_full = sscreen->shader_cache_size >= sscreen->shader_cache_max_size;
|
||||||
|
|
||||||
|
if (!insert_into_disk_cache && memory_cache_full)
|
||||||
|
return;
|
||||||
|
|
||||||
entry = _mesa_hash_table_search(sscreen->shader_cache, ir_sha1_cache_key);
|
entry = _mesa_hash_table_search(sscreen->shader_cache, ir_sha1_cache_key);
|
||||||
if (entry)
|
if (entry)
|
||||||
@@ -236,10 +240,15 @@ void si_shader_cache_insert_shader(struct si_screen *sscreen, unsigned char ir_s
|
|||||||
if (!hw_binary)
|
if (!hw_binary)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_mesa_hash_table_insert(sscreen->shader_cache, mem_dup(ir_sha1_cache_key, 20), hw_binary) ==
|
if (!memory_cache_full) {
|
||||||
NULL) {
|
if (_mesa_hash_table_insert(sscreen->shader_cache,
|
||||||
FREE(hw_binary);
|
mem_dup(ir_sha1_cache_key, 20),
|
||||||
return;
|
hw_binary) == NULL) {
|
||||||
|
FREE(hw_binary);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* The size is stored at the start of the binary */
|
||||||
|
sscreen->shader_cache_size += *(uint32_t*)hw_binary;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sscreen->disk_shader_cache && insert_into_disk_cache) {
|
if (sscreen->disk_shader_cache && insert_into_disk_cache) {
|
||||||
@@ -314,6 +323,9 @@ bool si_init_shader_cache(struct si_screen *sscreen)
|
|||||||
(void)simple_mtx_init(&sscreen->shader_cache_mutex, mtx_plain);
|
(void)simple_mtx_init(&sscreen->shader_cache_mutex, mtx_plain);
|
||||||
sscreen->shader_cache =
|
sscreen->shader_cache =
|
||||||
_mesa_hash_table_create(NULL, si_shader_cache_key_hash, si_shader_cache_key_equals);
|
_mesa_hash_table_create(NULL, si_shader_cache_key_hash, si_shader_cache_key_equals);
|
||||||
|
sscreen->shader_cache_size = 0;
|
||||||
|
/* Maximum size: 64MB on 32 bits, 1GB else */
|
||||||
|
sscreen->shader_cache_max_size = ((sizeof(void *) == 4) ? 64 : 1024) * 1024 * 1024;
|
||||||
|
|
||||||
return sscreen->shader_cache != NULL;
|
return sscreen->shader_cache != NULL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user