diff --git a/src/panfrost/bifrost/bi_print.c b/src/panfrost/bifrost/bi_print.c index db86fb055f0..c546bd6af7f 100644 --- a/src/panfrost/bifrost/bi_print.c +++ b/src/panfrost/bifrost/bi_print.c @@ -245,6 +245,14 @@ bi_print_load_vary(struct bi_load_vary *load, FILE *fp) if (load->flat) fprintf(fp, ".flat"); + + switch (load->update_mode) { + case BIFROST_UPDATE_STORE: fprintf(fp, ".store"); break; + case BIFROST_UPDATE_RETRIEVE: fprintf(fp, ".retrieve"); break; + case BIFROST_UPDATE_CONDITIONAL: fprintf(fp, ".conditional"); break; + case BIFROST_UPDATE_CLOBBER: fprintf(fp, ".conditional"); break; + default: unreachable("Invalid update mode"); + } } const char * diff --git a/src/panfrost/bifrost/bifrost.h b/src/panfrost/bifrost/bifrost.h index a0d7d7fbc73..64ded49c7a1 100644 --- a/src/panfrost/bifrost/bifrost.h +++ b/src/panfrost/bifrost/bifrost.h @@ -228,6 +228,13 @@ enum bifrost_interp_mode { BIFROST_INTERP_NONE = 0x4, }; +enum bifrost_update_mode { + BIFROST_UPDATE_STORE, + BIFROST_UPDATE_RETRIEVE, + BIFROST_UPDATE_CONDITIONAL, + BIFROST_UPDATE_CLOBBER, +}; + /* Fixed location for gl_FragCoord.zw */ #define BIFROST_FRAGZ (23) #define BIFROST_FRAGW (22) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index c4604855da4..32429b0ae26 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -567,6 +567,7 @@ bi_emit_ld_frag_coord(bi_context *ctx, nir_intrinsic_instr *instr) .type = BI_LOAD_VAR, .load_vary = { .interp_mode = BIFROST_INTERP_CENTER, + .update_mode = BIFROST_UPDATE_CLOBBER, .reuse = false, .flat = true }, @@ -724,6 +725,9 @@ bi_emit_point_coord(bi_context *ctx, nir_intrinsic_instr *instr) { bi_instruction ins = { .type = BI_LOAD_VAR, + .load_vary = { + .update_mode = BIFROST_UPDATE_CLOBBER, + }, .vector_channels = 2, .dest = pan_dest_index(&instr->dest), .dest_type = nir_type_float32, diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index c044b5803ed..1eb3149efe6 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -134,6 +134,7 @@ extern unsigned bi_class_props[BI_NUM_CLASSES]; /* BI_LD_VARY */ struct bi_load_vary { enum bifrost_interp_mode interp_mode; + enum bifrost_update_mode update_mode; bool reuse; bool flat; }; diff --git a/src/panfrost/bifrost/gen_pack.py b/src/panfrost/bifrost/gen_pack.py index e9025ae3fbc..93ee42020ac 100644 --- a/src/panfrost/bifrost/gen_pack.py +++ b/src/panfrost/bifrost/gen_pack.py @@ -215,15 +215,6 @@ def pack_seg(mod, opts, body, pack_exprs): else: assert(False) -# TODO: Update modes (perf / slow) For now just force store, except for special -# varyings for which we force clobber -def pack_update(mod, opts, body, pack_exprs): - if opts == ['store', 'retrieve', 'conditional', 'clobber']: - return '(ins->constant.u64 >= 20) ? 3 : 0' - else: - assert(opts[0] == 'store') - return '0' - # Processes modifiers. If used directly, emits a pack. Otherwise, just # processes the value (grabbing it from the IR). This must sync with the IR. @@ -273,7 +264,7 @@ modifier_map = { "not_result": pack_not_result, "register_format": pack_register_format, "seg": pack_seg, - "update": pack_update, + "update": lambda a,b,c,d: 'ins->load_vary.update_mode', # Just a minus one modifier "vecsize": lambda a,b,c,d: 'ins->vector_channels - 1',