radv: Use string for nir dumping.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 1 Jun 2019 18:54:35 +0000 (20:54 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Mon, 12 Aug 2019 21:00:24 +0000 (23:00 +0200)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Allows us to easily dump all nir shaders for combined variants in
vega and simplifies ownership.

src/amd/vulkan/radv_debug.c
src/amd/vulkan/radv_pipeline.c
src/amd/vulkan/radv_shader.c
src/amd/vulkan/radv_shader.h

index 49b7417e988f86d4dd655b71d81fe41fe36a34e4..41d329182aee6120b007f206255f725b9caf7705 100644 (file)
@@ -503,9 +503,8 @@ radv_dump_shader(struct radv_pipeline *pipeline,
                radv_print_spirv(shader->spirv, shader->spirv_size, f);
        }
 
-       if (shader->nir) {
-               fprintf(f, "NIR:\n");
-               nir_print_shader(shader->nir, f);
+       if (shader->nir_string) {
+               fprintf(f, "NIR:\n%s\n", shader->nir_string);
        }
 
        fprintf(f, "LLVM IR:\n%s\n", shader->llvm_ir_string);
index 8e56e2cbd79ae80353355b75257dbfd43f90a51a..d297a4e078b9c38cc986290b3bb3696b3b7e653f 100644 (file)
@@ -2660,8 +2660,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
        for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
                free(binaries[i]);
                if (nir[i]) {
-                       if (!pipeline->device->keep_shader_info)
-                               ralloc_free(nir[i]);
+                       ralloc_free(nir[i]);
 
                        if (radv_can_dump_shader_stats(device, modules[i]))
                                radv_shader_dump_stats(device,
index d06abb3d648a422e3b9b3cc5b6b56f029b96b2a9..d0006cf84f57b3f3fef3b4df7cb674cb99b06a0f 100644 (file)
@@ -1097,6 +1097,29 @@ radv_shader_variant_create(struct radv_device *device,
        return variant;
 }
 
+static char *
+radv_dump_nir_shaders(struct nir_shader * const *shaders,
+                      int shader_count)
+{
+       char *data = NULL;
+       char *ret = NULL;
+       size_t size = 0;
+       FILE *f = open_memstream(&data, &size);
+       if (f) {
+               for (int i = 0; i < shader_count; ++i)
+                       nir_print_shader(shaders[i], f);
+               fclose(f);
+       }
+
+       ret = malloc(size + 1);
+       if (ret) {
+               memcpy(ret, data, size);
+               ret[size] = 0;
+       }
+       free(data);
+       return ret;
+}
+
 static struct radv_shader_variant *
 shader_variant_compile(struct radv_device *device,
                       struct radv_shader_module *module,
@@ -1176,8 +1199,8 @@ shader_variant_compile(struct radv_device *device,
 
 
        if (device->keep_shader_info) {
+               variant->nir_string = radv_dump_nir_shaders(shaders, shader_count);
                if (!gs_copy_shader && !module->nir) {
-                       variant->nir = *shaders;
                        variant->spirv = (uint32_t *)module->data;
                        variant->spirv_size = module->size;
                }
@@ -1239,7 +1262,7 @@ radv_shader_variant_destroy(struct radv_device *device,
        list_del(&variant->slab_list);
        mtx_unlock(&device->shader_slab_mutex);
 
-       ralloc_free(variant->nir);
+       free(variant->nir_string);
        free(variant->disasm_string);
        free(variant->llvm_ir_string);
        free(variant);
index af097215f53c212489fd36ed000291da8c7c8099..07437de725550e005aebebe81e40cddfd2744ad7 100644 (file)
@@ -354,7 +354,7 @@ struct radv_shader_variant {
        /* debug only */
        uint32_t *spirv;
        uint32_t spirv_size;
-       struct nir_shader *nir;
+       char *nir_string;
        char *disasm_string;
        char *llvm_ir_string;