system_value("tess_param_base_ir3", 2)
system_value("tcs_header_ir3", 1)
+# IR3-specific intrinsics for tessellation control shaders. cond_end_ir3 end
+# the shader when src0 is false and is used to narrow down the TCS shader to
+# just thread 0 before writing out tessellation levels.
+intrinsic("cond_end_ir3", src_comp=[1])
+# end_patch_ir3 is used just before thread 0 exist the TCS and presumably
+# signals the TE that the patch is complete and can be tessellated.
+intrinsic("end_patch_ir3")
+
# IR3-specific load/store intrinsics. These access a buffer used to pass data
# between geometry stages - perhaps it's explicit access to the vertex cache.
dst[2] = create_immed(b, 0);
break;
+ case nir_intrinsic_end_patch_ir3:
+ assert(ctx->so->type == MESA_SHADER_TESS_CTRL);
+ struct ir3_instruction *end = ir3_ENDPATCH(b);
+ array_insert(b, b->keeps, end);
+
+ end->barrier_class = IR3_BARRIER_EVERYTHING;
+ end->barrier_conflict = IR3_BARRIER_EVERYTHING;
+ break;
+
case nir_intrinsic_store_global_ir3: {
struct ir3_instruction *value, *addr, *offset;
break;
}
+
+ case nir_intrinsic_cond_end_ir3: {
+ struct ir3_instruction *cond, *kill;
+
+ src = ir3_get_src(ctx, &intr->src[0]);
+ cond = ir3_b2n(b, src[0]);
+
+ /* NOTE: only cmps.*.* can write p0.x: */
+ cond = ir3_CMPS_S(b, cond, 0, create_immed(b, 0), 0);
+ cond->cat2.condition = IR3_COND_NE;
+
+ /* condition always goes in predicate register: */
+ cond->regs[0]->num = regid(REG_P0, 0);
+
+ kill = ir3_CONDEND(b, cond, 0);
+
+ kill->barrier_class = IR3_BARRIER_EVERYTHING;
+ kill->barrier_conflict = IR3_BARRIER_EVERYTHING;
+
+ array_insert(ctx->ir, ctx->ir->predicates, kill);
+ array_insert(b, b->keeps, kill);
+ break;
+ }
+
case nir_intrinsic_load_shared_ir3:
emit_intrinsic_load_shared_ir3(ctx, intr, dst);
break;