Sự khác biệt chính của quá trình đường ống giữa Vulkan và DX12 là gì?


7

DX12 giới thiệu một tính năng mới của đường ống có tên 'Bundle'. Dường như có thể tối ưu hóa danh sách lệnh và gửi nó đến đường ống cuối cùng. Vulkan phát minh ra một số đường ống khác nhau: Đường ống đồ họa và đường ống tính toán. Đường ống đồ họa có vẻ giống với bản gốc, đường ống tính toán được sử dụng như một bộ truy cập của bộ nhớ hình ảnh.

Kiến thức CG của tôi khá cơ bản và không thể xác nhận rằng nhận thức là chính xác. Ai đó vui lòng cung cấp một số giải thích cho nó - Sự khác biệt chính của đường ống giữa chúng?

Người giới thiệu:

Câu trả lời:


13

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 ExecuteBundlechứ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đườ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.


0

Sự khác biệt chính với các đường ống là DirectX12 tập trung vào đa luồng hoặc sử dụng nhiều lõi một cách hiệu quả nhất có thể theo trạng thái kết xuất của một đối tượng.

Đối với Vulkan, họ đang tách việc quản lý các luồng thành các loại đường ống, tính toán và đồ họa khác nhau.

Như đã nêu trong tài liệu tham khảo từ MSDN, DirectX12 đang sử dụng PSO (Đối tượng trạng thái đường ống). Việc tối ưu hóa xảy ra theo cách này bằng cách chuẩn bị các lệnh cho đường ống trước đó. Dường như, DirectX12 sử dụng PSO để tạo một đối tượng của trạng thái kết xuất để quản lý tốt hơn các thay đổi về trạng thái đối với phần cứng hiệu quả hơn.

Mong rằng sẽ giúp!


Ý bạn là, DX12 chỉ có một đường ống, nhưng nó đã tối ưu hóa quá trình bao gồm PSO với đa luồng và đa lõi. Vulkan có 2 đường ống, nằm trên các luồng khác nhau, mỗi luồng có cách quản lý lệnh riêng, nhưng chỉ có 2 luồng?
naive231

Vulkan đang sử dụng system-on-a-thread? Là như DX12 là đa luồng hoàn toàn?
PaulHK

Không chắc chắn nếu DX12 đang sử dụng một đường ống, có thể đáng để xem tài liệu về DX12 để biết chi tiết cụ thể.
JDavila

1
@PaulHK, theo bài báo DX12, đó là trường hợp. Có vẻ như VUlkan cũng đang sử dụng nhiều chủ đề: khronos.org/registry/vulkan/specs/1.0/xhtml/ trộm
JDavila
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.