From 5fbd8bb694fc5be413274c0292189747f87a71ff Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 22 Apr 2024 19:40:46 -0400 Subject: [PATCH] asahi: split frag shader words Isolate the counts from the rest, in particular. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/genxml/cmdbuf.xml | 23 +++++++++++++++-------- src/asahi/lib/agx_ppp.h | 8 +++++++- src/asahi/lib/decode.c | 24 ++++++++++++++++-------- src/gallium/drivers/asahi/agx_state.c | 20 ++++++++++++++------ 4 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/asahi/genxml/cmdbuf.xml b/src/asahi/genxml/cmdbuf.xml index dffed5469c3..7e07d54e132 100644 --- a/src/asahi/genxml/cmdbuf.xml +++ b/src/asahi/genxml/cmdbuf.xml @@ -595,22 +595,29 @@ - + - - - - - - + + + + + + + + + + + + + diff --git a/src/asahi/lib/agx_ppp.h b/src/asahi/lib/agx_ppp.h index 2020fcda41d..2a7f710ef05 100644 --- a/src/asahi/lib/agx_ppp.h +++ b/src/asahi/lib/agx_ppp.h @@ -51,7 +51,13 @@ agx_ppp_update_size(struct AGX_PPP_HEADER *present) PPP_CASE(varying_counts_16, VARYING_COUNTS); PPP_CASE(cull, CULL); PPP_CASE(cull_2, CULL_2); - PPP_CASE(fragment_shader, FRAGMENT_SHADER); + + if (present->fragment_shader) { + size += + AGX_FRAGMENT_SHADER_WORD_0_LENGTH + AGX_FRAGMENT_SHADER_WORD_1_LENGTH + + AGX_FRAGMENT_SHADER_WORD_2_LENGTH + AGX_FRAGMENT_SHADER_WORD_3_LENGTH; + } + PPP_CASE(occlusion_query, FRAGMENT_OCCLUSION_QUERY); PPP_CASE(occlusion_query_2, FRAGMENT_OCCLUSION_QUERY_2); PPP_CASE(output_unknown, OUTPUT_UNKNOWN); diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c index f8230fa7b92..1689f2e959c 100644 --- a/src/asahi/lib/decode.c +++ b/src/asahi/lib/decode.c @@ -613,28 +613,36 @@ agxdecode_record(struct agxdecode_ctx *ctx, uint64_t va, size_t size, PPP_PRINT(map, cull_2, CULL_2, "Cull 2"); if (hdr.fragment_shader) { - agx_unpack(agxdecode_dump_stream, map, FRAGMENT_SHADER, frag); - agxdecode_stateful(ctx, frag.pipeline, "Fragment pipeline", agxdecode_usc, - verbose, params, &frag.sampler_state_register_count); + agx_unpack(agxdecode_dump_stream, map, FRAGMENT_SHADER_WORD_0, frag_0); + agx_unpack(agxdecode_dump_stream, map + 4, FRAGMENT_SHADER_WORD_1, + frag_1); + agx_unpack(agxdecode_dump_stream, map + 8, FRAGMENT_SHADER_WORD_2, + frag_2); + agxdecode_stateful(ctx, frag_1.pipeline, "Fragment pipeline", + agxdecode_usc, verbose, params, + &frag_0.sampler_state_register_count); - if (frag.cf_bindings) { + if (frag_2.cf_bindings) { uint8_t buf[128]; uint8_t *cf = buf; - agxdecode_fetch_gpu_array(ctx, frag.cf_bindings, buf); + agxdecode_fetch_gpu_array(ctx, frag_2.cf_bindings, buf); u_hexdump(agxdecode_dump_stream, cf, 128, false); DUMP_CL(CF_BINDING_HEADER, cf, "Coefficient binding header:"); cf += AGX_CF_BINDING_HEADER_LENGTH; - for (unsigned i = 0; i < frag.cf_binding_count; ++i) { + for (unsigned i = 0; i < frag_0.cf_binding_count; ++i) { DUMP_CL(CF_BINDING, cf, "Coefficient binding:"); cf += AGX_CF_BINDING_LENGTH; } } - DUMP_UNPACKED(FRAGMENT_SHADER, frag, "Fragment shader\n"); - map += AGX_FRAGMENT_SHADER_LENGTH; + DUMP_CL(FRAGMENT_SHADER_WORD_0, map, "Fragment shader word 0"); + DUMP_CL(FRAGMENT_SHADER_WORD_1, map + 4, "Fragment shader word 1"); + DUMP_CL(FRAGMENT_SHADER_WORD_2, map + 8, "Fragment shader word 2"); + DUMP_CL(FRAGMENT_SHADER_WORD_3, map + 12, "Fragment shader word 3"); + map += 16; } PPP_PRINT(map, occlusion_query, FRAGMENT_OCCLUSION_QUERY, "Occlusion query"); diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index a362cdd1952..494cc2a7532 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -3629,9 +3629,7 @@ agx_encode_state(struct agx_batch *batch, uint8_t *out) if (dirty.fragment_shader) { unsigned frag_tex_count = ctx->stage[PIPE_SHADER_FRAGMENT].texture_count; - agx_ppp_push(&ppp, FRAGMENT_SHADER, cfg) { - cfg.pipeline = agx_build_pipeline(batch, ctx->fs, ctx->linked.fs, - PIPE_SHADER_FRAGMENT, 0, 0), + agx_ppp_push(&ppp, FRAGMENT_SHADER_WORD_0, cfg) { cfg.uniform_register_count = ctx->fs->b.info.push_count; cfg.preshader_register_count = ctx->fs->b.info.nr_preamble_gprs; cfg.texture_state_register_count = @@ -3639,10 +3637,20 @@ agx_encode_state(struct agx_batch *batch, uint8_t *out) cfg.sampler_state_register_count = translate_sampler_state_count(ctx, ctx->fs, PIPE_SHADER_FRAGMENT); cfg.cf_binding_count = ctx->linked.fs->cf.nr_bindings; - cfg.cf_bindings = batch->varyings; + } - /* XXX: This is probably wrong */ - cfg.unknown_30 = frag_tex_count >= 4; + agx_ppp_push(&ppp, FRAGMENT_SHADER_WORD_1, cfg) { + cfg.pipeline = agx_build_pipeline(batch, ctx->fs, ctx->linked.fs, + PIPE_SHADER_FRAGMENT, 0, 0); + } + + agx_ppp_push(&ppp, FRAGMENT_SHADER_WORD_2, cfg) { + cfg.cf_bindings = batch->varyings; + } + + agx_ppp_push(&ppp, FRAGMENT_SHADER_WORD_3, cfg) { + /* XXX: This is wrong */ + cfg.unknown = frag_tex_count >= 4; } }