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;
}
}