mirror of https://gitlab.freedesktop.org/mesa/mesa
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:
parent
7dcd5f1f02
commit
5fbd8bb694
|
@ -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 -->
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue