Triton mang khả năng tăng tốc DirectX 11 đến khách Windows trên QEMU
Trình điều khiển Windows Triton, kết hợp với giao thức Neptune, cung cấp hỗ trợ DirectX 11 đầy đủ cho máy ảo QEMU bằng cách triển khai DirectX DDI và dịch ngược về các lệnh gọi API, tránh được những hạn chế của các phương pháp trước đây.
Nhóm đứng sau lớp ảo hóa Direct3D Neptune đã phát hành Triton, một trình điều khiển Windows mang khả năng tăng tốc DirectX 11 đầy đủ đến máy ảo QEMU. Triton hoạt động cùng Neptune để cung cấp đồ họa tăng tốc phần cứng cho khách Windows, điều mà QEMU từ lâu gặp khó khăn.
Neptune tuần tự hóa các lệnh gọi API Direct3D qua ranh giới hypervisor, ban đầu được xây dựng để tăng tốc trò chơi Wine trên khách Linux. Trình điều khiển Triton mới mở rộng khả năng đó cho khách Windows bằng cách triển khai Giao diện Điều khiển Thiết bị DirectX (DDI) thay vì thay thế các DLL hệ thống.
Tại sao không chỉ thay thế d3d11.dll?
Các nỗ lực trước đây về tăng tốc GPU Windows trong QEMU dựa vào việc phân phối các tệp d3d11.dll và dxgi.dll tùy chỉnh cùng với ứng dụng. Cách tiếp cận này có những nhược điểm nghiêm trọng:
- Hiệu suất kém vì Trình quản lý Cửa sổ Màn hình (DWM) coi các khung hình như hình ảnh, yêu cầu blitting CPU.
- Không thể thay thế DLL hệ thống mà không làm hỏng Windows, và phần mềm chống gian lận gắn cờ các sửa đổi như vậy.
- Người dùng phải sao chép DLL thủ công vào mọi ứng dụng, điều này không thân thiện với người dùng.
Cách tiếp cận đúng là triển khai DDI—giao diện Windows sử dụng để giao tiếp với trình điều khiển đồ họa—thay vì chính API.
Triển khai DDI
Trong Windows, ứng dụng nói chuyện với d3d11.dll và dxgi.dll, chúng xử lý theo dõi trạng thái và gửi các lệnh đã được làm sạch đến trình điều khiển chế độ người dùng (UMD) triển khai DDI. UMD giao tiếp với trình điều khiển chế độ hạt nhân (KMD) để điều khiển phần cứng thực tế. Triton triển khai cả UMD và KMD cho GPU ảo của QEMU.
Phần KMD đã được giải quyết: các dự án mã nguồn mở hiện có (anonymix007 và arehnman) đã xây dựng KMD cho Venus (Vulkan), và vì Neptune được mô phỏng theo Venus, các giao diện kernel gần như giống hệt nhau. Nhóm đã chọn nhánh của anonymix007 làm cơ sở do có nhiều tính năng hoạt động hơn.
Phần khó là chính DDI. Rất ít triển khai mã nguồn mở tồn tại—Mesa có UMD DirectX 10, và VirtualBox có UMD DirectX 11. Trình điều khiển của VirtualBox dịch các lệnh gọi DDI thành bytecode, sau đó diễn giải bytecode đó thành các lệnh gọi API DirectX trên máy chủ. Nhóm đã bác bỏ cách tiếp cận này do lỗi tương thích, gánh nặng bảo trì và không tương thích giấy phép (GPLv3 so với MIT/LGPL).
Biến đổi ngược: DDI → API
Thay vì phát minh ra một phương thức truyền tải mới cho các lệnh gọi DDI, Triton biến đổi các lệnh gọi DDI trở lại thành các lệnh gọi API DirectX. Điều này cho phép nhóm tái sử dụng giao thức Neptune đã được kiểm chứng—ở phía máy chủ, các lệnh Neptune được giải tuần tự hóa chính là các lệnh gọi API DirectX 11, vì vậy không cần diễn giải thêm. Điều này giảm độ trễ và cơ hội xảy ra lỗi.
Hầu hết các lệnh gọi DDI có tương đương API trực tiếp, làm cho việc biến đổi trở nên đơn giản—chỉ cần xử lý ánh xạ và tra cứu enum. Phần khó là bytecode shader DXBC, nhưng vì Triton hoạt động ngược, nó không cần phải tháo rời shader, một lợi thế đáng kể về độ phức tạp.
Kết quả: khách Windows 11 ARM64 trên máy chủ macOS có thể chạy các trò chơi như Crash Bandicoot Trilogy với tăng tốc phần cứng thông qua QEMU—lần đầu tiên cho dự án.
Cách tiếp cận đúng không phải là triển khai các API DirectX mà là triển khai các DDI DirectX (Giao diện Điều khiển Thiết bị).