OSSCA Chromium

기여 목록 / 8487825

gpu: Remove --disable-zero-copy-dxgi-video

GraphicscleanupMerged

Chromium의 Windows 하드웨어 비디오 디코딩 경로에서, 동일한 기능을 제어하는 두 개의 중복된 스위치 중 하나를 제거한 코드 정리 작업이다. 10년간 방치된 기술 부채를 정리하면서 mojom IPC 필드까지 함께 걷어냈다.

항목 내용
이슈 crbug.com/473587141 (Internal Cleanup, P2)
규모 16 files changed, 23 insertions(+), 78 deletions(-)

문제 설명

Windows에서 D3D11 하드웨어 디코더가 출력한 NV12 텍스처를 컴포지터에 복사 없이 그대로 넘기는(zero-copy) 최적화가 있다. 일부 GPU 드라이버에서 문제를 일으켜 이를 끌 수단이 필요했는데, 그 수단이 두 벌 존재했다.

문제점 1. 동일 기능을 끄는 경로가 두 개

--disable-zero-copy-dxgi-video 커맨드라인 스위치와 disable_dxgi_zero_copy_video GPU driver bug workaround가 둘 다 SupportsZeroCopy() 한 함수로 수렴해 완전히 같은 코드 경로를 차단한다.

문제점 2. 중복된 쪽이 불필요한 유지 비용을 발생시킨다

스위치 경로는 불리언 하나를 GPU 프로세스로 전달하기 위해 GpuPreferences 필드, gpu_preferences.mojom IPC 필드, 그리고 StructTraits의 Read/getter까지 유지해야 했다. 반면 workaround는 이미 존재하는 테이블의 비트 하나이다.

배경이 된 2016년의 의미 역전

기능은 --enable-zero-copy-dxgi-video opt-in 플래그로 도입됐고, 이후 AMD 드라이버 행(crbug.com/623209) 대응으로 workaround가 추가됐다. 당시에는 두 경로의 역할이 달랐다. 하나는 "실험 기능 켜기", 다른 하나는 "고장난 드라이버에서 끄기"였다. 그런데 기능이 기본값 ON으로 전환되면서 플래그가 --disable-로 뒤집히자 둘 다 "끄는 스위치"가 되어 버렸다.

fig1-two-off-switches fig2-redundant-paths

해결 내용

1. 두 경로의 능력 비교로 제거 대상 결정

단순히 "중복이니 하나 지운다"가 아니라, 어느 쪽을 지워야 기능 손실이 없는지를 먼저 입증했다.

능력 / 비용 Path A (스위치) Path B (workaround)
커맨드라인으로 끄기 가능 가능 (--disable_dxgi_zero_copy_video)
문제 드라이버에서 자동 차단 불가 가능 (gpu_driver_bug_list.json 5개 엔트리)
blocklist 무시하고 강제로 켜기 불가 가능 (=0)
GpuPreferences 필드 필요 불필요
mojom IPC 필드 + traits 필요 불필요

핵심은 workaround 이름이 자동으로 커맨드라인 스위치가 된다는 점이었다. gpu_workaround_list.txt의 이름이 빌드 시 GPU_OP 매크로로 변환되고, GpuDriverBugList::AppendWorkaroundsFromCommandLine()이 그 이름을 그대로 스위치로 받는다. 즉 Path A의 수동 제어 능력을 Path B가 이미 완전히 포함하고 있었다.

fig3-subset-and-removal

2. 구현 세부 사항

Path A 경로 전체를 제거했다.

파일 제거한 내용
content/public/common/content_switches.{cc,h} 스위치 선언
content/public/browser/gpu_utils.cc 커맨드라인 파싱
gpu/config/gpu_preferences.h GpuPreferences 필드
gpu/ipc/common/gpu_preferences.mojom IPC 필드
gpu/ipc/common/gpu_preferences_mojom_traits.h Read + getter

3. 주요 코드 변경 내용

결정 지점이 단일 조건으로 단순해졌다.

// media/gpu/windows/d3d11_texture_selector.cc

// Before
bool SupportsZeroCopy(const gpu::GpuPreferences& preferences,
                      const gpu::GpuDriverBugWorkarounds& workarounds) {
  if (!preferences.enable_zero_copy_dxgi_video)   // Path A
    return false;
  if (workarounds.disable_dxgi_zero_copy_video)   // Path B
    return false;
  return true;
}

// After
bool SupportsZeroCopy(const gpu::GpuDriverBugWorkarounds& workarounds) {
  return !workarounds.disable_dxgi_zero_copy_video;
}

GpuPreferences가 더 이상 읽히지 않게 되면서 연쇄적으로 죽은 파라미터도 함께 제거했다.

  • TextureSelector::Create()에서 파라미터를 제거했다.
  • D3DVideoDecoderBackend::CreateTextureSelector()도 가상 인터페이스에서 파라미터를 제거했다. 구현체는 D3D11VideoDecoderBackend 하나뿐이라 영향 범위가 작다.

테스트 방법

1. 단위 테스트

gpu_unittests 2263개 중 2263개가 통과했다 (macOS arm64). 이 중 GpuPreferencesTest.EncodeDecode가 mojom 직렬화 왕복을 검증하므로, IPC 필드와 StructTraits 제거가 안전한지 실제로 확인된다.

2. 통합 / 빌드 검증

대상 방법 결과
content_switches.{cc,h} content/public/common:switches, :static_switches 빌드 통과
gpu_utils.cc 오브젝트 단독 컴파일 통과
잔재 확인 트리 전체 git grep 0건
포맷 git cl format --diff 통과

3. 성능 테스트

해당 없음. 런타임 동작이 바뀌지 않는 순수 정리 작업이다. SupportsZeroCopy()의 반환값은 모든 입력에 대해 이전과 동일하다. 제거된 enable_zero_copy_dxgi_video는 기본값이 "켜짐"이었고, 이를 끄던 유일한 수단인 스위치를 함께 제거했기 때문이다.


배운 점

기술적 학습

  • GPU workaround는 선언만으로 커맨드라인 스위치가 된다. gpu_workaround_list.txt에 이름 한 줄 → 빌드 시 헤더 자동 생성 → AppendWorkaroundsFromCommandLine()이 이름을 그대로 스위치로 매칭한다.
  • "중복"을 주장하려면 능력의 포함 관계를 증명해야 한다. 둘 다 같은 함수를 막는다는 사실만으로는 부족했고, 자동 적용·수동 제어·강제 해제 세 축에서 A ⊂ B임을 보인 뒤에야 안전하게 지울 수 있었다.

프로세스 관련 학습

  • Chromium 체크아웃에서 브랜치 베이스가 다르면 서브모듈 273개가 어긋난다. git checkout은 커밋에 기록된 gitlink만 바꾸고 의존성 실물은 옮기지 않는다(그건 gclient sync의 일이다). 이 때문에 git status에 수십 개가 modified로 떠서 CL에 섞일 뻔했고, gclient installhooks로 pre-commit 훅을 설치해 방어했다. 다만 이 훅은 대화형이라 비대화형 환경에서는 통과되므로, 커밋 시 경로를 명시해 스테이징하는 습관이 더 확실하다.
  • 빌드 타깃은 최소 단위로 잡는다. 검증하려던 게 gpu_utils.cc 한 파일인데 content/public/browser:browser_sources를 통째로 빌드해 18분을 낭비했다. 오브젝트 경로를 직접 지정하니 6초에 끝났다. (참고로 siso는 ninja의 foo.cc^ 문법을 지원하지 않아 obj/<타깃경로>/<타깃명>/<파일>.o 형태로 지정해야 한다.)

향후 개선 방향

  • gpu_utils.cc의 바로 옆 줄에 있는 --disable-low-latency-dxva, --disable-nv12-dxgi-video가 동일한 패턴이다. 같은 방식의 중복인지 확인해 볼 가치가 있다.

참고 자료

  • crbug.com/473587141 (Clean up --disable-zero-copy-dxgi-video)
  • d3d11_texture_selector.cc의 SupportsZeroCopy()
  • gpu_workaround_list.txt (workaround 선언 목록)
  • gpu_driver_bug_list.cc의 AppendWorkaroundsFromCommandLine()
  • docs/git_submodules.md (서브모듈 gitlink 관리)
  • 관련 커밋: 67274bcfb101e (기능 도입), b10c5dd4f35e7 (workaround 추가), 8e03ba3e620bd (기본값 ON 전환)