From c67169d2187fa5cc7a26562a1b34dad345e16d63 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sun, 19 Jun 2022 18:10:09 -0400 Subject: [PATCH] asahi: Fix varying XML Lots of changes from reverse-engineering harder the interactions with fp16 and noperspective and such, and comparing against the PowerVR driver code in Mesa that's been released since this XML was originally written. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/asahi/compiler/agx_compile.c | 35 +++++++++++++++++---------- src/asahi/compiler/agx_compile.h | 2 +- src/asahi/lib/cmdbuf.xml | 33 ++++++++++++------------- src/asahi/lib/decode.c | 15 ++++++------ src/gallium/drivers/asahi/agx_state.c | 16 ++++++------ 5 files changed, 55 insertions(+), 46 deletions(-) diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index 321c2d437ca..ac870459981 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -1538,22 +1538,28 @@ static void agx_remap_varyings_fs(nir_shader *nir, struct agx_varyings *varyings, unsigned *remap) { - struct agx_varying_packed *packed = varyings->packed; + struct agx_cf_binding_packed *packed = varyings->packed; unsigned base = 0; - agx_pack(packed, VARYING, cfg) { - cfg.type = AGX_VARYING_TYPE_FRAGCOORD_W; + agx_pack(packed, CF_BINDING, cfg) { + /* W component */ + cfg.shade_model = AGX_SHADE_MODEL_GOURAUD; cfg.components = 1; - cfg.triangle_slot = cfg.point_slot = base; + cfg.base_slot = base; + cfg.base_coefficient_register = base; } base++; packed++; - agx_pack(packed, VARYING, cfg) { - cfg.type = AGX_VARYING_TYPE_FRAGCOORD_Z; + agx_pack(packed, CF_BINDING, cfg) { + /* Z component */ + cfg.shade_model = AGX_SHADE_MODEL_GOURAUD; + cfg.perspective = true; + cfg.fragcoord_z = true; cfg.components = 1; - cfg.triangle_slot = cfg.point_slot = base; + cfg.base_slot = base; + cfg.base_coefficient_register = base; } base++; @@ -1585,15 +1591,18 @@ agx_remap_varyings_fs(nir_shader *nir, struct agx_varyings *varyings, remap[var->data.driver_location] = base; for (int c = 0; c < sz; ++c) { - agx_pack(packed, VARYING, cfg) { - cfg.type = (var->data.location == VARYING_SLOT_PNTC) ? - AGX_VARYING_TYPE_POINT_COORDINATES : + agx_pack(packed, CF_BINDING, cfg) { + cfg.shade_model = (var->data.interpolation == INTERP_MODE_FLAT) ? - AGX_VARYING_TYPE_FLAT_LAST : - AGX_VARYING_TYPE_SMOOTH; + AGX_SHADE_MODEL_FLAT_VERTEX_2 : + AGX_SHADE_MODEL_GOURAUD; + + cfg.perspective = (var->data.interpolation != INTERP_MODE_FLAT); + cfg.point_sprite = (var->data.location == VARYING_SLOT_PNTC); cfg.components = channels; - cfg.triangle_slot = cfg.point_slot = base; + cfg.base_slot = base; + cfg.base_coefficient_register = base; } base += channels; diff --git a/src/asahi/compiler/agx_compile.h b/src/asahi/compiler/agx_compile.h index 0ad0ff0dc74..f877d04dea7 100644 --- a/src/asahi/compiler/agx_compile.h +++ b/src/asahi/compiler/agx_compile.h @@ -86,7 +86,7 @@ struct agx_push { struct agx_varyings { unsigned nr_descs, nr_slots; - struct agx_varying_packed packed[AGX_MAX_VARYINGS]; + struct agx_cf_binding_packed packed[AGX_MAX_VARYINGS]; }; struct agx_shader_info { diff --git a/src/asahi/lib/cmdbuf.xml b/src/asahi/lib/cmdbuf.xml index 2fa144a30d5..d4b141112c9 100644 --- a/src/asahi/lib/cmdbuf.xml +++ b/src/asahi/lib/cmdbuf.xml @@ -137,25 +137,25 @@ - - - + + + - - - - - - - + + + + - + - - - + + + + + + @@ -472,7 +472,6 @@ - @@ -491,10 +490,10 @@ - + - + diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c index 2cf62dc3fa0..bf1adce7ef1 100644 --- a/src/asahi/lib/decode.c +++ b/src/asahi/lib/decode.c @@ -427,17 +427,16 @@ agxdecode_record(uint64_t va, size_t size, bool verbose) agx_unpack(agxdecode_dump_stream, map, BIND_FRAGMENT_PIPELINE, cmd); agxdecode_stateful(cmd.pipeline, "Pipeline", agxdecode_pipeline, verbose); - /* TODO: parse */ - if (cmd.varyings) { - uint8_t *map = agxdecode_fetch_gpu_mem(cmd.varyings, 128); + if (cmd.cf_bindings) { + uint8_t *map = agxdecode_fetch_gpu_mem(cmd.cf_bindings, 128); hexdump(agxdecode_dump_stream, map, 128, false); - DUMP_CL(VARYING_HEADER, map, "Varying header:"); - map += AGX_VARYING_HEADER_LENGTH; + DUMP_CL(CF_BINDING_HEADER, map, "Coefficient binding header:"); + map += AGX_CF_BINDING_HEADER_LENGTH; - for (unsigned i = 0; i < cmd.input_count; ++i) { - DUMP_CL(VARYING, map, "Varying:"); - map += AGX_VARYING_LENGTH; + for (unsigned i = 0; i < cmd.cf_binding_count; ++i) { + DUMP_CL(CF_BINDING, map, "Coefficient binding:"); + map += AGX_CF_BINDING_LENGTH; } } diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index f3e38669587..17c3606b89d 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -943,15 +943,17 @@ agx_update_shader(struct agx_context *ctx, struct agx_compiled_shader **out, agx_compile_shader_nir(nir, &key->base, &binary, &compiled->info); struct agx_varyings *varyings = &compiled->info.varyings; - unsigned packed_varying_sz = (AGX_VARYING_HEADER_LENGTH + varyings->nr_descs * AGX_VARYING_LENGTH); + unsigned packed_varying_sz = (AGX_CF_BINDING_HEADER_LENGTH + + varyings->nr_descs * AGX_CF_BINDING_LENGTH); uint8_t *packed_varyings = alloca(packed_varying_sz); - agx_pack(packed_varyings, VARYING_HEADER, cfg) { - cfg.triangle_slots = cfg.point_slots = varyings->nr_slots; + agx_pack(packed_varyings, CF_BINDING_HEADER, cfg) { + cfg.number_of_32_bit_slots = varyings->nr_slots; + cfg.number_of_coefficient_registers = varyings->nr_slots; } - memcpy(packed_varyings + AGX_VARYING_HEADER_LENGTH, varyings->packed, - varyings->nr_descs * AGX_VARYING_LENGTH); + memcpy(packed_varyings + AGX_CF_BINDING_HEADER_LENGTH, + varyings->packed, varyings->nr_descs * AGX_CF_BINDING_LENGTH); if (binary.size) { struct agx_device *dev = agx_device(ctx->base.screen); @@ -1366,9 +1368,9 @@ demo_launch_fragment(struct agx_context *ctx, struct agx_pool *pool, uint32_t pi cfg.groups_of_8_immediate_textures = DIV_ROUND_UP(tex_count, 8); cfg.groups_of_4_samplers = DIV_ROUND_UP(tex_count, 4); cfg.more_than_4_textures = tex_count >= 4; - cfg.input_count = input_count; + cfg.cf_binding_count = input_count; cfg.pipeline = pipeline; - cfg.varyings = varyings; + cfg.cf_bindings = varyings; }; return t.gpu;