Có rất nhiều công việc cần thiết trên CPU để thiết lập khung cho GPU và một phần tốt của công việc đó nằm trong trình điều khiển đồ họa. Trước DX12 / Vulkan, công việc trình điều khiển đồ họa về cơ bản buộc phải được xử lý đơn luồng theo thiết kế của API.
Hy vọng là DX12 / Vulkan nâng hạn chế đó, cho phép trình điều khiển hoạt động được thực hiện song song trên nhiều luồng CPU trong một khung. Điều này sẽ cho phép sử dụng CPU đa lõi hiệu quả hơn, cho phép các công cụ trò chơi đẩy các cảnh phức tạp hơn mà không bị ràng buộc CPU. Đó là hy vọng, liệu điều đó có thành hiện thực trong thực tế hay không là điều chúng ta sẽ phải chờ đợi trong vài năm tới.
Để giải thích một chút: đầu ra của trình kết xuất công cụ trò chơi là một luồng các lệnh gọi API DX / GL mô tả chuỗi các thao tác để kết xuất khung. Tuy nhiên, có một khoảng cách lớn giữa luồng lệnh gọi API và bộ đệm lệnh nhị phân thực tế mà phần cứng GPU tiêu thụ. Trình điều khiển phải "biên dịch" các lệnh gọi API sang ngôn ngữ máy của GPU. Đó không phải là một quá trình tầm thường, nó bao gồm rất nhiều bản dịch các khái niệm API sang thực tế phần cứng cấp thấp, xác thực để đảm bảo GPU không bao giờ được đặt ở trạng thái không hợp lệ, phân bổ bộ nhớ và dữ liệu, theo dõi các thay đổi trạng thái để phát hành sửa các lệnh cấp thấp, v.v. Trình điều khiển đồ họa chịu trách nhiệm cho tất cả những thứ này.
Trong DX11 / GL4 và các API trước đó, công việc này thường được thực hiện bởi một luồng trình điều khiển duy nhất. Ngay cả khi bạn gọi API từ nhiều luồng (mà bạn có thể thực hiện bằng cách sử dụng danh sách lệnh trì hoãn DX11 chẳng hạn), nó chỉ thêm một số công việc vào hàng đợi cho luồng trình điều khiển để nhai lại sau. Một lý do lớn cho việc này là theo dõi trạng thái tôi đã đề cập trước đó. Nhiều chi tiết cấu hình GPU cấp phần cứng yêu cầu kiến thức về trạng thái đường ống đồ họa hiện tại, vì vậy không có cách nào tốt để chia danh sách lệnh thành các khối có thể được xử lý song song, mỗi đoạn sẽ phải biết chính xác trạng thái nào sẽ bắt đầu với, mặc dù đoạn trước chưa được xử lý.
Đó là một trong những điều lớn đã thay đổi trong DX12 / Vulkan. Đối với một điều, chúng kết hợp gần như tất cả trạng thái đường ống đồ họa vào một đối tượng và đối với một đối tượng khác (ít nhất là trong DX12) khi bạn bắt đầu tạo danh sách lệnh, bạn phải cung cấp trạng thái đường ống ban đầu; trạng thái không được kế thừa từ danh sách lệnh này sang danh sách tiếp theo. Về nguyên tắc, điều này cho phép người lái không phải biết bất cứ điều gì về danh sách lệnh trước đó trước khi có thể bắt đầu biên dịch mã hóa và điều đó cho phép ứng dụng chia nhỏ kết xuất của nó thành các đoạn song song, tạo ra danh sách lệnh được biên dịch đầy đủ, sau đó có thể nối với nhau và gửi đến GPU với mức tối thiểu phiền phức.
Tất nhiên, có nhiều thay đổi khác trong các API mới, nhưng theo như đa luồng, đó là phần quan trọng nhất.