radv: dump NIR when a GPU hang is detected
This looks a bit ugly to me, but the existing codepath is not terribly elegant as well. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -495,8 +495,14 @@ radv_dump_shader(struct radv_pipeline *pipeline,
|
|||||||
if (!shader)
|
if (!shader)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf(f, "%s:\n%s\n\n", radv_get_shader_name(shader, stage),
|
fprintf(f, "%s:\n\n", radv_get_shader_name(shader, stage));
|
||||||
shader->disasm_string);
|
|
||||||
|
if (shader->nir) {
|
||||||
|
fprintf(f, "NIR:\n");
|
||||||
|
nir_print_shader(shader->nir, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "DISASM:\n%s\n", shader->disasm_string);
|
||||||
|
|
||||||
radv_shader_dump_stats(pipeline->device, shader, stage, f);
|
radv_shader_dump_stats(pipeline->device, shader, stage, f);
|
||||||
}
|
}
|
||||||
|
@@ -139,7 +139,7 @@ radv_pipeline_compile(struct radv_pipeline *pipeline,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!variant) {
|
if (!variant) {
|
||||||
variant = radv_shader_variant_create(pipeline->device, nir,
|
variant = radv_shader_variant_create(pipeline->device, module, nir,
|
||||||
layout, key, &code,
|
layout, key, &code,
|
||||||
&code_size);
|
&code_size);
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ radv_pipeline_compile(struct radv_pipeline *pipeline,
|
|||||||
|
|
||||||
free(gs_copy_code);
|
free(gs_copy_code);
|
||||||
}
|
}
|
||||||
if (!module->nir)
|
if (!module->nir && !pipeline->device->trace_bo)
|
||||||
ralloc_free(nir);
|
ralloc_free(nir);
|
||||||
|
|
||||||
if (variant)
|
if (variant)
|
||||||
@@ -270,7 +270,7 @@ radv_tess_pipeline_compile(struct radv_pipeline *pipeline,
|
|||||||
nir_lower_tes_patch_vertices(tes_nir,
|
nir_lower_tes_patch_vertices(tes_nir,
|
||||||
tcs_nir->info.tess.tcs_vertices_out);
|
tcs_nir->info.tess.tcs_vertices_out);
|
||||||
|
|
||||||
tes_variant = radv_shader_variant_create(pipeline->device, tes_nir,
|
tes_variant = radv_shader_variant_create(pipeline->device, tes_module, tes_nir,
|
||||||
layout, &tes_key, &tes_code,
|
layout, &tes_key, &tes_code,
|
||||||
&tes_code_size);
|
&tes_code_size);
|
||||||
|
|
||||||
@@ -282,14 +282,14 @@ radv_tess_pipeline_compile(struct radv_pipeline *pipeline,
|
|||||||
|
|
||||||
radv_hash_shader(tcs_sha1, tcs_module, tcs_entrypoint, tcs_spec_info, layout, &tcs_key, 0);
|
radv_hash_shader(tcs_sha1, tcs_module, tcs_entrypoint, tcs_spec_info, layout, &tcs_key, 0);
|
||||||
|
|
||||||
tcs_variant = radv_shader_variant_create(pipeline->device, tcs_nir,
|
tcs_variant = radv_shader_variant_create(pipeline->device, tcs_module, tcs_nir,
|
||||||
layout, &tcs_key, &tcs_code,
|
layout, &tcs_key, &tcs_code,
|
||||||
&tcs_code_size);
|
&tcs_code_size);
|
||||||
|
|
||||||
if (!tes_module->nir)
|
if (!tes_module->nir && !pipeline->device->trace_bo)
|
||||||
ralloc_free(tes_nir);
|
ralloc_free(tes_nir);
|
||||||
|
|
||||||
if (!tcs_module->nir)
|
if (!tcs_module->nir && !pipeline->device->trace_bo)
|
||||||
ralloc_free(tcs_nir);
|
ralloc_free(tcs_nir);
|
||||||
|
|
||||||
if (tes_variant)
|
if (tes_variant)
|
||||||
|
@@ -377,6 +377,7 @@ radv_fill_shader_variant(struct radv_device *device,
|
|||||||
|
|
||||||
static struct radv_shader_variant *
|
static struct radv_shader_variant *
|
||||||
shader_variant_create(struct radv_device *device,
|
shader_variant_create(struct radv_device *device,
|
||||||
|
struct radv_shader_module *module,
|
||||||
struct nir_shader *shader,
|
struct nir_shader *shader,
|
||||||
gl_shader_stage stage,
|
gl_shader_stage stage,
|
||||||
struct ac_nir_compiler_options *options,
|
struct ac_nir_compiler_options *options,
|
||||||
@@ -430,6 +431,9 @@ shader_variant_create(struct radv_device *device,
|
|||||||
|
|
||||||
if (device->trace_bo) {
|
if (device->trace_bo) {
|
||||||
variant->disasm_string = binary.disasm_string;
|
variant->disasm_string = binary.disasm_string;
|
||||||
|
if (!gs_copy_shader && !module->nir) {
|
||||||
|
variant->nir = shader;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
free(binary.disasm_string);
|
free(binary.disasm_string);
|
||||||
}
|
}
|
||||||
@@ -439,6 +443,7 @@ shader_variant_create(struct radv_device *device,
|
|||||||
|
|
||||||
struct radv_shader_variant *
|
struct radv_shader_variant *
|
||||||
radv_shader_variant_create(struct radv_device *device,
|
radv_shader_variant_create(struct radv_device *device,
|
||||||
|
struct radv_shader_module *module,
|
||||||
struct nir_shader *shader,
|
struct nir_shader *shader,
|
||||||
struct radv_pipeline_layout *layout,
|
struct radv_pipeline_layout *layout,
|
||||||
const struct ac_shader_variant_key *key,
|
const struct ac_shader_variant_key *key,
|
||||||
@@ -454,7 +459,7 @@ radv_shader_variant_create(struct radv_device *device,
|
|||||||
options.unsafe_math = !!(device->debug_flags & RADV_DEBUG_UNSAFE_MATH);
|
options.unsafe_math = !!(device->debug_flags & RADV_DEBUG_UNSAFE_MATH);
|
||||||
options.supports_spill = device->llvm_supports_spill;
|
options.supports_spill = device->llvm_supports_spill;
|
||||||
|
|
||||||
return shader_variant_create(device, shader, shader->stage,
|
return shader_variant_create(device, module, shader, shader->stage,
|
||||||
&options, false, code_out, code_size_out);
|
&options, false, code_out, code_size_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,7 +474,7 @@ radv_create_gs_copy_shader(struct radv_device *device,
|
|||||||
|
|
||||||
options.key.has_multiview_view_index = multiview;
|
options.key.has_multiview_view_index = multiview;
|
||||||
|
|
||||||
return shader_variant_create(device, shader, MESA_SHADER_VERTEX,
|
return shader_variant_create(device, NULL, shader, MESA_SHADER_VERTEX,
|
||||||
&options, true, code_out, code_size_out);
|
&options, true, code_out, code_size_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,6 +489,7 @@ radv_shader_variant_destroy(struct radv_device *device,
|
|||||||
list_del(&variant->slab_list);
|
list_del(&variant->slab_list);
|
||||||
mtx_unlock(&device->shader_slab_mutex);
|
mtx_unlock(&device->shader_slab_mutex);
|
||||||
|
|
||||||
|
ralloc_free(variant->nir);
|
||||||
free(variant->disasm_string);
|
free(variant->disasm_string);
|
||||||
free(variant);
|
free(variant);
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,10 @@ struct radv_shader_variant {
|
|||||||
struct ac_shader_variant_info info;
|
struct ac_shader_variant_info info;
|
||||||
unsigned rsrc1;
|
unsigned rsrc1;
|
||||||
unsigned rsrc2;
|
unsigned rsrc2;
|
||||||
char *disasm_string; /* debug only */
|
|
||||||
|
/* debug only */
|
||||||
|
struct nir_shader *nir;
|
||||||
|
char *disasm_string;
|
||||||
|
|
||||||
struct list_head slab_list;
|
struct list_head slab_list;
|
||||||
};
|
};
|
||||||
@@ -78,6 +81,7 @@ radv_destroy_shader_slabs(struct radv_device *device);
|
|||||||
|
|
||||||
struct radv_shader_variant *
|
struct radv_shader_variant *
|
||||||
radv_shader_variant_create(struct radv_device *device,
|
radv_shader_variant_create(struct radv_device *device,
|
||||||
|
struct radv_shader_module *module,
|
||||||
struct nir_shader *shader,
|
struct nir_shader *shader,
|
||||||
struct radv_pipeline_layout *layout,
|
struct radv_pipeline_layout *layout,
|
||||||
const struct ac_shader_variant_key *key,
|
const struct ac_shader_variant_key *key,
|
||||||
|
Reference in New Issue
Block a user