기여 목록 / 8409487
Use base::DegToRad and base::RadToDeg in blink
Blink에서 각도를 변환하던 blink::Deg2rad()와 blink::Rad2deg()를 공용 base::DegToRad()와 base::RadToDeg()로 통일했습니다.
문제 설명
https://crbug.com/40256226의 C++20 <numbers> 전환 작업에는 각도 변환 함수의 통일도 포함됐습니다.
이를 위해 blink에서 사용하는 math_extras.h에서 각도 변환 함수를 지우고 base의 각도 변환 함수로 통일 해야합니다.
CL 5109440에서는 ui/gfx/geometry/angle_conversions.h를 삭제하고 각도 변환 함수들을 base로 옮겼습니다. 이 CL을 blink에 동일하게 수행하는 것입니다.
해결 내용
- Blink 여러 파일에서
blink::Deg2rad()와blink::Rad2deg()를 각각base::DegToRad()와base::RadToDeg()로 바꿨습니다. 중복된 두 함수 정의도third_party/blink/renderer/platform/wtf/math_extras.h에서 제거했습니다. - 기존 식
A * (B / C)가A * B / C으로 바뀌었습니다. - dry run을 돌리니 부동소수점 반올림 차이가 Blink 단위 테스트와 웹 테스트에서 드러났습니다.
| 테스트 스위트 (Test Suite) | 실패한 테스트 (Failed Tests) |
|---|---|
| blink_unittests | • PointerEventFactoryPageTest.PointerTargets • PointerEventFactoryTest.CoalescedEvents • PointerEventFactoryTest.LastPointerPosition • PointerEventFactoryTest.MouseAndTouchAndPen • PointerEventFactoryTest.MousePointer • PointerEventFactoryTest.MousePointerKeyStates • PointerEventFactoryTest.NonHoveringPointers • PointerEventFactoryTest.OutOfRange • PointerEventFactoryTest.PenAsTouchAndMouseEvent • PointerEventFactoryTest.PredictedEvents • PointerEventFactoryTest.TouchAndDrag • PointerEventFactoryTest.TouchPointerPrimaryRemovedWhileAnotherIsThere • PointerEventFactoryTest.TouchPointerReleasedAndPressedAgain |
| blink_web_tests | • fast/backgrounds/size/contain-and-cover-zoomed.html • fast/gradients/unprefixed-linear-angle-gradients.html |
| high_dpi_blink_web_tests | • svg/text/textpath-pattern.svg |
| not_site_per_process_blink_web_tests | • fast/backgrounds/size/contain-and-cover-zoomed.html • fast/gradients/unprefixed-linear-angle-gradients.html |
| pixel_browser_tests | • ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Regular • ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Wide • ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Wide_DarkTheme |
| pixel_skia_gold_passthrough_test | • Pixel_Video_HEVC |
web test는 expected image를 직접 커밋하고 unittest는 테스트 코드를 수정하면 됐습니다.
하지만 skia gold test는 googler에게 문의를 해야했습니다. svg 테스트의 경우에는 서로 다른 로직의 svg 렌더링을 픽셀 단위로 비교하는데 이 픽셀 불일치가 늘어나는건 테스트 코드나 expected image를 고쳐서 해결할 수 없는 문제였습니다.
이 때, 각도 변환 함수는 base, skia, blink에 각각 있는데 base에 있는 각도 변환 함수만 다른 부분이 이상하다고 생각을 했습니다.
최적화가 이유임을 깨닫고 https://crrev.com/c/8429503에서 base 각도 변환 함수의 연산 순서를 조정하였습니다.
이후 dry run을 통과하고 머지가 되었습니다.
배운 점
- 부동소수점 연산의 오차로 인한 달라지면 결과가 달라질 수 있습니다. 이 작은 차이가 각종 web test, svg 렌더링 테스트, skia gold 테스트, unit test 등에서 한꺼번에 터질 수 있습니다.
- 연산식의 간단한 괄호에도 런타임에 연산을 줄이기 위한 constant folding과 같은 최적화가 숨어있습니다.