D3D12 có 4 loại danh sách lệnh riêng biệt: trực tiếp, gói, tính toán và sao chép.
Vulkan có các khái niệm tương tự, nhưng chúng xảy ra theo một cách khác. Bộ đệm lệnh được phân bổ từ nhóm lệnh. Và nhóm lệnh được liên kết trực tiếp với một gia đình xếp hàng. Và bộ đệm lệnh được phân bổ từ một nhóm chỉ có thể được gửi đến gia đình xếp hàng mà nhóm được xây dựng.
Các họ hàng đợi xác định các loại hoạt động mà hàng đợi có thể thực hiện: các hoạt động sao chép đồ họa, tính toán hoặc bộ nhớ. Hàng đợi lệnh của D3D12 có một khái niệm tương tự, nhưng API danh sách lệnh của D3D12 có bạn chỉ định loại danh sách. Vulkan có được thông tin này từ gia đình xếp hàng, hồ bơi dành cho.
Loại danh sách lệnh "bó" D3D12 có vẻ tương tự trên bề mặt với bộ đệm lệnh phụ Vulkan. Tuy nhiên, chúng khá khác nhau.
Sự khác biệt về nguyên tắc là thế này: các gói kế thừa tất cả trạng thái từ danh sách lệnh trực tiếp thực thi của chúng, ngoại trừ chính PSO bị ràng buộc. Điều này bao gồm các ràng buộc mô tả tài nguyên.
Bộ đệm lệnh thứ cấp Vulkan thừa hưởng không có trạng thái từ môi trường thực thi bộ đệm lệnh chính của chúng, ngoại trừ các CB thứ cấp thực thi trong một đường con của một đối tượng kết xuất (và truy vấn). Và những người chỉ kế thừa trạng thái vượt qua hiện tại (và truy vấn).
Điều này có nghĩa là bạn làm những việc khác nhau với chúng, so với các gói D3D.
Các gói đôi khi được sử dụng để sửa đổi các bảng mô tả và kết xuất nội dung, với giả định rằng danh sách lệnh trực tiếp mà chúng được thực thi trong đó sẽ thiết lập các bảng đó. Vì vậy, các gói là loại giống như danh sách hiển thị OpenGL trọng lượng nhẹ, chỉ không có tất cả những điều xấu mà chúng làm. Vì vậy, ý định với các gói là bạn xây dựng chúng một lần và giữ chúng xung quanh. Chúng được cho là những thứ nhỏ nhặt.
Các CB thứ cấp Vulkan rất cần thiết cho việc xây dựng các lệnh theo luồng dành cho một thể hiện thông qua kết xuất duy nhất. Điều này là do một thể hiện pass render chỉ có thể được tạo trong một CB chính, vì vậy để sử dụng tối ưu các luồng, cần có một cách để tạo các lệnh có nghĩa là thực thi trong cùng một đường con trong các luồng khác nhau. Đó là một trong những trường hợp sử dụng chính của CB thứ cấp. Vì vậy, mục đích là có thể bạn sẽ xây dựng các CB thứ cấp cho mỗi khung (mặc dù bạn có thể sử dụng lại chúng nếu muốn).
Vì vậy, cuối cùng, các gói và CB thứ cấp được dự định để giải quyết các vấn đề riêng biệt. Các gói thường phụ thuộc vào môi trường thực thi, trong khi các CB thứ cấp thì độc lập hơn.
Đồng thời, các CB thứ cấp Vulkan có thể thực hiện một số thứ không thể: chúng có thể thực thi trên các hàng đợi tính toán / chỉ sao chép. Do Vulkan phân biệt giữa cấp chính / phụ của bộ đệm lệnh và hàng đợi nơi CB có thể được gửi, nên Vulkan có thể có bộ đệm lệnh phụ thực thi trên hàng đợi tính toán hoặc chỉ sao chép.
Direct3D 12 không thể làm điều đó với các gói. Các ExecuteBundle
chức năng chỉ có thể được gọi vào một danh sách chỉ huy trực tiếp. Vì vậy, một danh sách lệnh chỉ sao chép có thể thực thi các gói.
Được cấp, bởi vì Vulkan không thừa hưởng bất cứ điều gì giữa các CB thứ cấp ngoại trừ trạng thái đường con và các thao tác tính toán / sao chép không sử dụng kết xuất kết xuất, sẽ không có nhiều lợi ích khi đặt các lệnh như vậy vào CB phụ thay vì một lệnh chính .
D3D12 có sự phân tách giống nhau giữa các đường ống tính toán và đường ống đồ họa mà Vulkan làm. Tuy nhiên, khi ban hành lệnh, D3D12 chỉ có một điểm liên kết đường ống, mà bạn có thể liên kết bất kỳ loại đường ống nào. Ngược lại, Vulkan có các điểm ràng buộc riêng cho các đường ống tính toán và đồ họa. Tất nhiên, Vulkan không có các điểm ràng buộc mô tả khác nhau cho chúng, vì vậy hai đường ống có thể giao thoa với nhau. Nhưng nếu bạn thiết kế sử dụng tài nguyên của họ một cách cẩn thận, có thể gọi một hoạt động điều phối mà không làm ảnh hưởng đến nhu cầu của đường ống đồ họa.
Vì vậy, về tổng thể, không có sự khác biệt thực sự trong kiến trúc đường ống ở đây.