From 7158f2eb8bbe75d0f843c005ecfc098af8e0bc3c Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Fri, 9 May 2025 10:50:22 +0200 Subject: [PATCH] pan/lib: Make pan_shader_compile not GENX Signed-off-by: Mary Guillemard Acked-by: Boris Brezillon Reviewed-by: Olivia Lee Part-of: --- src/gallium/drivers/panfrost/pan_blend_cso.c | 2 +- src/gallium/drivers/panfrost/pan_cmdstream.c | 2 +- src/gallium/drivers/panfrost/pan_fb_preload.c | 2 +- src/panfrost/clc/panfrost_compile.c | 65 +---------- src/panfrost/lib/meson.build | 1 + src/panfrost/lib/pan_indirect_dispatch.c | 2 +- src/panfrost/lib/pan_shader.c | 104 +++++++++--------- src/panfrost/lib/pan_shader.h | 13 +-- src/panfrost/vulkan/panvk_vX_shader.c | 4 +- 9 files changed, 72 insertions(+), 123 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c index b386dbdc932..1f015b2dd37 100644 --- a/src/gallium/drivers/panfrost/pan_blend_cso.c +++ b/src/gallium/drivers/panfrost/pan_blend_cso.c @@ -121,7 +121,7 @@ GENX(pan_blend_get_shader_locked)(struct pan_blend_shader_cache *cache, struct util_dynarray binary; util_dynarray_init(&binary, NULL); - GENX(pan_shader_compile)(nir, &inputs, &binary, &info); + pan_shader_compile(nir, &inputs, &binary, &info); struct panfrost_ptr bin = pan_pool_alloc_aligned(cache->bin_pool, binary.size, 64); diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 6e7fcb8f33d..65d98c28315 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -4388,7 +4388,7 @@ GENX(panfrost_cmdstream_screen_init)(struct panfrost_screen *screen) screen->vtbl.submit_batch = submit_batch; screen->vtbl.get_blend_shader = GENX(pan_blend_get_shader_locked); screen->vtbl.get_compiler_options = GENX(pan_shader_get_compiler_options); - screen->vtbl.compile_shader = GENX(pan_shader_compile); + screen->vtbl.compile_shader = pan_shader_compile; screen->vtbl.afbc_size = panfrost_afbc_size; screen->vtbl.afbc_pack = panfrost_afbc_pack; screen->vtbl.mtk_detile = panfrost_mtk_detile_compute; diff --git a/src/gallium/drivers/panfrost/pan_fb_preload.c b/src/gallium/drivers/panfrost/pan_fb_preload.c index f65468d2b95..8edf1b545b0 100644 --- a/src/gallium/drivers/panfrost/pan_fb_preload.c +++ b/src/gallium/drivers/panfrost/pan_fb_preload.c @@ -566,7 +566,7 @@ pan_preload_get_shader(struct pan_fb_preload_cache *cache, lower_sampler_parameters, nir_metadata_control_flow, NULL); } - GENX(pan_shader_compile)(b.shader, &inputs, &binary, &shader->info); + pan_shader_compile(b.shader, &inputs, &binary, &shader->info); shader->key = *key; shader->address = diff --git a/src/panfrost/clc/panfrost_compile.c b/src/panfrost/clc/panfrost_compile.c index 26e5074c5a0..1edcafaf789 100644 --- a/src/panfrost/clc/panfrost_compile.c +++ b/src/panfrost/clc/panfrost_compile.c @@ -283,64 +283,9 @@ remap_variant(nir_function *func, unsigned variant, const char *target) return "default"; } -void pan_shader_compile_v6(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -void pan_shader_compile_v7(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -void pan_shader_compile_v9(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -void pan_shader_compile_v10(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -void pan_shader_compile_v12(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -void pan_shader_compile_v13(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - -static void -shader_compile(int arch, nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, struct pan_shader_info *info) -{ - switch (arch) { - case 6: - pan_shader_compile_v6(nir, inputs, binary, info); - break; - case 7: - pan_shader_compile_v7(nir, inputs, binary, info); - break; - case 9: - pan_shader_compile_v9(nir, inputs, binary, info); - break; - case 10: - pan_shader_compile_v10(nir, inputs, binary, info); - break; - case 12: - pan_shader_compile_v12(nir, inputs, binary, info); - break; - case 13: - pan_shader_compile_v13(nir, inputs, binary, info); - break; - default: - unreachable("Unknown arch!"); - } -} +void pan_shader_compile(nir_shader *nir, struct panfrost_compile_inputs *inputs, + struct util_dynarray *binary, + struct pan_shader_info *info); int main(int argc, const char **argv) @@ -479,8 +424,8 @@ main(int argc, const char **argv) struct util_dynarray shader_binary; struct pan_shader_info shader_info = {0}; util_dynarray_init(&shader_binary, NULL); - shader_compile(target_arch, clone, &inputs, &shader_binary, - &shader_info); + pan_shader_compile(clone, &inputs, &shader_binary, + &shader_info); assert(shader_info.push.count * 4 <= BIFROST_PRECOMPILED_KERNEL_ARGS_SIZE && diff --git a/src/panfrost/lib/meson.build b/src/panfrost/lib/meson.build index b5cb30bce30..bd1f1140b12 100644 --- a/src/panfrost/lib/meson.build +++ b/src/panfrost/lib/meson.build @@ -59,6 +59,7 @@ libpanfrost_lib_files = files( 'pan_clear.c', 'pan_earlyzs.c', 'pan_samples.c', + 'pan_shader.c', 'pan_tiler.c', 'pan_layout.c', 'pan_scratch.c', diff --git a/src/panfrost/lib/pan_indirect_dispatch.c b/src/panfrost/lib/pan_indirect_dispatch.c index b330fc6752a..dc608d8edfd 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.c +++ b/src/panfrost/lib/pan_indirect_dispatch.c @@ -114,7 +114,7 @@ pan_indirect_dispatch_init(struct pan_indirect_dispatch_meta *meta) util_dynarray_init(&binary, NULL); pan_shader_preprocess(b.shader, inputs.gpu_id); - GENX(pan_shader_compile)(b.shader, &inputs, &binary, &shader_info); + pan_shader_compile(b.shader, &inputs, &binary, &shader_info); ralloc_free(b.shader); diff --git a/src/panfrost/lib/pan_shader.c b/src/panfrost/lib/pan_shader.c index 52d4ceb5b65..ce75adc7aa0 100644 --- a/src/panfrost/lib/pan_shader.c +++ b/src/panfrost/lib/pan_shader.c @@ -27,12 +27,10 @@ #include "pan_blend.h" #include "pan_format.h" -#if PAN_ARCH <= 5 -#include "panfrost/midgard/midgard_compile.h" -#else #include "panfrost/compiler/bifrost_compile.h" -#endif +#include "panfrost/midgard/midgard_compile.h" +#ifdef PAN_ARCH const nir_shader_compiler_options * GENX(pan_shader_get_compiler_options)(void) { @@ -68,20 +66,21 @@ pan_raw_format_mask_midgard(enum pipe_format *formats) } #endif +#else void -GENX(pan_shader_compile)(nir_shader *s, struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info) +pan_shader_compile(nir_shader *s, struct panfrost_compile_inputs *inputs, + struct util_dynarray *binary, struct pan_shader_info *info) { + unsigned arch = pan_arch(inputs->gpu_id); + memset(info, 0, sizeof(*info)); NIR_PASS(_, s, nir_lower_printf_buffer, 0, LIBPAN_PRINTF_BUFFER_SIZE - 8); -#if PAN_ARCH >= 6 - bifrost_compile_shader_nir(s, inputs, binary, info); -#else - midgard_compile_shader_nir(s, inputs, binary, info); -#endif + if (arch >= 6) + bifrost_compile_shader_nir(s, inputs, binary, info); + else + midgard_compile_shader_nir(s, inputs, binary, info); info->stage = s->info.stage; info->contains_barrier = @@ -94,28 +93,30 @@ GENX(pan_shader_compile)(nir_shader *s, struct panfrost_compile_inputs *inputs, info->attributes_read_count = util_bitcount64(info->attributes_read); info->attribute_count = info->attributes_read_count; -#if PAN_ARCH <= 5 - if (info->midgard.vs.reads_raw_vertex_id) - info->attribute_count = MAX2(info->attribute_count, PAN_VERTEX_ID + 1); + if (arch <= 5) { + if (info->midgard.vs.reads_raw_vertex_id) + info->attribute_count = + MAX2(info->attribute_count, PAN_VERTEX_ID + 1); - bool instance_id = - BITSET_TEST(s->info.system_values_read, SYSTEM_VALUE_INSTANCE_ID); - if (instance_id) - info->attribute_count = - MAX2(info->attribute_count, PAN_INSTANCE_ID + 1); -#endif + bool instance_id = + BITSET_TEST(s->info.system_values_read, SYSTEM_VALUE_INSTANCE_ID); + if (instance_id) + info->attribute_count = + MAX2(info->attribute_count, PAN_INSTANCE_ID + 1); + } info->vs.writes_point_size = s->info.outputs_written & (1 << VARYING_SLOT_PSIZ); -#if PAN_ARCH >= 9 - info->varyings.output_count = - util_last_bit(s->info.outputs_written >> VARYING_SLOT_VAR0); + if (arch >= 9) { + info->varyings.output_count = + util_last_bit(s->info.outputs_written >> VARYING_SLOT_VAR0); - /* Store the mask of special varyings, in case we need to emit ADs later. */ - info->varyings.fixed_varyings = - panfrost_get_fixed_varying_mask(s->info.outputs_written); -#endif + /* Store the mask of special varyings, in case we need to emit ADs + * later. */ + info->varyings.fixed_varyings = + panfrost_get_fixed_varying_mask(s->info.outputs_written); + } break; case MESA_SHADER_FRAGMENT: if (s->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) @@ -161,14 +162,15 @@ GENX(pan_shader_compile)(nir_shader *s, struct panfrost_compile_inputs *inputs, info->fs.reads_face = (s->info.inputs_read & (1 << VARYING_SLOT_FACE)) || BITSET_TEST(s->info.system_values_read, SYSTEM_VALUE_FRONT_FACE); -#if PAN_ARCH >= 9 - info->varyings.input_count = - util_last_bit(s->info.inputs_read >> VARYING_SLOT_VAR0); + if (arch >= 9) { + info->varyings.input_count = + util_last_bit(s->info.inputs_read >> VARYING_SLOT_VAR0); - /* Store the mask of special varyings, in case we need to emit ADs later. */ - info->varyings.fixed_varyings = - panfrost_get_fixed_varying_mask(s->info.inputs_read); -#endif + /* Store the mask of special varyings, in case we need to emit ADs + * later. */ + info->varyings.fixed_varyings = + panfrost_get_fixed_varying_mask(s->info.inputs_read); + } break; default: /* Everything else treated as compute */ @@ -188,22 +190,24 @@ GENX(pan_shader_compile)(nir_shader *s, struct panfrost_compile_inputs *inputs, info->ftz_fp16 = nir_is_denorm_flush_to_zero(execution_mode, 16); info->ftz_fp32 = nir_is_denorm_flush_to_zero(execution_mode, 32); -#if PAN_ARCH >= 9 - /* Valhall hardware doesn't have a "flush FP16, preserve FP32" mode, and we - * don't advertise independent FP16/FP32 denorm modes in panvk, but it's - * still possible to have shaders that don't specify any denorm mode for - * FP32. In that case, default to flush FP32. */ - if (info->ftz_fp16 && !info->ftz_fp32) { - assert(!nir_is_denorm_preserve(execution_mode, 32)); - info->ftz_fp32 = true; + if (arch >= 9) { + /* Valhall hardware doesn't have a "flush FP16, preserve FP32" mode, and + * we don't advertise independent FP16/FP32 denorm modes in panvk, but + * it's still possible to have shaders that don't specify any denorm mode + * for FP32. In that case, default to flush FP32. */ + if (info->ftz_fp16 && !info->ftz_fp32) { + assert(!nir_is_denorm_preserve(execution_mode, 32)); + info->ftz_fp32 = true; + } } -#endif -#if PAN_ARCH >= 6 - /* This is "redundant" information, but is needed in a draw-time hot path */ - for (unsigned i = 0; i < ARRAY_SIZE(info->bifrost.blend); ++i) { - info->bifrost.blend[i].format = - pan_blend_type_from_nir(info->bifrost.blend[i].type); + if (arch >= 6) { + /* This is "redundant" information, but is needed in a draw-time hot path */ + for (unsigned i = 0; i < ARRAY_SIZE(info->bifrost.blend); ++i) { + info->bifrost.blend[i].format = + pan_blend_type_from_nir(info->bifrost.blend[i].type); + } } -#endif } + +#endif diff --git a/src/panfrost/lib/pan_shader.h b/src/panfrost/lib/pan_shader.h index 3864f2dfc6c..32b7dfd08f4 100644 --- a/src/panfrost/lib/pan_shader.h +++ b/src/panfrost/lib/pan_shader.h @@ -26,13 +26,13 @@ #define __PAN_SHADER_H__ #include "compiler/nir/nir.h" +#include "genxml/gen_macros.h" #include "panfrost/compiler/bifrost/disassemble.h" #include "panfrost/compiler/valhall/disassemble.h" +#include "panfrost/lib/pan_props.h" #include "panfrost/midgard/disassemble.h" #include "panfrost/util/pan_ir.h" #include "panfrost/util/pan_lower_framebuffer.h" -#include "panfrost/lib/pan_props.h" -#include "genxml/gen_macros.h" void bifrost_preprocess_nir(nir_shader *nir, unsigned gpu_id); void midgard_preprocess_nir(nir_shader *nir, unsigned gpu_id); @@ -67,14 +67,13 @@ pan_shader_disassemble(FILE *fp, const void *code, size_t size, unsigned gpu_id, uint8_t pan_raw_format_mask_midgard(enum pipe_format *formats); +void pan_shader_compile(nir_shader *nir, struct panfrost_compile_inputs *inputs, + struct util_dynarray *binary, + struct pan_shader_info *info); + #ifdef PAN_ARCH const nir_shader_compiler_options *GENX(pan_shader_get_compiler_options)(void); -void GENX(pan_shader_compile)(nir_shader *nir, - struct panfrost_compile_inputs *inputs, - struct util_dynarray *binary, - struct pan_shader_info *info); - #if PAN_ARCH >= 9 static inline enum mali_shader_stage pan_shader_stage(const struct pan_shader_info *info) diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 78243e122f3..fdcaf7b96ea 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -884,7 +884,7 @@ panvk_compile_nir(struct panvk_device *dev, nir_shader *nir, struct util_dynarray binary; util_dynarray_init(&binary, NULL); - GENX(pan_shader_compile)(nir, compile_input, &binary, &shader->info); + pan_shader_compile(nir, compile_input, &binary, &shader->info); void *bin_ptr = util_dynarray_element(&binary, uint8_t, 0); unsigned bin_size = util_dynarray_num_elements(&binary, uint8_t); @@ -1989,7 +1989,7 @@ panvk_per_arch(create_internal_shader)( struct util_dynarray binary; util_dynarray_init(&binary, nir); - GENX(pan_shader_compile)(nir, compiler_inputs, &binary, &shader->info); + pan_shader_compile(nir, compiler_inputs, &binary, &shader->info); unsigned bin_size = util_dynarray_num_elements(&binary, uint8_t); if (bin_size) {