radeonsi/nir: fix compute shader crash due to nir_binary == NULL
authorMarek Olšák <marek.olsak@amd.com>
Fri, 8 Nov 2019 21:31:35 +0000 (16:31 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 8 Nov 2019 21:47:59 +0000 (16:47 -0500)
This partially reverts 8b30114dda8.

Fixes: 8b30114dda8 "radeonsi/nir: call nir_serialize only once per shader"
src/gallium/drivers/radeonsi/si_state_shaders.c

index 5e72611734a04d00d69b55299d50111548cdf05d..3cf2814f081f3ade3fe9e6fc83d02e27c1e4b883 100644 (file)
@@ -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. */