Vulkan

Vulkan là một API đa nền tảng, phí tổn thấp, tiêu chuẩn mở cho đồ hoạ 3D và điện toán. Ban đầu Vulkan được AMD phát triển với tên gọi Mantle, nhưng sau đó được giao cho Khronos Group. Vulkan được tạo ra để giải quyết những thiếu sót của OpenGL và cho phép các nhà phát triển kiểm soát GPU nhiều hơn.

== Tổng quan ==
Vulkan nhắm đến các ứng dụng đồ hoạ 3D thời gian thực yêu cầu hiệu suất cao, như trò chơi video và phương tiện tương tác, cũng như tính toán song song cường độ cao. Vulkan được thiết kế để cung cấp hiệu suất cao hơn và sử dụng CPU và GPU hiệu quả hơn so với các API OpenGL và Direct3D 11 cũ. Điều này được thực hiện bằng cách cung cấp một API bậc thấp hơn nhiều cho ứng dụng, giống hơn với cách làm việc của các GPU hiện đại.

Vulkan tương tự như API Metal của Apple và Direct3D 12 của Microsoft, và khó sử dụng hơn so với các API OpenGL và Direct3D 11 bậc cao hơn. Ngoài việc sử dụng CPU ít hơn, thiết kế của Vulkan cho phép các nhà phát triển phân phối công việc tốt hơn trên nhiều nhân CPU.

Vulkan được công bố lần đầu bởi tổ chức phi lợi nhuận Khronos Group tại GDC 2015. Ban đầu, API Vulkan được gọi là "sáng kiến OpenGL thế hệ tiếp theo" hoặc "OpenGL next" bởi Khronos, nhưng việc sử dụng những tên này đã bị ngừng khi "Vulkan" được công bố.

Vulkan được phát triển và xây dựng dựa trên các thành phần của API Mantle của AMD, mà AMD đã đóng góp cho Khronos với ý định cung cấp cho Khronos một nền tảng để bắt đầu phát triển một API bậc thấp mà họ có thể tiêu chuẩn hóa trên cả ngành công nghiệp.

== Tính năng ==
Vulkan được thiết kế để cung cấp nhiều lợi ích so với các API khác cũng như người tiền nhiệm của nó, OpenGL. Vulkan có phí tổn thấp hơn, cung cấp sự kiểm soát trực tiếp hơn đối với GPU và sử dụng CPU ít hơn. Tổng quan về khái niệm và tập tính năng của Vulkan tương tự với những khái niệm được thấy trong Mantle và sau đó được Microsoft áp dụng với Direct3D 12 cũng như Apple với Metal.

=== API thống nhất ===
Vulkan cung cấp một API duy nhất cho các thiết bị đồ hoạ để bàn và di động, trong khi trước đây từng có sự phân chia giữa OpenGL và OpenGL ES.

=== Đa nền tảng ===
Vulkan khả dụng trên nhiều hệ điều hành hiện đại. Tương tự như OpenGL và khác với Direct3D 12, Vulkan không bị ràng buộc bởi một hệ điều hành cụ thể hoặc một số thiết bị cụ thể. Vulkan chạy trên Android, Linux, BSD Unix, QNX, Haiku, Nintendo Switch, Raspberry Pi, Stadia, Fuchsia, Tizen, and Windows 7, 8, 10, and 11. MoltenVK cung cấp hỗ trợ từ bên thứ ba với giấy phép tự do cho macOS, iOS và tvOS thông qua API Metal của Apple.

=== Sử dụng CPU ít hơn ===
Vulkan giảm tải cho CPU thông qua việc sử dụng batching và các tối ưu hóa cấp thấp khác, qua đó giảm tải công việc cho CPU và giúp CPU có thể tính toán hoặc kết xuất nhiều hơn.

=== Thiết kế thân thiện với việc đa luồng ===
Direct3D 11 và OpenGL 4 ban đầu được thiết kế để sử dụng với CPU đơn nhân và sau đó mới được bổ sung để thực thi trên nhiều nhân. Ngay cả khi các nhà phát triển ứng dụng sử dụng các tính năng bổ sung, các API này thường không có khả năng mở rộng tốt trên nhiều nhân. Vulkan cung cấp tính khả thi tốt hơn trên CPU đa nhân nhờ kiến trúc đa luồng hiện đại.

=== Shader được biên dịch trước ===
OpenGL sử dụng ngôn ngữ bậc cao GLSL để viết shader, điều này đòi hỏi mỗi driver OpenGL phải triển khai một trình biên dịch riêng cho GLSL. Sau đó, trình biên dịch này thực tại thời điểm ứng dụng chạy để chuyển đổi mã nguồn shader của chương trình thành mã máy của GPU. Ngược lại, driver Vulkan được thiết kế để nhận các shader đã được chuyển đổi thành định dạng nhị phân trung gian gọi là SPIR-V, tương tự với định dạng nhị phân mà các shader HLSL được biên dịch thành trong Direct3D. Bằng việc cho phép tiền biên dịch shader, tốc độ khởi tạo ứng dụng được cải thiện và một loạt các shader khác nhau có thể được sử dụng trong mỗi cảnh. Một driver Vulkan chỉ cần thực hiện tối ưu hóa và tạo mã cụ thể cho GPU, dẫn đến việc bảo trì driver dễ dàng hơn và có thể tạo ra các gói driver nhỏ hơn. Các nhà phát triển ứng dụng có thể che giấu mã shader độc quyền dễ dàng hơn bây giờ, do các shader không được lưu trữ trực tiếp dưới dạng mã nguồn, tuy nhiên, các công cụ được cung cấp để giải mã SPIR-V thành mã nguồn bậc cao có thể đọc được bởi con người.

=== Những điều khác ===
- Vulkan cung cấp sự quản lý thống nhất cho các kernel tính toán và shader đồ họa, loại bỏ sự cần thiết của việc sử dụng một API tính toán riêng biệt kết hợp với một API đồ họa.
- Ray tracing được cung cấp thông qua một tập hợp các phần mở rộng được hỗ trợ bởi nhiều nhà sản xuất, cùng tổng hợp tạo ra một chức năng tương tự như các API Raytracing OptiX và DirectX Raytracing. Không có chức năng tương tự được tiết lộ trong OpenGL.

=== OpenGL so với Vulkan ===
NVIDIA đề cập rằng "OpenGL vẫn là một lựa chọn tốt cho nhiều trường hợp, vì nó có độ phức tạp và gánh nặng bảo trì thấp hơn nhiều so với Vulkan, trong khi nhiều trường hợp vẫn cung cấp hiệu suất tổng thể tốt."

AMD nói rằng "Vulkan hỗ trợ kiểm soát gần với phần cứng (close-to-metal), cho phép hiệu suất nhanh hơn và chất lượng hình ảnh tốt hơn trên Windows 7, Windows 8.1, Windows 10 và Linux. Không có API đồ họa nào khác cung cấp sự kết hợp mạnh mẽ giữa tính tương thích hệ điều hành, tính năng kết xuất và hiệu suất phần cứng như vậy."

== Phiên bản ==
===Vulkan 1.1===
Tại SIGGRAPH 2016, Khronos công bố rằng Vulkan sẽ được hỗ trợ tính năng đa GPU tự động, tương tự như những gì được cung cấp bởi Direct3D 12. Hỗ trợ đa GPU trong API loại bỏ nhu cầu sử dụng SLI hoặc Crossfire, mà yêu cầu các card đồ họa phải cùng một mẫu mã. Thay vào đó, đa GPU trong API cho phép API chia công việc một cách thông minh giữa hai hoặc nhiều GPU hoàn toàn khác nhau. Ví dụ, các GPU tích hợp trong CPU có thể được sử dụng cùng với một GPU chuyên dụng cao cấp để tăng nhẹ hiệu suất.

Vào ngày 7 tháng 3 năm 2018, Khronos Group đã phát hành Vulkan 1.1. Bản cập nhật lớn đầu tiên cho API này đã tiêu chuẩn hóa một số phần mở rộng, chẳng hạn như multi-view, device groups, chia sẻ giữa quá trình và giữa các API khác nhau, tính năng tính toán nâng cao, hỗ trợ HLSL và hỗ trợ YCbCr. Đồng thời, nó cũng mang lại khả năng tương thích tốt hơn với DirectX 12, hỗ trợ đa GPU rõ ràng, hỗ trợ ray tracing, và đặt nền tảng cho thế hệ GPU tiếp theo. Cùng với Vulkan 1.1, SPIR-V đã được cập nhật lên phiên bản 1.3.

===Vulkan 1.2===
Vào ngày 15 tháng 1 năm 2020, Khronos Group đã phát hành Vulkan 1.2. Đây là bản cập nhật chính thứ hai cho API này, tích hợp thêm 23 phần mở rộng Vulkan thường được sử dụng vào tiêu chuẩn cơ bản của Vulkan. Một số tính năng quan trọng bao gồm "timeline semaphores để quản lý đồng bộ hóa một cách dễ dàng", "một mô hình bộ nhớ chính thức để định rõ ngữ nghĩa của sự đồng bồ và các thao tác bộ nhớ trong các luồng khác nhau", và "mô hình chỉ mục để cho phép sử dụng lại bố cục chỉ mục bởi nhiều shader khác nhau". Các tính năng bổ sung của Vulkan 1.2 cải thiện tính linh hoạt khi triển khai các API đồ họa khác trên nền Vulkan, bao gồm "bố cục chuẩn của bộ đệm đồng nhất", "bố cục khối cố định" và "sử dụng stencil riêng biệt".

===Vulkan 1.3===
Vào ngày 25 tháng 1 năm 2022, Khronos Group đã phát hành Vulkan 1.3. Đây là bản cập nhật lớn thứ ba cho API này, tích hợp thêm 23 phần mở rộng Vulkan thường được sử dụng vào tiêu chuẩn cơ bản của Vulkan. Vulkan 1.3 tập trung vào việc giảm thiểu sự phân mảnh bằng cách làm cho các tính năng mới là bắt buộc để một thiết bị được coi là có hỗ trợ Vulkan 1.3. Các tính năng mới trong Vulkan 1.3 bao gồm kỹ thuật vẽ động, trạng thái động bổ sung, API đồng bộ hóa cải thiện và hồ sơ thiết bị.

===Tính năng dự kiến===
Khi phát hành OpenCL 2.2, Khronos Group đã thông báo rằng OpenCL sẽ kết hợp trong mức có thể với Vulkan để cho phép tính linh hoạt của việc triển khai phần mềm OpenCL qua cả hai API. Điều này đã được thể hiện bởi Adobe's Premiere Rush bằng cách sử dụng trình biên dịch mã nguồn mở clspv để biên dịch một lượng lớn mã nguồn kernel OpenCL C để chạy trên một phiên bản Vulkan để triển khai trên Android.

==Lịch sử==
Khronos Group đã bắt đầu dự án để tạo một API đồ họa thế hệ tiếp theo vào tháng 7 năm 2014 với cuộc họp tại Valve. Tại SIGGRAPH 2014, Tại SIGGRAPH 2014, dự án được công bố công khai với lời kêu gọi tham gia cho các bên tham dự.

Theo Cục Sở hữu Trí tuệ và Nhãn hiệu Hoa Kỳ, việc đăng ký thương hiệu cho Vulkan đã được thực hiện vào ngày 19 tháng 2 năm 2015.

Vulkan được đặt tên và công bố chính thức tại Game Developers Conference 2015, mặc dù đã có những đồn đoán và tin đồn xoay quanh một API mới tồn tại trước đó và được gọi là "glNext".

===2015===
Vào đầu năm 2015, LunarG (được tài trợ bởi Valve) đã phát triển và trình diễn một driver Linux cho Intel, cho phép sự tương thích với Vulkan trên các card đồ họa tích hợp dòng HD 4000, mặc dù driver Mesa nguồn mở không hoàn toàn tương thích với OpenGL 4.0 cho đến cuối năm đó. Vẫn còn khả năng hỗ trợ cho Sandy Bridge, vì nó hỗ trợ tính toán thông qua Direct3D11.

Vào ngày 10 tháng 8 năm 2015, Google đã công bố rằng các phiên bản tương lai của Android sẽ hỗ trợ Vulkan. Android 7.x "Nougat" đã hỗ trợ Vulkan vào ngày 22 tháng 8 năm 2016. Android 8.0 "Oreo" có sự hỗ trợ đầy đủ.

Vào ngày 18 tháng 12 năm 2015, Khronos Group đã thông báo rằng phiên bản 1.0 của quy tắc Vulkan đã gần hoàn thiện và sẽ được phát hành khi các driver tuân thủ theo khả dụng.

===2016===
Toàn bộ bộ quy tắc Vulkan và SDK Vulkan nguồn mở đã được phát hành vào ngày 16 tháng 2 năm 2016.

===2018===
Vào ngày 26 tháng 2 năm 2018, Khronos Group công rằng API Vulkan đã khả dụng trên macOS và iOS thông qua thư viện MoltenVK, cho phép Vulkan chạy trên nền tảng Metal. Các sự phát triển mới khác đã được trình diễn tại SIGGRAPH 2018. Trước đây, MoltenVK là một giải pháp độc quyền và được cấp giấy phép thương mại, nhưng Valve đã thỏa thuận với nhà phát triển Brenwill Workshop Ltd để mở mã nguồn MoltenVK dưới giấy phép Apache 2.0 và như một kết quả, thư viện này hiện đã có sẵn trên GitHub.Valve cũng thông báo rằng tính đến ngày 26 tháng 2 năm 2018, trò chơi "Dota 2" có thể chạy trên macOS bằng cách sử dụng API Vulkan, dựa trên MoltenVK.

===2019===
Vào ngày 25 tháng 2 năm 2019, nhóm làm việc Vulkan Safety Critical (SC) đã được công bố để đưa gia tốc GPU của Vulkan vào các ngành công nghiệp chú trọng an toàn.

Dịch vụ chơi game trực tuyến trên đám mây Stadia của Google sử dụng Vulkan trên các máy chủ Linux với GPU của AMD.

===2020===
Vào ngày 15 tháng 1 năm 2020, Vulkan 1.2 đã được phát hành.

Cùng với việc phát hành Vulkan 1.2, Khronos Group đã đăng một bài viết trên blog xem xét rằng hỗ trợ HLSL trong Vulkan đã đạt tình trạng "sẵn sàng cho môi trường production" do sự cải tiến trong trình biên dịch DXC của Microsoft và trình biên dịch glslang của Khronos, và các tính năng mới trong Vulkan 1.2 cải thiện hỗ trợ HLSL.

Vào ngày 3 tháng 2 năm 2020, Raspberry Pi Foundation đã thông báo rằng họ đang làm việc trên một driver Vulkan mã nguồn mở cho Raspberry Pi, một máy tính bo mạch đơn phổ biến. Vào ngày 20 tháng 6 năm 2020, một kỹ sư đồ họa tiết lộ rằng anh đã tạo ra driver sau hai năm làm việc, có khả năng chạy VkQuake3 với hơn 100 FPS trên máy tính nhỏ này.

Vào ngày 17 tháng 3 năm 2020, Khronos Group phát hành các phần mở rộng Ray Tracing, dựa trên phần mở rộng độc quyền của Nvidia, với một số phần mở rộng quan trọng và nhiều thay đổi nhỏ, dựa trên API OptiX của Nvidia. Vào ngày 23 tháng 11 năm 2020, các phần mở rộng Ray Tracing này đã được hoàn thiện.

Vào ngày 24 tháng 11 năm 2020, Raspberry Pi Foundation thông báo rằng driver cho Raspberry Pi 4 đã đạt chuẩn Vulkan 1.0.

===2022===
Ngày 25 tháng 1 năm 2022, Vulkan 1.3 đã được phát hành.

Ngày 1 tháng 3 năm 2022, Vulkan SC 1.0 đã được phát hành, mang đến khả năng đồ họa và điện toán của Vulkan cho ngành công nghiệp chú trọng an toàn, dựa trên tiêu chuẩn Vulkan 1.2.

Ngày 1 tháng 8 năm 2022, Raspberry Pi Foundation thông báo rằng driver cho Raspberry Pi 4 đã đạt chuẩn Vulkan 1.2.

Ngày 1 tháng 9 năm 2022, Mesh Shading cho Vulkan đã được phát hành.

==Hỗ trợ giữa các nhà cung cấp==
Các quy tắc ban đầu đã nêu rõ rằng driver Vulkan có thể được triển khai trên bất kỳ phần cứng nào hỗ trợ OpenGL ES 3.1 hoặc OpenGL 4.x trở lên. Tuy nhiên, việc hỗ trợ Vulkan đòi hỏi các driver đồ họa mới, vì vậy điều này không nhất thiết ngụ ý rằng tất cả các thiết bị hiện có hỗ trợ OpenGL ES 3.1 hoặc OpenGL 4.x sẽ có driver Vulkan khả dụng.

=== Intel ===
Vào tháng 3 năm 2023, Intel đã chia tách sự hỗ trợ Vulkan trên Windows và Linux. Tất cả driver được phát triển bởi Intel.

Trên Windows, Skylake đến Ice Lake hỗ trợ đến Vulkan 1.3, với sự hỗ trợ giới hạn sau tháng 7 năm 2022 vì các bản cập nhật tương lai sẽ chỉ bao gồm việc sửa lỗi bảo mật. Card đồ họa Iris và mới hơn đều được hỗ trợ hoàn toàn tính đến tháng 3 năm 2023.

Trên Linux, tính đến tháng 3 năm 2023, có sự hỗ trợ Vulkan chưa hoàn chỉnh cho Haswell vì nó không đạt chuẩn Vulkan 1.0. Ngoại trừ Haswell, Ivy Bridge và Broadwell cũng được hỗ trợ bởi một driver Vulkan cũ trong Mesa được gọi là HASVK. Skylake và mới hơn được hỗ trợ bởi một driver trong Mesa có tên ANV.

=== AMD ===
Trên Windows, Vulkan 1.2 được hỗ trợ từ GCN 1.0 đến GCN 3.0, và không có bản cập nhật nào được dự định từ tháng 6 năm 2021. GCN 4.0 và mới hơn hỗ trợ Vulkan 1.3.

Trên Linux, có nhiều driver Vulkan khác nhau hỗ trợ phần cứng khác nhau và trùng nhau. Có một driver Vulkan nguồn mở tên là AMDVLK, phát triển bởi AMD với sự hỗ trợ nhỏ cho Windows. Cũng có một driver độc quyền tên là AMDGPU-PRO, không được khuyến nghị sử dụng cho hầu hết người dùng tính đến tháng 3 năm 2023.

Ngoài ra còn có driver được khuyến nghị gọi là RADV trong Mesa, được phát triển bởi Valve, Red Hat, Google và những nhà phát triển khác. Driver này tính đến tháng 3 năm 2023 hỗ trợ tất cả các card GCN và RDNA. Hỗ trợ của driver RADV cho GCN 1.0 và GCN 2.0 yêu cầu phải bật chế độ hỗ trợ thử nghiệm trong mô-đun nhân amdgpu.

=== NVIDIA ===
Trên Windows và Linux, có driver Vulkan được phát triển bởi NVIDIA, hỗ trợ Vulkan 1.2 trên các card Kepler và không kế hoạch cập nhật nào sau tháng 9 năm 2021. Các card Maxwell và mới hơn hỗ trợ Vulkan 1.3.

Tính đến tháng 3 năm 2023, trên Linux có driver Vulkan nguồn mở thử nghiệm và chưa hoàn chỉnh được lên kế hoạch cho Mesa, gọi là NVK, với dự định hỗ trợ các card Turing và mới hơn.

=== GPU cho Android và thiết bị di động ===
Hầu hết các thiết bị Android hiện đại hỗ trợ Vulkan. Android 7.0 Nougat bao gồm hỗ trợ tùy chọn cho Vulkan 1.0, Android 9.0 Pie bao gồm hỗ trợ tùy chọn cho Vulkan 1.1, và Android 10 yêu cầu tất cả các thiết bị 64-bit hỗ trợ Vulkan 1.1. Trên Linux và một số thiết bị ChromeOS, driver nguồn mở Mesa cung cấp sự hỗ trợ cho phần cứng Arm Mali (Midgard và Bifrost), Qualcomm Adreno, và Broadcom VideoCore VI.

=== Apple ===
Tính đến tháng 6 năm 2022, các thiết bị của Apple vẫn không hỗ trợ API Vulkan. Hỗ trợ Vulkan khả dụng thông qua thư viện mã nguồn mở MoltenVK, cung cấp một bản triển khai Vulkan trên cơ sở API đồ họa Metal được cung cấp trên các thiết bị iOS và macOS, tuy nhiên, thư viện này có một số hạn chế đối với một số tính năng API nâng cao.

Vào tháng 6 năm 2022, phiên bản 1.3.217 của Vulkan đã thêm hỗ trợ cho các đối tượng Metal, giúp thuận tiện trong việc nhập và xuất giữa hai API này. Vào tháng 12 năm 2022, phiên bản Vulkan 1.3.236 đã sửa một số lỗi nhỏ liên quan đến tương tác với Apple Metal.

== Tương thích ngược ==
Vulkan không tương thích ngược với OpenGL, mặc dù có một số dự án triển khai OpenGL trên cơ sở Vulkan, chẳng hạn như ANGLE của Google và Zink của Mesa.

Vulkan cũng không tương thích với các API đồ họa khác như Direct3D, Metal và Mantle, tuy nhiên, có một số bản triển khai của các API này trên cơ sở Vulkan:

- Direct3D có một số bản triển khai, cụ thể là DXVK cho Direct3D 9, 10 và 11, và VKD3D-Proton cho hỗ trợ Direct3D 12. Các phiên bản Direct3D khác, cũ hơn, có thể khả dụng dưới dạng thư viện bên thứ ba, chẳng hạn như D8VK cho Direct3D 8.
- Metal có một bản triển khai bên thứ ba đang trong quá trình phát triển được gọi là Indium, dự kiến được sử dụng với lớp tương thích Darling.
- Mantle có một bản triển khai bên thứ ba đang trong quá trình phát triển được gọi là GRVK, để hỗ trợ các trò chơi Mantle cũ.

Các API đồ họa cụ thể cho từng nền tảng được triển khai trên cơ sở Vulkan có thể chạy trên các nền tảng thay thế. Ví dụ, DXVK cung cấp một thư viện chia sẻ thay thế dự kiến được sử dụng trên Linux một cách tự nhiên (không cần tới lớp tương thích Wine) để hỗ trợ việc chuyển game sang hệ điều hành Linux.

== Xem thêm ==
- Danh sách thư viện đồ hoạ 3D

==Đọc tiếp==
- Vulkan Programming Guide: The Official Guide to Learning Vulkan (OpenGL), ngày 10 tháng 11 2016, bởi Graham Sellers và John Kessenich
- Learning Vulkan, Dec 2016, bởi Parminder Singh
- Introduction to Computer Graphics and the Vulkan API, ngày 1 tháng 7 năm 2017, bởi Kenwright
- Vulkan Cookbook, ngày 28 tháng 4 năm 2017, bởi Pawel Lapinski