radeonsi/gfx10: fix the legacy pipeline by storing as_ngg in the shader cache
authorMarek Olšák <marek.olsak@amd.com>
Tue, 20 Aug 2019 17:20:07 +0000 (13:20 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 27 Aug 2019 20:16:08 +0000 (16:16 -0400)
It could load an NGG shader when we want a legacy shader and vice versa.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
src/gallium/drivers/radeonsi/si_compute.c
src/gallium/drivers/radeonsi/si_state.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index a118ab246aeedcdf5afb160953149d22a17636f1..ac4a7aa3135a601f5b4804a8c1cc53757ca82e39 100644 (file)
@@ -147,7 +147,7 @@ static void si_create_compute_state_async(void *job, int thread_index)
        program->num_cs_user_data_dwords =
                sel->info.properties[TGSI_PROPERTY_CS_USER_DATA_COMPONENTS_AMD];
 
-       void *ir_binary = si_get_ir_binary(sel);
+       void *ir_binary = si_get_ir_binary(sel, false);
 
        /* Try to load the shader from the shader cache. */
        mtx_lock(&sscreen->shader_cache_mutex);
index c66eccc89d9456372cc7cf4aed7b54155ba94731..323313764d8b7d7f7c9a6cb6c6e187d400ea638e 100644 (file)
@@ -573,7 +573,7 @@ si_compute_fast_udiv_info32(uint32_t D, unsigned num_bits);
 void si_emit_dpbb_state(struct si_context *sctx);
 
 /* si_state_shaders.c */
-void *si_get_ir_binary(struct si_shader_selector *sel);
+void *si_get_ir_binary(struct si_shader_selector *sel, bool as_ngg);
 bool si_shader_cache_load_shader(struct si_screen *sscreen, void *ir_binary,
                                 struct si_shader *shader);
 bool si_shader_cache_insert_shader(struct si_screen *sscreen, void *ir_binary,
index 1c80a227209e521a9bb4f85965496bc94c461700..63014c9687c45dc948bd9cd86be169416513ab33 100644 (file)
@@ -45,7 +45,7 @@
  * Return the IR binary in a buffer. For TGSI the first 4 bytes contain its
  * size as integer.
  */
-void *si_get_ir_binary(struct si_shader_selector *sel)
+void *si_get_ir_binary(struct si_shader_selector *sel, bool as_ngg)
 {
        struct blob blob;
        unsigned ir_size;
@@ -64,14 +64,15 @@ void *si_get_ir_binary(struct si_shader_selector *sel)
                ir_size = blob.size;
        }
 
-       unsigned size = 4 + ir_size + sizeof(sel->so);
+       unsigned size = 4 + 4 + ir_size + sizeof(sel->so);
        char *result = (char*)MALLOC(size);
        if (!result)
                return NULL;
 
-       *((uint32_t*)result) = size;
-       memcpy(result + 4, ir_binary, ir_size);
-       memcpy(result + 4 + ir_size, &sel->so, sizeof(sel->so));
+       ((uint32_t*)result)[0] = size;
+       ((uint32_t*)result)[1] = as_ngg;
+       memcpy(result + 8, ir_binary, ir_size);
+       memcpy(result + 8 + ir_size, &sel->so, sizeof(sel->so));
 
        if (sel->nir)
                blob_finish(&blob);
@@ -2462,7 +2463,7 @@ static void si_init_shader_selector_async(void *job, int thread_index)
                        shader->key.as_ngg = 1;
 
                if (sel->tokens || sel->nir)
-                       ir_binary = si_get_ir_binary(sel);
+                       ir_binary = si_get_ir_binary(sel, shader->key.as_ngg);
 
                /* Try to load the shader from the shader cache. */
                mtx_lock(&sscreen->shader_cache_mutex);