diff options
author | Marek Olšák <[email protected]> | 2019-11-08 16:31:35 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-11-08 16:47:59 -0500 |
commit | 3ef50b023e86fefc28a27e420f7115f787671d9f (patch) | |
tree | 5bd3bcea0485266beb3b119bbcd70750774c6e46 /src/gallium/drivers | |
parent | 8b30114dda8b785c9ee3812638d4bd7c4bf658e7 (diff) |
radeonsi/nir: fix compute shader crash due to nir_binary == NULL
This partially reverts 8b30114dda8.
Fixes: 8b30114dda8 "radeonsi/nir: call nir_serialize only once per shader"
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state_shaders.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 5e72611734a..3cf2814f081 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -47,6 +47,7 @@ void si_get_ir_cache_key(struct si_shader_selector *sel, bool ngg, bool es, unsigned char ir_sha1_cache_key[20]) { + struct blob blob = {}; unsigned ir_size; void *ir_binary; @@ -54,10 +55,16 @@ void si_get_ir_cache_key(struct si_shader_selector *sel, bool ngg, bool es, ir_binary = sel->tokens; ir_size = tgsi_num_tokens(sel->tokens) * sizeof(struct tgsi_token); - } else { - assert(sel->nir_binary); + } else if (sel->nir_binary) { ir_binary = sel->nir_binary; ir_size = sel->nir_size; + } else { + assert(sel->nir); + + blob_init(&blob); + nir_serialize(&blob, sel->nir, true); + ir_binary = blob.data; + ir_size = blob.size; } /* These settings affect the compilation, but they are not derived @@ -83,6 +90,9 @@ void si_get_ir_cache_key(struct si_shader_selector *sel, bool ngg, bool es, sel->type == PIPE_SHADER_GEOMETRY) _mesa_sha1_update(&ctx, &sel->so, sizeof(sel->so)); _mesa_sha1_final(&ctx, ir_sha1_cache_key); + + if (ir_binary == blob.data) + blob_finish(&blob); } /** Copy "data" to "ptr" and return the next dword following copied data. */ |