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;