Restore recovered short-face and jaw fields; prepare 1.1.2 with 1535 regressions passed

这个提交包含在:
dayu 于 2026-10-21 23:56:48 +08:00 提交
1 父节点 2d3edcf0a2
当前提交 183bf0e4b2
23 个文件已更改
+998 -46

没有与搜索条件相匹配的文件

+1
查看文件
@@ -0,0 +1 @@
{"artifacts":[{"architecture":"arm64","digest":{"sha256":"f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb"},"format":"mach-o"}],"captures":[],"environments":[],"providers":[{"id":"ghidra","name":"Ghidra","version":"12.1.4"}],"records":[{"analysis_profile":{"digest":"20565088524a2d0359b9b96f46ac48e679d774c7b0092c56abc06de8fdbec11c","parameters":{"analyzer_preset":"ghidra-default","annotation_policy":"atomic-function-entry-metadata-v1","architecture":"arm64","available_architectures":["arm64"],"compiler_spec_id":"auto-default","decompiler_jump_loads":true,"function_body_evidence":"complete-inclusive-ranges-v1","function_boundary_observations":"ghidra-terminal-call-limitations-v1","function_references":"complete-body-and-entry-reference-manager-v2","import_mode":"ephemeral-source-immutable","instruction_flow_evidence":"decoded-return-pcode-v1","jump_table_evidence":"typed-case-default-blocks-v1","language_id":"auto-from-header","load_image_observations":"source-mappings-entry-context-v2","loader":"auto-from-header","location_resolution":"explicit-address-exact-entry-symbol-first-v3","no_return_repair":"returning-imports-decoded-return-v2","process_launch":"inspected-jvm-launch-support-v1","string_inventory_evidence":"defined-data-coverage-v1","target_format":"mach-o","target_kind":"executable"},"provider":{"id":"ghidra","name":"Ghidra","version":"12.1.4"}},"authority":"shipped-artifact","confidence":"observed","environment":null,"evidence_id":"ev_8bc31392c07788d2482546121297c3f177d527282275ef21fd3e5edef9921544","evidence_links":[],"limitations":["The session serves operations only after Ghidra reports default auto-analysis complete; incomplete analysis does not expose partial results.","The imported Program and temporary project are ephemeral and deleted on close. Annotation operations edit session database metadata; original executable bytes are never written.","Cancelling an active Ghidra request terminates its ephemeral database and discards session annotations. The selected target remains open; the next provider query imports the original artifact again.","Default-space addresses use lowercase 0x-prefixed hexadecimal; other address spaces use <percent-encoded-space>:0x<hex>.","Assembly is Ghidra Listing text and does not claim textual equivalence with Hopper output.","macOS sessions require a matching executable Ghidra native decompiler; REA checks for it but does not build native components or change Gatekeeper quarantine state."],"locations":[],"normalized_result":"0x1000279f4: stp d9, d8, [sp, #-0x30]!\n0x1000279f8: stp x20, x19, [sp, #0x10]\n0x1000279fc: stp x29, x30, [sp, #0x20]\n0x100027a00: add x29, sp, #0x20\n0x100027a04: fmov d8, d0\n0x100027a08: str xzr, [x8, #0x20]\n0x100027a0c: movi v0.2D, #0x0\n0x100027a10: stp q0, q0, [x8]\n0x100027a14: cbz x0, 0x100027bac\n0x100027a18: mov x20, x0\n0x100027a1c: mov x19, x8\n0x100027a20: bl 0x10001a8c0\n0x100027a24: cbz w0, 0x100027bac\n0x100027a28: fmov d1, 0x3ff0000000000000\n0x100027a2c: fcmp d8, d1\n0x100027a30: fcsel d2, d1, d8, gt\n0x100027a34: fcmp d8, #0.0\n0x100027a38: movi d0, #0x0\n0x100027a3c: fcsel d2, d0, d2, mi\n0x100027a40: fcvt s2, d2\n0x100027a44: ldr d3, [x20, #0x80]\n0x100027a48: fcmp d3, d1\n0x100027a4c: fcsel d4, d1, d3, gt\n0x100027a50: fmov d5, -0x4010000000000000\n0x100027a54: fcmp d3, d5\n0x100027a58: fcsel d4, d5, d4, mi\n0x100027a5c: fcmp d4, #0.0\n0x100027a60: cset w8, gt\n0x100027a64: fcvt d3, s2\n0x100027a68: ldp d5, d2, [x20, #0x60]\n0x100027a6c: fcmp d2, d1\n0x100027a70: fcsel d6, d1, d2, gt\n0x100027a74: adrp x9, 0x10005f000\n0x100027a78: ldr d7, [x9, #0xb80]\n0x100027a7c: fmul d6, d6, d7\n0x100027a80: fcmp d2, #0.0\n0x100027a84: fcsel d2, d0, d6, mi\n0x100027a88: fmul d2, d2, d3\n0x100027a8c: fcvt s2, d2\n0x100027a90: add x9, x20, #0x78\n0x100027a94: ldur q6, [x20, #0x88]\n0x100027a98: ld1 v5, x9, \n0x100027a9c: adrp x9, 0x10005f000\n0x100027aa0: ldr q7, [x9, #0x980]\n0x100027aa4: fcmgt v7.2D, v7.2D, v5.2D\n0x100027aa8: fcmlt v16.2D, v6.2D\n0x100027aac: fmov v17.2D, #0x3ff0000000000000\n0x100027ab0: fcmgt v18.2D, v5.2D, v17.2D\n0x100027ab4: bit v5.16B, v17.16B, v18.16B\n0x100027ab8: fcmgt v18.2D, v6.2D, v17.2D\n0x100027abc: bit v6.16B, v17.16B, v18.16B\n0x100027ac0: adrp x9, 0x10005f000\n0x100027ac4: ldr q18, [x9, #0x990]\n0x100027ac8: fmul v5.2D, v5.2D, v18.2D\n0x100027acc: adrp x9, 0x10005f000\n0x100027ad0: ldr q18, [x9, #0x9a0]\n0x100027ad4: fmul v6.2D, v6.2D, v18.2D\n0x100027ad8: adrp x9, 0x10005f000\n0x100027adc: ldr q18, [x9, #0x9b0]\n0x100027ae0: bit v5.16B, v18.16B, v7.16B\n0x100027ae4: bic v6.16B, v6.16B, v16.16B\n0x100027ae8: fmul v6.2D, v6.2D, v3.D[0x0]\n0x100027aec: fmul v5.2D, v5.2D, v3.D[0x0]\n0x100027af0: fcvtn v5.2S, v5.2D\n0x100027af4: fcvtn2 v5.4S, v6.2D\n0x100027af8: ldr d6, [x20, #0x98]\n0x100027afc: fcmp d6, d1\n0x100027b00: fcsel d7, d1, d6, gt\n0x100027b04: adrp x9, 0x10005f000\n0x100027b08: ldr d16, [x9, #0xe68]\n0x100027b0c: fmul d7, d7, d16\n0x100027b10: fcmp d6, #0.0\n0x100027b14:Line truncated
+371
查看文件
@@ -0,0 +1,371 @@
Source AIR SHA256: f97705b88f5491057df2117aef457ffca84e11020574cd57742b0670db4484d8
Line numbers refer to the complete original metal-objdump text. Static IR; original shader not executed.
583: define internal fastcc <2 x float> @_ZL25mssFaceShapePinCoordinateDv2_fPU11MTLconstantK16MSSFaceThinPointi18MSSFaceShapeParamsS_(<2 x float> %0, %struct.MSSFaceThinPoint addrspace(2)* nocapture readonly %1, i32 %2, float %3, float %4, float %5, float %6, float %7, float %8, float %9, float %10, float %11, float %12, <2 x float> %13) unnamed_addr #2 {
584: %15 = alloca [17 x <3 x i32>], align 16
585: %16 = alloca [16 x <2 x i32>], align 8
586: %17 = alloca [4 x <2 x i32>], align 8
587: %18 = alloca [6 x <3 x i32>], align 16
588: %19 = alloca [6 x <2 x i32>], align 8
589: %20 = alloca [3 x <2 x i32>], align 8
590: %21 = alloca [11 x i32], align 4
591: %22 = alloca [11 x <2 x float>], align 8
592: %23 = add nsw i32 %2, 75
593: %24 = sext i32 %23 to i64
594: %25 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %24, i32 0
595: %26 = load <2 x float>, <2 x float> addrspace(2)* %25, align 8, !tbaa !62
596: %27 = add nsw i32 %2, 59
597: %28 = sext i32 %27 to i64
598: %29 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %28, i32 0
599: %30 = load <2 x float>, <2 x float> addrspace(2)* %29, align 8, !tbaa !62
600: %31 = add nsw i32 %2, 67
601: %32 = sext i32 %31 to i64
602: %33 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %32, i32 0
603: %34 = load <2 x float>, <2 x float> addrspace(2)* %33, align 8, !tbaa !62
604: %35 = add nsw i32 %2, 74
605: %36 = sext i32 %35 to i64
606: %37 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %36, i32 0
607: %38 = load <2 x float>, <2 x float> addrspace(2)* %37, align 8, !tbaa !62
608: %39 = add nsw i32 %2, 60
609: %40 = sext i32 %39 to i64
610: %41 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %40, i32 0
611: %42 = load <2 x float>, <2 x float> addrspace(2)* %41, align 8, !tbaa !62
612: %43 = fadd fast <2 x float> %42, %38
613: %44 = fmul fast <2 x float> %43, <float 5.000000e-01, float 5.000000e-01>
614: %45 = fsub fast <2 x float> %26, %30
615: %46 = fmul fast <2 x float> %45, %13
616: %47 = tail call fast float @air.dot.v2f32(<2 x float> %46, <2 x float> %46) #3
617: %48 = tail call fast float @air.fast_sqrt.f32(float %47) #3
618: %49 = fsub fast <2 x float> %34, %44
619: %50 = fmul fast <2 x float> %49, %13
620: %51 = tail call fast float @air.dot.v2f32(<2 x float> %50, <2 x float> %50) #3
621: %52 = tail call fast float @air.fast_sqrt.f32(float %51) #3
622: %53 = fmul fast float %52, 2.000000e+00
623: %54 = tail call fast float @air.fast_fmax.f32(float %48, float %53) #3
624: %55 = tail call fast float @air.fast_fmax.f32(float %54, float 1.000000e+00) #3
625: %56 = fdiv fast float 2.800000e+02, %55
626: %57 = tail call fast float @air.fast_clamp.f32(float %56, float 1.000000e+00, float 2.250000e+00) #3
627: %58 = fmul fast float %57, %3
628: %59 = fmul fast float %57, %4
629: %60 = fmul fast float %57, %5
630: %61 = fmul fast float %57, %6
631: %62 = fmul fast float %57, %7
632: %63 = fmul fast float %57, %8
633: %64 = fmul fast float %57, %9
634: %65 = tail call fast float @air.fast_fabs.f32(float %58) #3
635: %66 = fcmp fast ogt float %65, 0x3EB0C6F7A0000000
899: 251: ; preds = %212, %200
900: %252 = phi <2 x float> [ %248, %212 ], [ %201, %200 ]
901: %253 = tail call fast float @air.fast_fabs.f32(float %61) #3
902: %254 = fcmp fast ogt float %253, 0x3EB0C6F7A0000000
903: br i1 %254, label %255, label %309
904:
905: 255: ; preds = %251
906: %256 = bitcast [6 x <3 x i32>]* %18 to i8*
907: call void @llvm.lifetime.start.p0i8(i64 96, i8* nonnull %256) #8
908: %257 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 0
909: store <3 x i32> <i32 72, i32 71, i32 29>, <3 x i32>* %257, align 16
910: %258 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 1
911: store <3 x i32> <i32 62, i32 63, i32 29>, <3 x i32>* %258, align 16
912: %259 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 2
913: store <3 x i32> <i32 71, i32 70, i32 29>, <3 x i32>* %259, align 16
914: %260 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 3
915: store <3 x i32> <i32 63, i32 64, i32 29>, <3 x i32>* %260, align 16
916: %261 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 4
917: store <3 x i32> <i32 70, i32 71, i32 29>, <3 x i32>* %261, align 16
918: %262 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 5
919: store <3 x i32> <i32 64, i32 63, i32 29>, <3 x i32>* %262, align 16
920: %263 = insertelement <2 x float> undef, float %61, i64 0
921: %264 = shufflevector <2 x float> %263, <2 x float> undef, <2 x i32> zeroinitializer
922: br label %266
923:
924: 265: ; preds = %305
925: call void @llvm.lifetime.end.p0i8(i64 96, i8* nonnull %256) #8
926: br label %309
927:
928: 266: ; preds = %305, %255
929: %267 = phi <2 x float> [ %252, %255 ], [ %306, %305 ]
930: %268 = phi i32 [ 0, %255 ], [ %307, %305 ]
931: %269 = zext i32 %268 to i64
932: %270 = getelementptr inbounds [6 x <3 x i32>], [6 x <3 x i32>]* %18, i64 0, i64 %269
933: %271 = load <3 x i32>, <3 x i32>* %270, align 16
934: %272 = extractelement <3 x i32> %271, i64 0
935: %273 = add nsw i32 %272, %2
936: %274 = sext i32 %273 to i64
937: %275 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %274, i32 0
938: %276 = load <2 x float>, <2 x float> addrspace(2)* %275, align 8, !tbaa !62
939: %277 = extractelement <3 x i32> %271, i64 1
940: %278 = add nsw i32 %277, %2
941: %279 = sext i32 %278 to i64
942: %280 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %279, i32 0
943: %281 = load <2 x float>, <2 x float> addrspace(2)* %280, align 8, !tbaa !62
944: %282 = fsub fast <2 x float> %276, %281
945: %283 = tail call fast float @air.dot.v2f32(<2 x float> %282, <2 x float> %282) #3
946: %284 = tail call fast float @air.fast_sqrt.f32(float %283) #3
947: %285 = fcmp fast ugt float %284, 0x3F1A36E2E0000000
948: br i1 %285, label %286, label %305
949:
950: 286: ; preds = %266
951: %287 = extractelement <3 x i32> %271, i64 2
952: %288 = add nsw i32 %287, %2
953: %289 = sext i32 %288 to i64
954: %290 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %289, i32 0
955: %291 = load <2 x float>, <2 x float> addrspace(2)* %290, align 8, !tbaa !62
956: %292 = fsub fast <2 x float> %291, %276
957: %293 = fsub fast <2 x float> %267, %276
958: %294 = tail call fast float @air.dot.v2f32(<2 x float> %293, <2 x float> %293) #3
959: %295 = tail call fast float @air.fast_sqrt.f32(float %294) #3
960: %296 = fdiv fast float %295, %284
961: %297 = fsub fast float 1.000000e+00, %296
962: %298 = tail call fast float @air.fast_clamp.f32(float %297, float 0.000000e+00, float 1.000000e+00) #3
963: %299 = insertelement <2 x float> undef, float %298, i64 0
964: %300 = shufflevector <2 x float> %299, <2 x float> undef, <2 x i32> zeroinitializer
965: %301 = fmul fast <2 x float> %292, %264
966: %302 = fmul fast <2 x float> %301, %300
967: %303 = fsub fast <2 x float> %267, %302
968: %304 = tail call fast <2 x float> @air.fast_clamp.v2f32(<2 x float> %303, <2 x float> zeroinitializer, <2 x float> <float 1.000000e+00, float 1.000000e+00>) #3
969: br label %305
970:
971: 305: ; preds = %286, %266
972: %306 = phi <2 x float> [ %304, %286 ], [ %267, %266 ]
973: %307 = add nuw nsw i32 %268, 1
974: %308 = icmp eq i32 %307, 6
975: br i1 %308, label %265, label %266, !llvm.loop !67
976:
977: 309: ; preds = %265, %251
978: %310 = phi <2 x float> [ %306, %265 ], [ %252, %251 ]
979: %311 = tail call fast float @air.fast_fabs.f32(float %62) #3
980: %312 = fcmp fast ogt float %311, 0x3EB0C6F7A0000000
981: br i1 %312, label %313, label %372
982:
983: 313: ; preds = %309
984: %314 = bitcast [6 x <2 x i32>]* %19 to i8*
985: call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %314) #8
986: %315 = getelementptr inbounds [6 x <2 x i32>], [6 x <2 x i32>]* %19, i64 0, i64 0
1127: 422: ; preds = %383, %372
1128: %423 = phi <2 x float> [ %419, %383 ], [ %373, %372 ]
1129: %424 = tail call fast float @air.fast_fabs.f32(float %64) #3
1130: %425 = fcmp fast ogt float %424, 0x3EB0C6F7A0000000
1131: br i1 %425, label %426, label %585
1132:
1133: 426: ; preds = %422
1134: %427 = bitcast [11 x i32]* %21 to i8*
1135: call void @llvm.lifetime.start.p0i8(i64 44, i8* nonnull %427) #8
1136: %428 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 0
1137: store i32 62, i32* %428, align 4
1138: %429 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 1
1139: store i32 63, i32* %429, align 4
1140: %430 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 2
1141: store i32 64, i32* %430, align 4
1142: %431 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 3
1143: store i32 65, i32* %431, align 4
1144: %432 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 4
1145: store i32 66, i32* %432, align 4
1146: %433 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 5
1147: store i32 67, i32* %433, align 4
1148: %434 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 6
1149: store i32 68, i32* %434, align 4
1150: %435 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 7
1151: store i32 69, i32* %435, align 4
1152: %436 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 8
1153: store i32 70, i32* %436, align 4
1154: %437 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 9
1155: store i32 71, i32* %437, align 4
1156: %438 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 10
1157: store i32 72, i32* %438, align 4
1158: %439 = add nsw i32 %2, 46
1159: %440 = sext i32 %439 to i64
1160: %441 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %440, i32 0
1161: %442 = load <2 x float>, <2 x float> addrspace(2)* %441, align 8, !tbaa !62
1162: %443 = add nsw i32 %2, 48
1163: %444 = sext i32 %443 to i64
1164: %445 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %444, i32 0
1165: %446 = load <2 x float>, <2 x float> addrspace(2)* %445, align 8, !tbaa !62
1166: %447 = bitcast [11 x <2 x float>]* %22 to i8*
1167: call void @llvm.lifetime.start.p0i8(i64 88, i8* nonnull %447) #8
1168: br label %492
1169:
1170: 448: ; preds = %492
1171: %449 = fsub fast <2 x float> %442, %446
1172: %450 = extractelement <2 x float> %423, i64 1
1173: %451 = extractelement <2 x float> %423, i64 0
1174: %452 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 10
1175: %453 = load <2 x float>, <2 x float>* %452, align 8, !tbaa !62
1176: br label %454
1177:
1178: 454: ; preds = %484, %448
1179: %455 = phi <2 x float> [ %453, %448 ], [ %460, %484 ]
1180: %456 = phi i8 [ 0, %448 ], [ %485, %484 ]
1181: %457 = phi i32 [ 0, %448 ], [ %486, %484 ]
1182: %458 = zext i32 %457 to i64
1183: %459 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 %458
1184: %460 = load <2 x float>, <2 x float>* %459, align 8, !tbaa !62
1185: %461 = extractelement <2 x float> %455, i64 1
1186: %462 = extractelement <2 x float> %460, i64 1
1187: %463 = fcmp fast ule float %462, %450
1188: %464 = fcmp fast ogt float %461, %450
1189: %465 = xor i1 %463, %464
1190: br i1 %465, label %484, label %466
1191:
1192: 466: ; preds = %454
1193: %467 = fsub fast float %461, %462
1194: %468 = tail call fast float @air.fast_fabs.f32(float %467) #3
1195: %469 = fcmp fast ugt float %468, 0x3EB0C6F7A0000000
1196: %470 = fcmp fast olt float %467, 0.000000e+00
1197: %471 = select fast i1 %470, float 0xBEB0C6F7A0000000, float 0x3EB0C6F7A0000000
1198: %472 = select i1 %469, float %467, float %471
1199: %473 = extractelement <2 x float> %455, i64 0
1200: %474 = extractelement <2 x float> %460, i64 0
1201: %475 = fsub fast float %473, %474
1202: %476 = fsub fast float %450, %462
1203: %477 = fmul fast float %475, %476
1204: %478 = fdiv fast float %477, %472
1205: %479 = fadd fast float %478, %474
1206: %480 = fcmp fast olt float %451, %479
1207: br i1 %480, label %481, label %484
1208:
1209: 481: ; preds = %466
1210: %482 = and i8 %456, 1
1211: %483 = xor i8 %482, 1
1212: br label %484
1213:
1214: 484: ; preds = %481, %466, %454
1215: %485 = phi i8 [ %483, %481 ], [ %456, %466 ], [ %456, %454 ]
1216: %486 = add nuw nsw i32 %457, 1
1217: %487 = icmp eq i32 %486, 11
1218: br i1 %487, label %488, label %454, !llvm.loop !70
1219:
1220: 488: ; preds = %484
1221: %489 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 0
1222: %490 = and i8 %485, 1
1223: %491 = load <2 x float>, <2 x float>* %489, align 8, !tbaa !62
1224: br label %506
1225:
1226: 492: ; preds = %492, %426
1227: %493 = phi i32 [ 0, %426 ], [ %502, %492 ]
1228: %494 = zext i32 %493 to i64
1229: %495 = getelementptr inbounds [11 x i32], [11 x i32]* %21, i64 0, i64 %494
1230: %496 = load i32, i32* %495, align 4, !tbaa !53
1231: %497 = add nsw i32 %496, %2
1232: %498 = sext i32 %497 to i64
1233: %499 = getelementptr inbounds %struct.MSSFaceThinPoint, %struct.MSSFaceThinPoint addrspace(2)* %1, i64 %498, i32 0
1234: %500 = load <2 x float>, <2 x float> addrspace(2)* %499, align 8, !tbaa !62
1235: %501 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 %494
1236: store <2 x float> %500, <2 x float>* %501, align 8, !tbaa !62
1237: %502 = add nuw nsw i32 %493, 1
1238: %503 = icmp eq i32 %502, 11
1239: br i1 %503, label %448, label %492, !llvm.loop !71
1240:
1241: 504: ; preds = %531
1242: %505 = icmp eq i8 %490, 0
1243: br i1 %505, label %559, label %540
1244:
1245: 506: ; preds = %531, %488
1246: %507 = phi i32 [ 0, %488 ], [ %513, %531 ]
1247: %508 = phi <2 x float> [ %491, %488 ], [ %538, %531 ]
1248: %509 = phi float [ 1.000000e+01, %488 ], [ %537, %531 ]
1249: %510 = zext i32 %507 to i64
1250: %511 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 %510
1251: %512 = load <2 x float>, <2 x float>* %511, align 8, !tbaa !62
1252: %513 = add nuw nsw i32 %507, 1
1253: %514 = trunc i32 %513 to i8
1254: %515 = urem i8 %514, 11
1255: %516 = zext i8 %515 to i64
1256: %517 = getelementptr inbounds [11 x <2 x float>], [11 x <2 x float>]* %22, i64 0, i64 %516
1257: %518 = load <2 x float>, <2 x float>* %517, align 8, !tbaa !62
1258: %519 = fsub fast <2 x float> %518, %512
1259: %520 = tail call fast float @air.dot.v2f32(<2 x float> %519, <2 x float> %519) #3
1260: %521 = fcmp fast ugt float %520, 0x3EB0C6F7A0000000
1261: br i1 %521, label %522, label %531
1262:
1263: 522: ; preds = %506
1264: %523 = fsub fast <2 x float> %423, %512
1265: %524 = tail call fast float @air.dot.v2f32(<2 x float> %523, <2 x float> %519) #3
1266: %525 = fdiv fast float %524, %520
1267: %526 = tail call fast float @air.fast_clamp.f32(float %525, float 0.000000e+00, float 1.000000e+00) #3
1268: %527 = insertelement <2 x float> undef, float %526, i64 0
1269: %528 = shufflevector <2 x float> %527, <2 x float> undef, <2 x i32> zeroinitializer
1270: %529 = fmul fast <2 x float> %528, %519
1271: %530 = fadd fast <2 x float> %529, %512
1272: br label %531
1273:
1274: 531: ; preds = %522, %506
1275: %532 = phi <2 x float> [ %530, %522 ], [ %512, %506 ]
1276: %533 = fsub fast <2 x float> %423, %532
1277: %534 = tail call fast float @air.dot.v2f32(<2 x float> %533, <2 x float> %533) #3
1278: %535 = tail call fast float @air.fast_sqrt.f32(float %534) #3
1279: %536 = fcmp fast olt float %535, %509
1280: %537 = select i1 %536, float %535, float %509
1281: %538 = select i1 %536, <2 x float> %532, <2 x float> %508
1282: %539 = icmp eq i32 %513, 11
1283: br i1 %539, label %504, label %506, !llvm.loop !72
1284:
1285: 540: ; preds = %504
1286: %541 = fsub fast <2 x float> <float -0.000000e+00, float -0.000000e+00>, %449
1287: %542 = tail call fast float @air.dot.v2f32(<2 x float> %541, <2 x float> %541) #3
1288: %543 = tail call fast float @air.fast_sqrt.f32(float %542) #3
1289: %544 = fcmp fast ugt float %543, 0x3F1A36E2E0000000
1290: br i1 %544, label %545, label %583
1291:
1292: 545: ; preds = %540
1293: %546 = tail call fast float @air.dot.v2f32(<2 x float> zeroinitializer, <2 x float> zeroinitializer) #3
1294: %547 = tail call fast float @air.fast_sqrt.f32(float %546) #3
1295: %548 = fdiv fast float %547, %543
1296: %549 = fsub fast float 1.000000e+00, %548
1297: %550 = tail call fast float @air.fast_clamp.f32(float %549, float 0.000000e+00, float 1.000000e+00) #3
1298: %551 = insertelement <2 x float> undef, float %550, i64 0
1299: %552 = shufflevector <2 x float> %551, <2 x float> undef, <2 x i32> zeroinitializer
1300: %553 = insertelement <2 x float> undef, float %64, i64 0
1301: %554 = shufflevector <2 x float> %553, <2 x float> undef, <2 x i32> zeroinitializer
1302: %555 = fmul fast <2 x float> %449, %554
1303: %556 = fmul fast <2 x float> %555, %552
1304: %557 = fsub fast <2 x float> %423, %556
1305: %558 = tail call fast <2 x float> @air.fast_clamp.v2f32(<2 x float> %557, <2 x float> zeroinitializer, <2 x float> <float 1.000000e+00, float 1.000000e+00>) #3
1306: br label %583
1307:
1308: 559: ; preds = %504
1309: %560 = tail call fast float @air.dot.v2f32(<2 x float> %449, <2 x float> %449) #3
1310: %561 = tail call fast float @air.fast_sqrt.f32(float %560) #3
1311: %562 = fcmp fast olt float %537, %561
1312: br i1 %562, label %563, label %583
1313:
1314: 563: ; preds = %559
1315: %564 = fsub fast <2 x float> <float -0.000000e+00, float -0.000000e+00>, %449
1316: %565 = tail call fast float @air.dot.v2f32(<2 x float> %564, <2 x float> %564) #3
1317: %566 = tail call fast float @air.fast_sqrt.f32(float %565) #3
1318: %567 = fcmp fast ugt float %566, 0x3F1A36E2E0000000
1319: br i1 %567, label %568, label %583
1320:
1321: 568: ; preds = %563
1322: %569 = fsub fast <2 x float> %423, %538
1323: %570 = tail call fast float @air.dot.v2f32(<2 x float> %569, <2 x float> %569) #3
1324: %571 = tail call fast float @air.fast_sqrt.f32(float %570) #3
1325: %572 = fdiv fast float %571, %566
1326: %573 = fsub fast float 1.000000e+00, %572
1327: %574 = tail call fast float @air.fast_clamp.f32(float %573, float 0.000000e+00, float 1.000000e+00) #3
1328: %575 = insertelement <2 x float> undef, float %574, i64 0
1329: %576 = shufflevector <2 x float> %575, <2 x float> undef, <2 x i32> zeroinitializer
1330: %577 = insertelement <2 x float> undef, float %64, i64 0
1331: %578 = shufflevector <2 x float> %577, <2 x float> undef, <2 x i32> zeroinitializer
1332: %579 = fmul fast <2 x float> %449, %578
1333: %580 = fmul fast <2 x float> %579, %576
1334: %581 = fsub fast <2 x float> %423, %580
1335: %582 = tail call fast <2 x float> @air.fast_clamp.v2f32(<2 x float> %581, <2 x float> zeroinitializer, <2 x float> <float 1.000000e+00, float 1.000000e+00>) #3
1336: br label %583
1337:
1338: 583: ; preds = %568, %563, %559, %545, %540
1339: %584 = phi <2 x float> [ %423, %559 ], [ %558, %545 ], [ %423, %540 ], [ %582, %568 ], [ %423, %563 ]
1340: call void @llvm.lifetime.end.p0i8(i64 88, i8* nonnull %447) #8
1341: call void @llvm.lifetime.end.p0i8(i64 44, i8* nonnull %427) #8
1342: br label %585
1343:
1344: 585: ; preds = %583, %422
1345: %586 = phi <2 x float> [ %584, %583 ], [ %423, %422 ]
1346: %587 = tail call fast float @air.fast_fabs.f32(float %10) #3
1347: %588 = fcmp fast ogt float %587, 0x3EB0C6F7A0000000
1348: br i1 %588, label %589, label %613
4634: !27 = !{i32 8, !"air.buffer", !"air.location_index", i32 7, i32 1, !"air.read", !"air.struct_type_info", !28, !"air.arg_type_size", i32 40, !"air.arg_type_align_size", i32 4, !"air.arg_type_name", !"MSSFaceShapeParams", !"air.arg_name", !"faceShapeParams"}
4635: !28 = !{i32 0, i32 4, i32 0, !"float", !"shoulian", i32 4, i32 4, i32 0, !"float", !"zhailian", i32 8, i32 4, i32 0, !"float", !"vlian", i32 12, i32 4, i32 0, !"float", !"xiaegu", i32 16, i32 4, i32 0, !"float", !"quangu", i32 20, i32 4, i32 0, !"float", !"xiaba", i32 24, i32 4, i32 0, !"float", !"duanlian", i32 28, i32 4, i32 0, !"float", !"xiaotou", i32 32, i32 4, i32 0, !"float", !"xiaotoufanwei", i32 36, i32 4, i32 0, !"float", !"dayan"}
+177
查看文件
@@ -0,0 +1,177 @@
{
"authority": "Static shipped-artifact analysis; original shader not executed. Public Vision76 region mapping reused from slim-pose-report.json.",
"target_arm64_sha256": "f01e8c0b7e2676b2961950b0e48efdd2589af218e4b36de7d39f5d1c76852bfb",
"air_sha256": "f97705b88f5491057df2117aef457ffca84e11020574cd57742b0670db4484d8",
"evidence_ids": {
"cpu_constants": "ev_d1b8a49fc62e384710bac234967c3e8cbf7c5127081c9b2c6f6a0bbd80b80967",
"cpu_assembly": "ev_8bc31392c07788d2482546121297c3f177d527282275ef21fd3e5edef9921544"
},
"common": {
"uv": "full-image normalized, y down; production stores y up and must convert points and q together",
"gain": "clamp(280/max(length((P75-P59)*pixelSize),2*length((P67-(P74+P60)/2)*pixelSize),1),1,2.25)",
"original_order": [
"thin17",
"narrow16",
"vFace4",
"jaw6",
"cheek6",
"chin3",
"shortPolygon",
"smallHead",
"bigEye"
],
"enable_threshold": "abs(effectiveRatio)>1e-6",
"per_pin_or_field_result": "clamp(q-newOffset,0,1)"
},
"jaw": {
"struct_field": "xiaegu offset12 / helper parameter6",
"ui_range": [
0,
1
],
"cpu_scale": 0.05,
"constant_address": "0x10005f9a8",
"pins_origin_radiusNeighbour_directionAnchor": [
[
72,
71,
29
],
[
62,
63,
29
],
[
71,
70,
29
],
[
63,
64,
29
],
[
70,
71,
29
],
[
64,
63,
29
]
],
"radius": "length(Porigin-Pneighbour) in UV; skip radius<=.0001",
"direction": "P29-Porigin",
"weight": "clamp(1-length(q-Porigin)/radius,0,1)",
"step": "q=clamp(q-direction*clamp(jaw,0,1)*.05*gain*weight,0,1)",
"execution": "6 sequential q updates; each radius uses the second triplet index, unlike thin/chin which use the direction anchor distance",
"air_lines": [
899,
986
]
},
"short": {
"struct_field": "duanlian offset24 / helper parameter9",
"ui_range": [
-1,
1
],
"cpu_scale": 0.25,
"constant_address": "0x10005f9e0",
"cpu_clamp_min_address": "0x10005f9d0 = -1",
"cpu_scaled_min_address": "0x10005f9f0 = -.25",
"polygon_indices": [
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72
],
"polygon_closure": "P72->P62",
"axis": "P46-P48 (nose crest region)",
"radius": "length(axis) in UV; skip radius<=.0001",
"inside": "even-odd point-in-polygon; weight1",
"outside": "d=minimum distance to11 closed segments; weight=clamp(1-d/radius,0,1), only when d<radius",
"step": "q=clamp(q-axis*clamp(short,-1,1)*.25*gain*weight,0,1)",
"nearest_segment_threshold": "squared edge length>1e-6 then project t=clamp(dot(q-A,B-A)/dot(B-A,B-A),0,1); else choose A",
"ray_crossing_denominator": "dy if abs(dy)>1e-6 else signed1e-6",
"air_lines": [
1127,
1340
]
},
"implementation": {
"source": "beatygril/beatygril/Plugin/PGFaceProcessor.m",
"order": [
"thin17",
"existing analytic narrow/V/cheek/small-head body",
"jaw6",
"chin3",
"shortPolygon",
"existing analytic bigEye"
],
"control_coefficients": {
"jaw": 0.05,
"short": 0.25
},
"strength": "Original CPU clamps a common shape strength. Product fixes that multiplier at1 and maps it to no user parameter: PGAmount/s.amount is smoothing strength only and is not used by thin/chin/jaw/short. All4 share the same pixel-size gain. Each shape uses its own control; PGMix is applied independently to the total output later by the host adapter. No new common shape-strength UI is introduced.",
"sampling": "All sequential coordinates are evaluated within one CIWarpKernel per face; image and all4 masks share the same method.",
"missing_or_invalid76": "Preserve legacy face/archive and other5 analytic controls; skip thin/chin/jaw/short exactly.",
"unchanged": "Existing thin17/chin3 index order, constants and formulas remain unchanged.",
"source_sha256": "e4122ca95f7ba41bc925b4cc4bf2bf88a72044ea41880cd66acd9c8278a7daf4"
},
"limits": [
"No original target app/shader executed; these are static CPU/AIR observations.",
"The complete vendor chain is not reconstructed: narrow/V/cheek/small-head/eye algorithms and their ordering remain project approximations. Isolated jaw/short plus recovered thin/chin ordering is tested.",
"No new explicit yaw, pitch, roll or landmark-quality attenuation is inferred. Profile behavior follows detected 2D landmarks, as in the recovered branches.",
"Physical PNG checks bypass the host IOSurface adapter. Original vendor pixel equivalence and Motion/FCP1.1.2 runtime acceptance remain unverified.",
"Independent public Vision CGImage and CIImage detections differ slightly. Tests allow .025 normalized location difference; eye/temple displacement tests measure the actual GPU inverse field."
],
"verification": {
"core": {
"exit_code": 0,
"beauty_checks": 49,
"face_checks": 116,
"slim_checks": 796,
"total": 961
},
"real_frames_asan": {
"exit_code": 0,
"checks": 886,
"frames": [
"public NASA astronaut",
"local user upright/rolled0s",
"local user profile4s"
],
"diagnostics": []
},
"max_uv_oracle_error": 1.09828022e-05,
"physical_checks": "Public Vision76 lower-contour response, pupil/upper-contour positions beyond support unchanged; separate CGImage Vision point locations cross-check the CIImage production path.",
"local_logs": [
"build/analysis-jaw-short/core-tests.txt",
"build/analysis-jaw-short/real-frames-asan.txt"
],
"app_built": false,
"host_operated": false
},
"pre_fix_difference": {
"source": "PGFaceProcessor.m; PGBeautyRenderer only does appearance",
"jaw": "axis-aligned bbox jawBand, .20 multiplier, no radiusNeighbour or lip anchor",
"short": "axis-aligned bbox lower field, .16 multiplier, no lower-contour polygon or nose axis",
"bounds": "Difference in algorithm is established. It does not by itself prove why a specific installed screenshot looks like temple movement; coordinate/isolated-control localization must be checked in actual image output.",
"processor_sha256": "fe4f2a6fc28799cc9b81832baaa2d6739320bde9def175ecc8a4494d004d6b28"
},
"air_excerpts": {
"path": "docs/analysis/short-jaw-air.txt",
"sha256": "45ef87253c5d2591d78531b59b1c8672e10b84615457faabd4dc7f0e9dcdbcac"
}
}
+39
查看文件
@@ -0,0 +1,39 @@
# 短脸与下颌骨局部变形
本次将短脸与下颌骨从包围框近似场替换为目标产物中恢复的76点局部场。几何实现在`PGFaceProcessor.m`;`PGBeautyRenderer.m`负责外观,不是这次位置问题的修改点。
证据是目标ARM64二进制的只读CPU汇编、常量字节与已有Apple metal-objdump AIR。未运行原版APP或shader,未操作Motion/FCP。CPU证据见`rea-jaw-short.json`,带原始行号的GPU IR见`short-jaw-air.txt`,推导及来源摘要见`short-jaw-report.json`。
## 确认的规则
两项共用像素尺寸增益:
`gain = clamp(280 / max(|(P75-P59)*imageSize|, 2*|(P67-(P74+P60)/2)*imageSize|, 1), 1, 2.25)`。
距离为UV时,点与采样坐标统一采用全图归一化、Y向下;像素增益另用实际渲染宽高计算。产品内部76点采用Y向上,因此在同一个kernel中统一转换,未改宿主图像方向。
下颌骨按顺序使用六组`(origin, radiusNeighbour, directionAnchor)`:
`(72,71,29), (62,63,29), (71,70,29), (63,64,29), (70,71,29), (64,63,29)`。
半径是前两点的相邻轮廓距离,方向是`P29-origin`。每步令`weight=clamp(1-|q-origin|/radius,0,1)`,再依次更新`q=clamp(q-direction*ratio*weight,0,1)`。`ratio=clamp(jaw,0,1)*0.05*gain`。不能把半径替换为到嘴锚点的距离,也不能将六步合并为在同一原始坐标上求和。
短脸使用`P62...P72`构成的11边闭合下半脸区域。内部权重为1;外部权重按到最近线段的UV距离线性下降,在距离达到`|P46-P48|`时为0。位移轴为`P46-P48`(公开Vision的鼻梁点区域),`ratio=clamp(short,-1,1)*0.25*gain`,采样更新`q=clamp(q-axis*ratio*weight,0,1)`。正值的可见运动沿鼻梁方向收短,负值延长。半径不超过`0.0001`时跳过;线段投影的平方长度门限为`0.000001`。
CPU字节证据ID:`ev_d1b8a49fc62e384710bac234967c3e8cbf7c5127081c9b2c6f6a0bbd80b80967`。`0x10005f9a8`的double值为`0.05`;`0x10005f9e0`为`0.25`,`0x10005f9d0`和`0x10005f9f0`分别是短脸下限`-1`与缩放后下限`-0.25`。汇编ID:`ev_8bc31392c07788d2482546121297c3f177d527282275ef21fd3e5edef9921544`。结构字段`xiaegu`偏移12、`duanlian`偏移24,结合CPU写入与AIR读取顺序确认映射。
## 产品改动及边界
移除旧`jaw*0.20*jawBand`和`-shortFace*0.16*lower`。保留瘦脸17步、下巴3步的点位、系数和数学,新的局部顺序为`jaw6 → chin3 → short polygon`,仍在同一个CIWarpKernel内更新采样坐标,对每张输入图像或蒙版,每张脸仅进行一次重采样。图像、磨皮/肤色/牙齿/眼睛四张蒙版调用同一变形路径。没有完整合法76点时,这四项恢复算法安全直通;旧记录、其他参数和离线归档继续可读。
原版完整顺序为`thin → narrow → V → jaw → cheek → chin → short → small-head → eyes`。产品其余五项仍采用原有近似body/眼睛场:body先于jaw,故组合全链不宣称原版等价。原版CPU另接受共同形变强度;本产品该乘数固定为1,未映射到任何用户参数。`PGAmount`/`s.amount`仅表示磨皮强度,不参与thin/chin/jaw/short比例;四项共用同一像素尺寸gain。用户分别调节各项脸型值,最终`PGMix`由宿主适配器独立混合总输出。没有新增共同形变强度控制,以保持磨皮、美白和脸型卡片各自的含义。这里没有证实或添加3D姿态识别、yaw衰减或五官恢复锁定。
旧算法与原版不同是确定事实;单凭静态代码,不能替某张已安装宿主画面的“太阳穴变化”断言唯一原因。下述位置验证针对真实PNG,宿主适配和原生交互由父任务验收。
## 验证
`scripts/test.sh`:Beauty49、Face116、Slim796,共961项通过。旧394项thin/chin测试保留;新增独立double oracle从上述AIR规则写成,比较实际GPU坐标场,最大UV误差`1.09828022e-05`。覆盖非零extent、横竖画幅、侧脸投影与roll、正负短脸、小脸增益上限、相邻轮廓半径反例、组合顺序、缺失/非法76点和四张蒙版一致性。
ASan专项以NASA公开肖像及本地用户正面/侧脸帧运行:886项通过,无ASan诊断。独立CGImage Vision请求对照了瞳孔、嘴唇、鼻梁和上下轮廓索引,防止与生产CIImage路径共用一次Y翻转假设。实际GPU采样场确认下半脸有响应,处于支持域外的瞳孔和上部轮廓位置不响应。
用户帧、完整坐标和测试构建只留在忽略的`build/`目录,不进入证据文件。上述不代表原版逐像素一致,也未替代新版本Motion/FCP原生验收;本次未构建APP、安装或提交。
@@ -0,0 +1,24 @@
{
"version": "1.1.2",
"build": "11",
"total": 1535,
"counts": {
"beauty": 49,
"face": 116,
"thinChinJawShort": 796,
"hostAdapterASan": 335,
"oscASan": 98,
"inspectorASan": 141
},
"allPassed": true,
"extraRealFramesASan": {
"checks": 886,
"includedRepeatedBaseChecks": true,
"addedToTotal": false
},
"originCombinations": 28,
"originTagsExactlyByteIdentical": true,
"maxByteDifferenceVsIndependentUprightReference": 2,
"meanByteDifferenceLimit": 0.005,
"nativeCombinedBuildQA": "pending"
}
+5
查看文件
@@ -0,0 +1,5 @@
Beauty renderer: 49 checks, 0 failures (Metal).
2026-10-21 23:46:40.676 face-tests[24719:5743987] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
Face processing: 116 checks passed
2026-10-21 23:46:52.402 slim-tests[24738:5744142] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
PASS: 796 slim alignment checks; maximum UV oracle error 1.09828022e-05
@@ -0,0 +1,33 @@
2026-10-21 23:54:44.774 host-tests[25302:5759794] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
Default IOSurface maximum byte difference: 0
Alternate destination tag maximum byte difference: 0
Anatomy default 0/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
Anatomy default 0/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
Anatomy default 1/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
Anatomy default 1/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
Anatomy big-eye 0/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
Anatomy big-eye 0/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
Anatomy big-eye 1/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
Anatomy big-eye 1/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
Anatomy chin-positive 0/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
Anatomy chin-positive 0/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
Anatomy chin-positive 1/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
Anatomy chin-positive 1/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
Anatomy chin-negative 0/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
Anatomy chin-negative 0/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
Anatomy chin-negative 1/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
Anatomy chin-negative 1/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
Anatomy short-positive 0/0 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
Anatomy short-positive 0/1 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
Anatomy short-positive 1/0 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
Anatomy short-positive 1/1 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
Anatomy short-negative 0/0 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
Anatomy short-negative 0/1 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
Anatomy short-negative 1/0 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
Anatomy short-negative 1/1 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
Anatomy jaw 0/0 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
Anatomy jaw 0/1 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
Anatomy jaw 1/0 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
Anatomy jaw 1/1 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
Legacy fallback upright comparison: max=2 mean=0.0010357
Host adapter: 335 checks, 0 failures
@@ -0,0 +1,10 @@
{
"status": "passed",
"productionSourceSHA256": "e4122ca95f7ba41bc925b4cc4bf2bf88a72044ea41880cd66acd9c8278a7daf4",
"review": "Independent read-only review against recovered CPU constants and AIR: jaw six triples/radius/sequence, short polygon/axis/sign/thresholds, one landmark Y conversion, 56 argument layout, missing-topology pass-through. No blocking defect found.",
"extraChecks": {
"AIRProductCrossingCases": 30000,
"axisYConversionIdentities": 1000
},
"scope": "Five remaining approximate shape controls and full combined-chain equivalence remain outside this repair. Sampled anatomical upper-contour/pupil points do not prove every temple pixel under all poses is unchanged. Native combined-build QA pending."
}
@@ -0,0 +1 @@
Inspector: 141 checks, 0 failures
+21
查看文件
@@ -0,0 +1,21 @@
2026-10-21 23:54:43.574 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1
2026-10-21 23:54:43.583 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,180) surface=320x240 origin=0
2026-10-21 23:54:44.244 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.8,0.3) setter=(1152,-432) readback=(0.8,0.3) mode=centered-pixels verified=1
2026-10-21 23:54:44.244 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.7,0.4) objectBounds=(-1920,-1080,3840,2160) canvas=(152,78) surface=320x240 origin=0
2026-10-21 23:54:44.321 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.8,0.3) setter=(0.8,0.3) readback=(0.12345,0.87654) mode=normalized verified=0
2026-10-21 23:54:44.321 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.75,0.25) setter=(0.75,0.25) readback=(0.75,0.25) mode=normalized verified=1
2026-10-21 23:54:44.321 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.75,0.25) objectBounds=(-100,-50,200,100) canvas=(160,60) surface=320x240 origin=0
2026-10-21 23:54:44.402 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.625,0.375) setter=(0.625,0.375) readback=(0.625,0.375) mode=normalized verified=1
2026-10-21 23:54:44.402 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.625,0.375) objectBounds=(-100,-50,200,100) canvas=(240,60) surface=320x240 origin=0
2026-10-21 23:54:44.483 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1
2026-10-21 23:54:44.483 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(144,180) surface=320x240 origin=0
2026-10-21 23:54:44.561 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
2026-10-21 23:54:44.561 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0,1) objectBounds=(-100,-50,200,100) canvas=(100,140) surface=320x240 origin=0
2026-10-21 23:54:44.646 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(nan,nan) surface=320x240 origin=0
2026-10-21 23:54:44.721 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
2026-10-21 23:54:44.721 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(inf,nan) surface=320x240 origin=0
2026-10-21 23:54:44.806 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
2026-10-21 23:54:44.807 osc-tests[25289:5759689] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,nan) surface=320x240 origin=0
2026-10-21 23:54:44.889 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
2026-10-21 23:54:44.889 osc-tests[25289:5759689] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
OSC adapter: 98 checks, 0 failures
@@ -0,0 +1,2 @@
2026-10-21 23:46:52.888 slim-tests-asan[24731:5744056] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
PASS: 886 slim alignment checks; maximum UV oracle error 1.09828022e-05
+6
查看文件
@@ -111,3 +111,9 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通
1.1.1(10)完整1046项回归通过(49美化、116人脸、394瘦脸/下巴、248宿主、98 OSC、141检查器),后三套启用ASan。正式编译、公证与原生Motion/FCP交互验收进行中,尚未把自动检查等同于原生通过。
1.1.1中间正式安装版在FCP原生确认API门控修复:read/writeBefore均0,action内均1,控件启用,重置和37%数值提交有效。原生日志与结论见`analysis/面板交互连接修复.md`。当前继续处理用户新报的短脸/下颌骨位置偏差,不将中间版标记为最终原生验收通过;临时APP、旧APP备份和公证ZIP已清理,保留唯一正式1.1.1等待合并修复。
## 1.1.2 短脸与下颌骨修复(构建前)
替换短脸和下颌骨的旧脸框近似,恢复目标76点的11边下半脸区域与六组局部采样,沿用单次图像重采样和图像/四张蒙版共用坐标场。四项已恢复控制缺完整76点时安全直通,其余五项和全链组合仍有近似边界。分析报告、CPU证据和AIR摘要见analysis/短脸与下颌骨分析.md。
1535项全部通过:49美化、116人脸、796瘦脸/下巴/短脸/下颌骨、335宿主适配ASan、98 OSC ASan、141检查器ASan。宿主独立物理行序用例扩展到短脸正负与下颌骨,28种控制/原点组合响应在预期下半脸,瞳孔区差异为0,坐标标签切换逐字节一致;独立upright参考最大差2/255,均差<0.005/255。额外真实正面/侧脸ASan专项886项通过,含重复基础用例,不相加。已核对生产源码与冻结摘要一致。合并版尚待正式构建和原生验收。