From 5b29daf7bc3f619eecca6dd852944f3a8dc35427 Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Tue, 24 Dec 2024 12:37:07 +0000 Subject: [PATCH] nir/precompiled: add helper to emit an enum map for multiple targets Signed-off-by: Simon Perretta Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_precompiled.h | 60 ++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/compiler/nir/nir_precompiled.h b/src/compiler/nir/nir_precompiled.h index 01eed53fbd3..d3bc466e60c 100644 --- a/src/compiler/nir/nir_precompiled.h +++ b/src/compiler/nir/nir_precompiled.h @@ -6,6 +6,7 @@ #pragma once #include +#include #include "nir.h" #include "nir_builder.h" #include "nir_serialize.h" @@ -566,6 +567,65 @@ nir_precomp_print_binary_map(FILE *fp, const nir_shader *nir, fprintf(fp, "};\n\n"); } +static inline void +nir_precomp_print_target_enum_map(FILE *fp_c, FILE *fp_h, const char *prefix, unsigned num_targets, const char **targets, uint64_t *target_ids) +{ + /* Generate an enum indexing all devices */ + fprintf(fp_h, "enum %s_target {\n", prefix); + for (unsigned t = 0; t < num_targets; ++t) { + fprintf(fp_h, " "); + nir_print_uppercase(fp_h, prefix); + fprintf(fp_h, "_TARGET_"); + nir_print_uppercase(fp_h, targets[t]); + fprintf(fp_h, " = %u,\n", t); + } + fprintf(fp_h, " "); + nir_print_uppercase(fp_h, prefix); + fprintf(fp_h, "_NUM_TARGETS,\n"); + fprintf(fp_h, "};\n"); + + if (!target_ids) + return; + + fprintf(fp_h, "extern const uint64_t %s_target_id_map[", prefix); + nir_print_uppercase(fp_h, prefix); + fprintf(fp_h, "_NUM_TARGETS"); + fprintf(fp_h, "];\n"); + + fprintf(fp_c, "const uint64_t %s_target_id_map[", prefix); + nir_print_uppercase(fp_c, prefix); + fprintf(fp_c, "_NUM_TARGETS"); + fprintf(fp_c, "] = {\n"); + for (unsigned t = 0; t < num_targets; ++t) { + fprintf(fp_c, " ["); + nir_print_uppercase(fp_c, prefix); + fprintf(fp_c, "_TARGET_"); + nir_print_uppercase(fp_c, targets[t]); + fprintf(fp_c, "] = 0x%" PRIx64 ",\n", target_ids[t]); + } + fprintf(fp_c, "};\n\n"); +} + +static inline void +nir_precomp_print_target_binary_map(FILE *fp_c, FILE *fp_h, const char *prefix, unsigned num_targets, const char **targets) +{ + fprintf(fp_h, "extern const uint32_t **%s_targets[", prefix); + nir_print_uppercase(fp_h, prefix); + fprintf(fp_h, "_NUM_TARGETS];\n"); + + fprintf(fp_c, "const uint32_t **%s_targets[", prefix); + nir_print_uppercase(fp_c, prefix); + fprintf(fp_c, "_NUM_TARGETS] = {\n"); + for (unsigned t = 0; t < num_targets; ++t) { + fprintf(fp_c, " ["); + nir_print_uppercase(fp_c, prefix); + fprintf(fp_c, "_TARGET_"); + nir_print_uppercase(fp_c, targets[t]); + fprintf(fp_c, "] = %s_%s,\n", prefix, targets[t]); + } + fprintf(fp_c, "};\n\n"); +} + static inline nir_shader * nir_precompiled_build_variant(const nir_function *libfunc, unsigned variant, const nir_shader_compiler_options *opts,