From 2bdb8ba3ce3c8f4ccda533f67ed4ed0667bf5345 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 3 Sep 2022 14:01:03 -0400 Subject: [PATCH] asahi: Correct SET_SHADER_EXTENDED disambig bit This is still a guess, but a considerably firmer one as it now corrects handles the clear pipelines emitted by Metal as well as the regular vertex/fragment shader, and gets rid of the preshader special cases seen there. Fixes decode of clear pipeline's preshaders. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/lib/cmdbuf.xml | 4 ++-- src/asahi/lib/decode.c | 3 +-- src/gallium/drivers/asahi/agx_state.c | 15 +++++---------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/asahi/lib/cmdbuf.xml b/src/asahi/lib/cmdbuf.xml index d77d8c2020a..05285c8158d 100644 --- a/src/asahi/lib/cmdbuf.xml +++ b/src/asahi/lib/cmdbuf.xml @@ -448,7 +448,7 @@ - + @@ -479,7 +479,7 @@ - + diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c index a31a27bce42..d8980d49a37 100644 --- a/src/asahi/lib/decode.c +++ b/src/asahi/lib/decode.c @@ -305,8 +305,7 @@ agxdecode_pipeline(const uint8_t *map, UNUSED bool verbose) { uint8_t zeroes[16] = { 0 }; - if (map[0] == 0x4D && map[1] == 0xbd) { - /* TODO: Disambiguation for extended is a guess */ + if (map[0] == 0x4D && (map[11] & BITFIELD_BIT(5))) { agx_unpack(agxdecode_dump_stream, map, SET_SHADER_EXTENDED, cmd); DUMP_UNPACKED(SET_SHADER_EXTENDED, cmd, "Set shader\n"); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 9066561c098..e5a24876398 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -1244,7 +1244,6 @@ agx_build_pipeline(struct agx_context *ctx, struct agx_compiled_shader *cs, enum cfg.unk_2 = 0x0d; cfg.loads_varyings = true; cfg.fragment_parameters.early_z_testing = !writes_sample_mask; - cfg.unk_3b = 0x1; cfg.unk_4 = 0x800; cfg.preshader_unk = 0xc080; cfg.spill_size = 0x2; @@ -1288,19 +1287,15 @@ agx_build_clear_pipeline(struct agx_context *ctx, uint32_t code, uint64_t clear_ record += AGX_BIND_UNIFORM_LENGTH; /* TODO: Can we prepack this? */ - agx_pack(record, SET_SHADER_EXTENDED, cfg) { + agx_pack(record, SET_SHADER, cfg) { cfg.code = code; - cfg.register_quadwords = 1; - cfg.unk_3 = 0x8d; + cfg.unk_1 = 0x2010bd; cfg.unk_2 = 0x0d; - cfg.fragment_parameters.unk_1 = 0x880100; - cfg.fragment_parameters.early_z_testing = false; - cfg.fragment_parameters.unk_2 = false; - cfg.fragment_parameters.unk_3 = 0; - cfg.preshader_mode = 0; // XXX + cfg.unk_3 = 0x8d; + cfg.register_quadwords = 1; } - record += AGX_SET_SHADER_EXTENDED_LENGTH; + record += AGX_SET_SHADER_LENGTH; /* End pipeline */ memset(record, 0, 8);