diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 1760b453487..fb1de764bef 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4308,6 +4308,7 @@ void nir_log_shader_annotated_tagged(enum mesa_log_level level, const char *tag, char *nir_shader_as_str(nir_shader *nir, void *mem_ctx); char *nir_shader_as_str_annotated(nir_shader *nir, struct hash_table *annotations, void *mem_ctx); +char *nir_instr_as_str(const nir_instr *instr, void *mem_ctx); /** Shallow clone of a single instruction. */ nir_instr *nir_instr_clone(nir_shader *s, const nir_instr *orig); diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index 8d5cb3cafeb..3162f0d3714 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -1801,7 +1801,27 @@ nir_print_instr(const nir_instr *instr, FILE *fp) } print_instr(instr, &state, 0); +} +char * +nir_instr_as_str(const nir_instr *instr, void *mem_ctx) +{ + char *stream_data = NULL; + size_t stream_size = 0; + struct u_memstream mem; + if (u_memstream_open(&mem, &stream_data, &stream_size)) { + FILE *const stream = u_memstream_get(&mem); + nir_print_instr(instr, stream); + u_memstream_close(&mem); + } + + char *str = ralloc_size(mem_ctx, stream_size + 1); + memcpy(str, stream_data, stream_size); + str[stream_size] = '\0'; + + free(stream_data); + + return str; } void