radv: Use string for nir dumping.
Reviewed-by: Dave Airlie <airlied@redhat.com> Allows us to easily dump all nir shaders for combined variants in vega and simplifies ownership.
This commit is contained in:
@@ -503,9 +503,8 @@ radv_dump_shader(struct radv_pipeline *pipeline,
|
|||||||
radv_print_spirv(shader->spirv, shader->spirv_size, f);
|
radv_print_spirv(shader->spirv, shader->spirv_size, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shader->nir) {
|
if (shader->nir_string) {
|
||||||
fprintf(f, "NIR:\n");
|
fprintf(f, "NIR:\n%s\n", shader->nir_string);
|
||||||
nir_print_shader(shader->nir, f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(f, "LLVM IR:\n%s\n", shader->llvm_ir_string);
|
fprintf(f, "LLVM IR:\n%s\n", shader->llvm_ir_string);
|
||||||
|
@@ -2660,8 +2660,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
|
|||||||
for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
|
for (int i = 0; i < MESA_SHADER_STAGES; ++i) {
|
||||||
free(binaries[i]);
|
free(binaries[i]);
|
||||||
if (nir[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]))
|
if (radv_can_dump_shader_stats(device, modules[i]))
|
||||||
radv_shader_dump_stats(device,
|
radv_shader_dump_stats(device,
|
||||||
|
@@ -1097,6 +1097,29 @@ radv_shader_variant_create(struct radv_device *device,
|
|||||||
return variant;
|
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 *
|
static struct radv_shader_variant *
|
||||||
shader_variant_compile(struct radv_device *device,
|
shader_variant_compile(struct radv_device *device,
|
||||||
struct radv_shader_module *module,
|
struct radv_shader_module *module,
|
||||||
@@ -1176,8 +1199,8 @@ shader_variant_compile(struct radv_device *device,
|
|||||||
|
|
||||||
|
|
||||||
if (device->keep_shader_info) {
|
if (device->keep_shader_info) {
|
||||||
|
variant->nir_string = radv_dump_nir_shaders(shaders, shader_count);
|
||||||
if (!gs_copy_shader && !module->nir) {
|
if (!gs_copy_shader && !module->nir) {
|
||||||
variant->nir = *shaders;
|
|
||||||
variant->spirv = (uint32_t *)module->data;
|
variant->spirv = (uint32_t *)module->data;
|
||||||
variant->spirv_size = module->size;
|
variant->spirv_size = module->size;
|
||||||
}
|
}
|
||||||
@@ -1239,7 +1262,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->nir_string);
|
||||||
free(variant->disasm_string);
|
free(variant->disasm_string);
|
||||||
free(variant->llvm_ir_string);
|
free(variant->llvm_ir_string);
|
||||||
free(variant);
|
free(variant);
|
||||||
|
@@ -354,7 +354,7 @@ struct radv_shader_variant {
|
|||||||
/* debug only */
|
/* debug only */
|
||||||
uint32_t *spirv;
|
uint32_t *spirv;
|
||||||
uint32_t spirv_size;
|
uint32_t spirv_size;
|
||||||
struct nir_shader *nir;
|
char *nir_string;
|
||||||
char *disasm_string;
|
char *disasm_string;
|
||||||
char *llvm_ir_string;
|
char *llvm_ir_string;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user