asahi: split frag shader words

Isolate the counts from the rest, in particular.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29247>
This commit is contained in:
Alyssa Rosenzweig 2024-04-22 19:40:46 -04:00
parent 7dcd5f1f02
commit 5fbd8bb694
4 changed files with 52 additions and 23 deletions

View File

@ -595,22 +595,29 @@
<field name="Depth bias" size="16" start="16" type="uint"/>
</struct>
<struct name="Fragment shader" size="16">
<struct name="Fragment Shader Word 0" size="4">
<field name="Unknown 0" size="1" start="0" type="hex" default="0"/>
<field name="Uniform register count" size="3" start="1" type="uint" modifier="groups(64)"/>
<field name="Texture state register count" size="5" start="4" type="uint" modifier="groups(8)"/>
<field name="Sampler state register count" size="3" start="9" type="Sampler states"/>
<field name="Preshader register count" size="4" start="12" type="uint" modifier="groups(16)"/>
<field name="CF binding count" size="7" start="16" type="uint"/>
<field name="Unknown 1:0" size="2" start="1:0" type="hex"/>
<field name="Pipeline" size="26" start="1:6" type="address" modifier="shr(6)"/>
<field name="CF bindings" size="30" start="2:2" type="address" modifier="shr(2)"/>
<!-- Seems to be set to small values depending on textures? and pushed
uniforms? Needs investigation -->
<field name="Unknown 3:0" start="3:0" size="4" type="hex"/>
</struct>
<struct name="Fragment Shader Word 1" size="4">
<field name="Unknown 1:0" size="2" start="0" type="hex"/>
<field name="Pipeline" size="26" start="6" type="address" modifier="shr(6)"/>
</struct>
<struct name="Fragment Shader Word 2" size="4">
<field name="CF bindings" size="30" start="2" type="address" modifier="shr(2)"/>
</struct>
<struct name="Fragment Shader Word 3" size="4">
<!-- Seems to be set to small values depending on textures? and pushed
uniforms? Needs investigation -->
<field name="Unknown" start="0" size="4" type="hex"/>
</struct>
<!-- PPP state ends -->
<!-- USC state starts -->

View File

@ -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);

View File

@ -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");

View File

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