From 2b638c1eb347c645868b87b192763e4664bbe783 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 25 Jan 2022 19:14:17 -0500 Subject: [PATCH] panfrost: Don't pass quirks to pan_lower_framebuffer There is a single quirk it cares about. Pass just that, so the relevant quirk can be made a Midgard compiler quirk and not a global Panfrost quirk. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/midgard/midgard_compile.c | 3 +-- src/panfrost/midgard/midgard_quirks.h | 6 +++++- src/panfrost/util/pan_lower_framebuffer.c | 20 ++++++++------------ src/panfrost/util/pan_lower_framebuffer.h | 2 +- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 78afc09bde7..1caac7e948f 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -3091,10 +3091,9 @@ midgard_compile_shader_nir(nir_shader *nir, NIR_PASS_V(nir, nir_lower_var_copies); NIR_PASS_V(nir, nir_lower_vars_to_ssa); - unsigned pan_quirks = panfrost_get_quirks(inputs->gpu_id, 0); NIR_PASS_V(nir, pan_lower_framebuffer, inputs->rt_formats, inputs->raw_fmt_mask, - inputs->is_blend, pan_quirks); + inputs->is_blend, ctx->quirks & MIDGARD_BROKEN_BLEND_LOADS); NIR_PASS_V(nir, nir_lower_io, nir_var_shader_in | nir_var_shader_out, glsl_type_size, 0); diff --git a/src/panfrost/midgard/midgard_quirks.h b/src/panfrost/midgard/midgard_quirks.h index 70d46f49804..3e7c2a0280e 100644 --- a/src/panfrost/midgard/midgard_quirks.h +++ b/src/panfrost/midgard/midgard_quirks.h @@ -28,7 +28,10 @@ * may be errata requiring a workaround, or features. We're trying to be * quirk-positive here; quirky is the best! */ -/* bit 0 unused */ +/* Typed loads are broken on this Midgard GPU due to issue #10607 and #10632 and + * should use software unpacks instead. + */ +#define MIDGARD_BROKEN_BLEND_LOADS (1 << 0) /* Whether output texture registers (normally r28/r29) overlap with work * registers r0/r1 and input texture registers (also normally r28/r29) overlap @@ -70,6 +73,7 @@ midgard_get_quirks(unsigned gpu_id) case 0x600: case 0x620: return MIDGARD_OLD_BLEND | + MIDGARD_BROKEN_BLEND_LOADS | MIDGARD_BROKEN_LOD | MIDGARD_NO_UPPER_ALU | MIDGARD_NO_OOO; diff --git a/src/panfrost/util/pan_lower_framebuffer.c b/src/panfrost/util/pan_lower_framebuffer.c index 6baa9189b58..01d28de666b 100644 --- a/src/panfrost/util/pan_lower_framebuffer.c +++ b/src/panfrost/util/pan_lower_framebuffer.c @@ -88,17 +88,14 @@ pan_unpacked_type_for_format(const struct util_format_description *desc) } static bool -pan_is_format_native(const struct util_format_description *desc, unsigned quirks, bool is_store) +pan_is_format_native(const struct util_format_description *desc, bool broken_ld_special, bool is_store) { - if (is_store) + if (is_store || broken_ld_special) return false; if (util_format_is_pure_integer(desc->format) || util_format_is_float(desc->format)) return false; - if (quirks & MIDGARD_NO_TYPED_BLEND_LOADS) - return false; - /* Some formats are missing as typed but have unpacks */ if (desc->format == PIPE_FORMAT_R11G11B10_FLOAT) return false; @@ -490,8 +487,7 @@ pan_lower_fb_store(nir_shader *shader, nir_builder *b, nir_intrinsic_instr *intr, const struct util_format_description *desc, - bool reorder_comps, - unsigned quirks) + bool reorder_comps) { /* For stores, add conversion before */ nir_ssa_def *unpacked = nir_ssa_for_src(b, intr->src[1], 4); @@ -517,7 +513,7 @@ pan_lower_fb_load(nir_shader *shader, nir_intrinsic_instr *intr, const struct util_format_description *desc, bool reorder_comps, - unsigned base, int sample, unsigned quirks) + unsigned base, int sample) { nir_ssa_def *packed = nir_load_raw_output_pan(b, 4, 32, pan_sample_id(b, sample), @@ -555,7 +551,7 @@ pan_lower_fb_load(nir_shader *shader, bool pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, - uint8_t raw_fmt_mask, bool is_blend, unsigned quirks) + uint8_t raw_fmt_mask, bool is_blend, bool broken_ld_special) { if (shader->info.stage != MESA_SHADER_FRAGMENT) return false; @@ -594,7 +590,7 @@ pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, util_format_description(rt_fmts[rt]); /* Don't lower */ - if (pan_is_format_native(desc, quirks, is_store)) + if (pan_is_format_native(desc, broken_ld_special, is_store)) continue; /* EXT_shader_framebuffer_fetch requires @@ -609,10 +605,10 @@ pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, if (is_store) { b.cursor = nir_before_instr(instr); - pan_lower_fb_store(shader, &b, intr, desc, reorder_comps, quirks); + pan_lower_fb_store(shader, &b, intr, desc, reorder_comps); } else { b.cursor = nir_after_instr(instr); - pan_lower_fb_load(shader, &b, intr, desc, reorder_comps, base, sample, quirks); + pan_lower_fb_load(shader, &b, intr, desc, reorder_comps, base, sample); } nir_instr_remove(instr); diff --git a/src/panfrost/util/pan_lower_framebuffer.h b/src/panfrost/util/pan_lower_framebuffer.h index 23230b648d3..aab8e4bcdef 100644 --- a/src/panfrost/util/pan_lower_framebuffer.h +++ b/src/panfrost/util/pan_lower_framebuffer.h @@ -35,6 +35,6 @@ nir_alu_type pan_unpacked_type_for_format(const struct util_format_description * bool pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, uint8_t raw_fmt_mask, - bool is_blend, unsigned quirks); + bool is_blend, bool broken_ld_special); #endif