기여 목록 / 8487825
gpu: Remove --disable-zero-copy-dxgi-video
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-로 뒤집히자 둘 다 "끄는 스위치"가 되어 버렸다.
해결 내용
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가 이미 완전히 포함하고 있었다.
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 전환)