Vulkan là giải pháp có mức hao tổn thấp, API đa nền tảng cho 3D hiệu suất cao đồ hoạ. Chẳng hạn như OpenGL ES (GLES), Vulkan cung cấp các công cụ để tạo chất lượng cao, đồ hoạ theo thời gian thực trong ứng dụng. Ưu điểm của việc sử dụng Vulkan là giảm được CPU mức hao tổn và hỗ trợ cho ngôn ngữ Trung gian nhị phân SPIR-V.
Để triển khai thành công Vulkan, thiết bị phải có:
- Trình tải Vulkan do Android cung cấp.
- Trình điều khiển Vulkan, do các SoC (như GPU IHV) cung cấp, triển khai API Vulkan. Để hỗ trợ chức năng Vulkan, Android thiết bị cần có phần cứng GPU hỗ trợ Vulkan và trình điều khiển liên kết. GPU cũng phải hỗ trợ GLES 3.1 trở lên. Tham khảo ý kiến của nhà cung cấp SoC để yêu cầu hỗ trợ trình điều khiển.
Nếu thiết bị có trình điều khiển Vulkan, thì thiết bị cần khai báo
FEATURE_VULKAN_HARDWARE_LEVEL
và
FEATURE_VULKAN_HARDWARE_VERSION
tính năng hệ thống, với các phiên bản
phản ánh chính xác khả năng của thiết bị. Điều này giúp đảm bảo rằng
thiết bị tuân thủ
Tài liệu định nghĩa về khả năng tương thích (CDD).
Trình tải Vulkan
Trình tải Vulkan platform/frameworks/native/vulkan
là
giao diện chính giữa các ứng dụng Vulkan và trình điều khiển Vulkan của thiết bị. Vulkan
trình tải được cài đặt tại /system/lib[64]/libvulkan.so
. Trình tải
cung cấp các điểm truy cập API Vulkan chính, điểm truy cập của tiện ích
theo yêu cầu của Android CDD cũng như nhiều tiện ích bổ sung không bắt buộc. Cửa sổ
Tiện ích Tích hợp hệ thống (WSI) được trình tải xuất và chủ yếu là tiện ích
được triển khai trong trình tải thay vì trong trình điều khiển. Trình tải cũng hỗ trợ
liệt kê và tải các lớp có thể hiển thị các tiện ích bổ sung và chặn
các lệnh gọi API cốt lõi đến người lái xe.
NDK có một thư viện libvulkan.so
mã giả lập dành cho
liên kết. Thư viện sẽ xuất các ký hiệu giống như trình tải. Ứng dụng gọi các hàm
được xuất từ thư viện libvulkan.so
thực sang
nhập các hàm đàn hồi vào trình tải. Các hàm này sẽ gửi đến
hoặc trình điều khiển dựa trên đối số đầu tiên của chúng. vkGet*ProcAddr()
lệnh gọi trả về các con trỏ hàm mà trampolines gửi đến (nghĩa là
nó gọi trực tiếp vào mã API cốt lõi). Gọi thông qua hàm
con trỏ (thay vì các biểu tượng được xuất) lại hiệu quả hơn
bỏ qua thành phần phản hồi và điều phối.
Liệt kê và tải trình điều khiển
Khi xây dựng hình ảnh hệ thống, Android yêu cầu hệ thống biết GPU nào
có sẵn. Trình tải sử dụng cơ chế HAL hiện có trong
hardware.h
để khám phá và tải trình điều khiển. Các đường dẫn ưu tiên cho trình điều khiển Vulkan 32 bit và 64 bit là:
/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib/hw/vulkan.<ro.product.platform>.so /vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib64/hw/vulkan.<ro.product.platform>.so
Trong Android 7.0 trở lên, đạo hàm hw_module_t
của Vulkan
gói một cấu trúc hw_module_t
duy nhất; chỉ một trình điều khiển được hỗ trợ và chuỗi không đổi
HWVULKAN_DEVICE_0
được truyền cho open()
.
Đạo hàm hw_device_t
của Vulkan tương ứng với một
có thể hỗ trợ nhiều thiết bị thực. Chiến lược phát hành đĩa đơn
Cấu trúc hw_device_t
có thể mở rộng để xuất dữ liệu
vkGetGlobalExtensionProperties()
, vkCreateInstance()
và
Các hàm vkGetInstanceProcAddr()
. Trình tải có thể tìm thấy mọi thông tin khác
VkInstance()
, VkPhysicalDevice()
và
vkGetDeviceProcAddr()
hoạt động bằng cách gọi
vkGetInstanceProcAddr()
của cấu trúc hw_device_t
.
Khám phá lớp và tải lớp
Trình tải Vulkan hỗ trợ việc liệt kê và tải các lớp có thể cho thấy các tiện ích bổ sung và chặn các lệnh gọi API cốt lõi trong quá trình đến trình điều khiển. Android không bao gồm các lớp trên ảnh hệ thống; tuy nhiên, ứng dụng có thể bao gồm các lớp trong APK của chúng.
Khi sử dụng lớp, xin lưu ý rằng mô hình bảo mật và chính sách của Android khác biệt đáng kể so với các nền tảng khác. Cụ thể, Android không cho phép tải mã bên ngoài vào quy trình không thể gỡ lỗi trong quá trình sản xuất (chưa bị can thiệp vào hệ thống) các thiết bị, cũng như không cho phép mã bên ngoài kiểm tra hoặc kiểm soát bộ nhớ, trạng thái, v.v. Quy định này bao gồm quy định cấm lưu tệp kết xuất cốt lõi, API dấu vết và những thứ khác vào ổ đĩa để kiểm tra sau này. Chỉ các lớp được phân phối như một phần của Các ứng dụng không thể gỡ lỗi được bật trên thiết bị chính thức và trình điều khiển không được cung cấp vi phạm các chính sách này.
Các trường hợp sử dụng lớp bao gồm:
- Lớp thời gian phát triển — Xác thực không nên cài đặt các lớp và chèn cho các công cụ theo dõi/phân tích/gỡ lỗi hình ảnh hệ thống của các thiết bị sản xuất. Lớp xác thực và chèn các công cụ theo dõi/lập hồ sơ/gỡ lỗi phải được cập nhật mà không cần hệ thống hình ảnh. Nhà phát triển muốn sử dụng của các lớp này trong quá trình phát triển có thể sửa đổi gói ứng dụng, ví dụ: bằng cách thêm một tệp vào thư mục thư viện gốc. kỹ sư IHV và OEM muốn chẩn đoán lỗi trong quá trình vận chuyển ứng dụng không thể sửa đổi được cho là có quyền truy cập vào các bản dựng không chính thức (đã bị can thiệp vào hệ thống) của hình ảnh hệ thống, trừ phi các ứng dụng đó có thể gỡ lỗi. Để biết thêm thông tin, hãy xem bài viết Các lớp xác thực Vulkan trên Android.
- Các lớp tiện ích — Các lớp này sẽ hiển thị các tiện ích, chẳng hạn như một lớp triển khai trình quản lý bộ nhớ cho bộ nhớ thiết bị. Nhà phát triển chọn các lớp và phiên bản của những lớp đó để sử dụng trong ứng dụng; các ứng dụng khác sử dụng cùng một lớp có thể vẫn sử dụng phiên bản khác nhau. Nhà phát triển chọn lớp nào trong số này để đưa vào ứng dụng .
- Các lớp được chèn (ngầm ẩn) – Bao gồm các lớp như tốc độ khung hình, mạng xã hội và lớp phủ trình chạy trò chơi do người dùng hoặc một số ứng dụng khác mà ứng dụng không biết hoặc không đồng ý. Các vi phạm chính sách bảo mật của Android và không được hỗ trợ.
Đối với các ứng dụng không thể gỡ lỗi, trình tải chỉ tìm kiếm các lớp trong
thư mục thư viện gốc của ứng dụng và cố gắng tải bất kỳ thư viện nào có tên
khớp với một mẫu cụ thể (ví dụ: libVKLayer_foo.so
).
Đối với các ứng dụng có thể gỡ lỗi, trình tải sẽ tìm kiếm các lớp trong
/data/local/debug/vulkan
và cố gắng tải bất kỳ thư viện nào phù hợp
một mẫu cụ thể.
Android cho phép chuyển các lớp cùng với những thay đổi về môi trường tạo bản dựng giữa Android và các nền tảng khác. Để biết chi tiết về giao diện giữa các lớp và trình tải, xem Cấu trúc của giao diện trình tải Vulkan. Người Khronos duy trì các lớp xác thực được lưu trữ trong Lớp xác thực Vulkan.
Các phiên bản và chức năng của API Vulkan
Bảng sau đây liệt kê các phiên bản API Vulkan cho một số bản phát hành Android.Phiên bản Android | Phiên bản Vulkan |
---|---|
Android 13 | Vulkan 1.3 |
Android 9 | Vulkan 1.1 |
Android 7 | Vulkan 1.0 |
Tổng quan về chức năng Vulkan 1.3
Vulkan 1.3 tích hợp một số tiện ích không bắt buộc trước đây vào chức năng cốt lõi của Vulkan. Phần lớn chức năng này được đưa vào với mục đích tăng cường khả năng kiểm soát và mức độ chi tiết hơn giao diện lập trình Vulkan. Không cần đến các thực thể lượt kết xuất truyền một lần kết xuất đối tượng truyền hoặc vùng đệm khung. Tổng số đối tượng trạng thái quy trình có thể giảm, và đồng bộ hoá trong API được cải tiến toàn diện. Vulkan 1.3 có cùng yêu cầu phần cứng như Vulkan 1.2, 1.1 và 1.0, với hầu hết việc triển khai trong trình điều khiển đồ hoạ dành riêng cho SoC, không phải trong khung này.
Sau đây là các tính năng quan trọng nhất của Vulkan 1.3 dành cho Android:
- Hỗ trợ các thực thể lượt kết xuất một lần
- Hỗ trợ chấm dứt ngay lập tức lệnh gọi chương trình đổ bóng
- Chi tiết hơn trong việc tạo, chia sẻ và kiểm soát quy trình
Vulkan 1.3 cũng bao gồm một số tính năng nhỏ hơn và các tính năng nâng cao về khả năng hữu dụng API. Tất cả thay đổi Bạn có thể tìm thấy API Vulkan cốt lõi với bản sửa đổi nhỏ 1.3 tại Các bản sửa đổi chính (Vulkan 1.3).
Tổng quan về chức năng của Vulkan 1.2
Vulkan 1.2 bổ sung một số tính năng và tiện ích giúp đơn giản hoá nền tảng API. bao gồm Mô hình bộ nhớ hợp nhất và thông tin bổ sung có thể truy vấn được từ trình điều khiển thiết bị. Vulkan 1.2 có các yêu cầu phần cứng tương tự như Vulkan 1.0 và 1.1; tất cả Việc triển khai nằm trong trình điều khiển đồ hoạ dành riêng cho SoC chứ không phải khung.
Tính năng quan trọng nhất của Vulkan 1.2 dành cho Android là hỗ trợ bộ nhớ 8 bit.
Vulkan 1.2 cũng bao gồm một số tính năng nhỏ hơn và các tính năng nâng cao về khả năng hữu dụng API. Tất cả thay đổi Bạn có thể tìm thấy API Vulkan cốt lõi với bản sửa đổi nhỏ 1.2 tại Các bản sửa đổi chính (Vulkan 1.2).
Tổng quan về chức năng Vulkan 1.1
Vulkan 1.1 có tính năng hỗ trợ khả năng tương tác bộ nhớ/đồng bộ hoá, cho phép OEM hỗ trợ Vulkan 1.1 trên thiết bị. Ngoài ra, khả năng tương tác bộ nhớ/đồng bộ hoá cho phép nhà phát triển để xác định xem Vulkan 1.1 có được hỗ trợ trên thiết bị hay không và sử dụng hiệu quả khi cần. Vulkan 1.1 có cùng yêu cầu phần cứng như Vulkan 1.0, nhưng hầu hết các Việc triển khai nằm trong trình điều khiển đồ hoạ dành riêng cho SOC, không phải trong khung.
Sau đây là các tính năng quan trọng nhất của Vulkan 1.1 dành cho Android:
- Hỗ trợ nhập và xuất vùng đệm bộ nhớ và đồng bộ hoá đối tượng từ bên ngoài Vulkan (để tương tác với máy ảnh, bộ mã hoá và giải mã và GLES)
- Hỗ trợ các định dạng YCbCr
Vulkan 1.1 cũng bao gồm một số tính năng nhỏ hơn và các tính năng nâng cao về khả năng hữu dụng API. Tất cả thay đổi được thực hiện cho API Vulkan cốt lõi với bản sửa đổi nhỏ 1.1 tại Các bản sửa đổi chính (Vulkan 1.1).
Chọn chế độ hỗ trợ Vulkan
Các thiết bị Android phải hỗ trợ bộ tính năng Vulkan tiên tiến nhất hiện có, miễn là các thiết bị đó hỗ trợ ABI 64 bit và không phải là bộ nhớ thấp.
Các thiết bị chạy Android 13 trở lên cần hỗ trợ Vulkan 1.3.
Các thiết bị chạy qua Android 10 sẽ hỗ trợ Vulkan 1.1.
Các thiết bị khác có thể tuỳ ý hỗ trợ Vulkan 1.3, 1.2 và 1.1.
Hỗ trợ một phiên bản Vulkan
Thiết bị Android sẽ hỗ trợ phiên bản Vulkan nếu đáp ứng các điều kiện sau:
- Thêm trình điều khiển Vulkan hỗ trợ phiên bản Vulkan được quan tâm (đây phải là một trong các phiên bản Vulkan) 1.3, 1.1 hoặc 1.0) cùng với các yêu cầu bổ sung về CDD của Phiên bản Android. Ngoài ra, hãy cập nhật một trình điều khiển Vulkan hiện có của số phiên bản Vulkan thấp hơn.
- Đối với Vulkan 1.3 hoặc 1.1, hãy đảm bảo rằng tính năng hệ thống do trình quản lý gói trả về sẽ trả về
true
cho đúng phiên bản vulkan.- Đối với Vulkan 1.3, tính năng này là
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
. - Đối với Vulkan 1.1, tính năng này là
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
.
true
cho Vulkan 1.3 và Vulkan 1.1 bằng cách thêm quy tắc, hiển thị như sau vào tệpdevice.mk
thích hợp.- Thêm nội dung sau đây cho Vulkan 1.3:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- Đối với Vulkan 1.3, tính năng này là
- Thêm nội dung sau đây cho Vulkan 1.1:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
Hồ sơ cơ sở Android (ABP)
Tất cả thiết bị Android nên tuân thủ hồ sơ Android Baseline 2022 mới nhất vì được nêu trong Hướng dẫn về Hồ sơ cơ sở trên Android.
Mọi thiết bị hỗ trợ Android 14 trở lên và API Vulkan, phải
đáp ứng tất cả chức năng được xác định trong
Hồ sơ Android Baseline 2021. Dưới đây là danh sách đầy đủ các chức năng bắt buộc
được liệt kê trong tệp json
của hồ sơ Vulkan, nhưng là một tập hợp con chính của thuộc tính bắt buộc
bao gồm:
- Kết cấu được nén thông qua ASTC và ETC.
- Hệ màu biến đổi thông qua
VK_EXT_swapchain_colorspace
. - Đổ bóng mẫu và nội suy đa mẫu thông qua
sampleRateShading
.
Tích hợp hệ thống cửa sổ (WSI)
Trong libvulkan.so
, trình điều khiển triển khai các tiện ích tích hợp hệ thống cửa sổ (WSI) sau:
VK_KHR_surface
VK_KHR_android_surface
VK_KHR_swapchain
VK_KHR_driver_properties
, được triển khai cho Vulkan 1.1 trong Chỉ Android 10VK_GOOGLE_display_timing
, được triển khai cho mọi phiên bản Vulkan trong Android 10
Các đối tượng VkSurfaceKHR
và VkSwapchainKHR
cùng tất cả
các hoạt động tương tác với ANativeWindow
do nền tảng xử lý và không
tiếp xúc với người lái xe. Việc triển khai WSI dựa trên
Tiện ích VK_ANDROID_native_buffer
, phải là
được người lái xe hỗ trợ; tiện ích này chỉ được dùng cho hoạt động triển khai WSI
và không tiếp xúc với các ứng dụng.
Cờ sử dụng Gralloc
Quá trình triển khai Vulkan có thể cần phân bổ vùng đệm chuỗi hoán đổi Cờ sử dụng Gralloc riêng tư do triển khai xác định. Khi tạo một chuỗi hoán đổi, Android yêu cầu người lái xe dịch định dạng được yêu cầu và việc sử dụng hình ảnh cờ vào cờ sử dụng Gralloc bằng cách gọi:
typedef enum VkSwapchainImageUsageFlagBitsANDROID { VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001, VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSwapchainImageUsageFlagBitsANDROID; typedef VkFlags VkSwapchainImageUsageFlagsANDROID; VkResult VKAPI vkGetSwapchainGrallocUsage2ANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, VkSwapchainImageUsageFlagsANDROID swapchainUsage, uint64_t* grallocConsumerUsage, uint64_t* grallocProducerUsage );
Các tham số format
và imageUsage
được lấy từ
cấu trúc VkSwapchainCreateInfoKHR
. Tài xế sẽ điền
*grallocConsumerUsage
và *grallocProducerUsage
có
cờ sử dụng Gralloc bắt buộc cho định dạng
và mức sử dụng Google Ads. Các cờ sử dụng mà trình điều khiển trả về được kết hợp với việc sử dụng
cờ mà thực thể tiêu thụ trong chuỗi hoán đổi yêu cầu khi phân bổ vùng đệm.
Android 7.x gọi phiên bản cũ của VkSwapchainImageUsageFlagsANDROID()
,
có tên là vkGetSwapchainGrallocUsageANDROID()
. Ngừng sử dụng Android 8.0 trở lên
vkGetSwapchainGrallocUsageANDROID()
nhưng vẫn gọi
vkGetSwapchainGrallocUsageANDROID()
nếu
vkGetSwapchainGrallocUsage2ANDROID()
không do người lái xe cung cấp:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage );
vkGetSwapchainGrallocUsageANDROID()
không hỗ trợ sử dụng chuỗi hoán đổi
cờ hoặc cờ sử dụng Gralloc mở rộng.
Hình ảnh dựa trên Gralloc
VkNativeBufferANDROID
là một tiện ích vkCreateImage
để tạo hình ảnh dựa trên vùng đệm Gralloc. VkNativeBufferANDROID
là
được cung cấp cho vkCreateImage()
trong VkImageCreateInfo
chuỗi cấu trúc. Cuộc gọi đến vkCreateImage()
với VkNativeBufferANDROID
diễn ra
trong khi gọi đến vkCreateSwapchainKHR
. Việc triển khai WSI sẽ phân bổ
số lượng vùng đệm gốc được yêu cầu cho chuỗi hoán đổi, sau đó tạo một
VkImage
cho mỗi loại:
typedef struct { VkStructureType sType; // must be VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID const void* pNext; // Buffer handle and stride returned from gralloc alloc() buffer_handle_t handle; int stride; // Gralloc format and usage requested when the buffer was allocated. int format; int usage; // Beginning in Android 8.0, the usage field above is deprecated and the // usage2 struct below was added. The usage field is still filled in for // compatibility with Android 7.0 drivers. Drivers for Android 8.0 // should prefer the usage2 struct, especially if the // android.hardware.graphics.allocator HAL uses the extended usage bits. struct { uint64_t consumer; uint64_t producer; } usage2; } VkNativeBufferANDROID;
Khi tạo một hình ảnh dựa trên Gralloc, VkImageCreateInfo
đã
các dữ liệu sau:
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO .pNext = the above VkNativeBufferANDROID structure .imageType = VK_IMAGE_TYPE_2D .format = a VkFormat matching the format requested for the gralloc buffer .extent = the 2D dimensions requested for the gralloc buffer .mipLevels = 1 .arraySize = 1 .samples = 1 .tiling = VK_IMAGE_TILING_OPTIMAL .usage = VkSwapchainCreateInfoKHR::imageUsage .flags = 0 .sharingMode = VkSwapchainCreateInfoKHR::imageSharingMode .queueFamilyCount = VkSwapchainCreateInfoKHR::queueFamilyIndexCount .pQueueFamilyIndices = VkSwapchainCreateInfoKHR::pQueueFamilyIndices
Trên Android 8.0 trở lên, nền tảng này cung cấp
Cấu trúc tiện ích VkSwapchainImageCreateInfoKHR
trong
Đã cung cấp chuỗi VkImageCreateInfo
cho vkCreateImage
khi cần bất kỳ cờ sử dụng hình ảnh nào trong chuỗi hoán đổi cho chuỗi hoán đổi.
Cấu trúc tiện ích chứa các cờ sử dụng hình ảnh trong chuỗi hoán đổi:
typedef struct { VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID const void* pNext; VkSwapchainImageUsageFlagsANDROID usage; } VkSwapchainImageCreateInfoANDROID;
Trên Android 10 trở lên, nền tảng này hỗ trợ
VK_KHR_swapchain
phiên bản 70, vì vậy, ứng dụng Vulkan có thể tạo một
VkImage
được bộ nhớ chuỗi hoán đổi hỗ trợ. Ứng dụng gọi đầu tiên
vkCreateImage
có VkImageSwapchainCreateInfoKHR
cấu trúc được xâu chuỗi với cấu trúc VkImageCreateInfo
. Sau đó
ứng dụng gọi vkBindImageMemory2(KHR)
bằng
Cấu trúc VkBindImageMemorySwapchainInfoKHR
được xâu chuỗi với
Cấu trúc VkBindImageMemoryInfo
. imageIndex
được chỉ định trong cấu trúc VkBindImageMemorySwapchainInfoKHR
phải
là chỉ mục hình ảnh chuỗi hoán đổi hợp lệ. Trong khi đó, nền tảng này cung cấp
Cấu trúc tiện ích VkNativeBufferANDROID
có phần mở rộng tương ứng
Thông tin vùng đệm Gralloc đến chuỗi VkBindImageMemoryInfo
, vì vậy
trình điều khiển biết vùng đệm Gralloc nào để liên kết VkImage
với.
Lấy hình ảnh
vkAcquireImageANDROID
có được quyền sở hữu hình ảnh chuỗi hoán đổi
và nhập một hàng rào gốc được báo hiệu từ bên ngoài vào cả
Đối tượng VkSemaphore
và một đối tượng VkFence
hiện có:
VkResult VKAPI vkAcquireImageANDROID( VkDevice device, VkImage image, int nativeFenceFd, VkSemaphore semaphore, VkFence fence );
vkAcquireImageANDROID()
được gọi trong khoảng thời gian
vkAcquireNextImageKHR
để nhập một
hàng rào gốc vào các đối tượng VkSemaphore
và VkFence
do ứng dụng cung cấp (tuy nhiên, cả semaphore và đối tượng hàng rào đều
không bắt buộc trong cuộc gọi này). Người lái xe cũng có thể tận dụng cơ hội này để nhận ra
và xử lý mọi thay đổi bên ngoài đối với trạng thái vùng đệm Gralloc; nhiều người lái xe sẽ không
cần làm gì ở đây. Lệnh gọi này đặt VkSemaphore
và
VkFence
sang trạng thái đang chờ xử lý tương tự như được vkQueueSubmit
báo hiệu,
vì vậy, hàng đợi có thể chờ trên semaphore và ứng dụng có thể chờ trên hàng rào.
Cả hai đối tượng đều được báo hiệu khi hàng rào gốc cơ bản phát tín hiệu; nếu
hàng rào gốc đã được báo hiệu thì semaphore đã có trong hàng rào được báo hiệu
trạng thái khi hàm này trả về. Trình điều khiển sẽ sở hữu chỉ số mô tả tệp hàng rào và đóng chỉ số mô tả tệp hàng rào khi không cần thiết nữa. Tài xế
phải làm như vậy ngay cả khi không có vật thể semaphore hoặc hàng rào nào được cung cấp, hoặc ngay cả khi
vkAcquireImageANDROID
không thành công và trả về một lỗi. Nếu
fenceFd
là -1, giống như hàng rào gốc này đã
.
Phát hành hình ảnh
vkQueueSignalReleaseImageANDROID
chuẩn bị hình ảnh chuỗi hoán đổi cho
sử dụng bên ngoài, tạo hàng rào gốc và lên lịch phát tín hiệu hàng rào gốc sau
semaphores đầu vào đã báo hiệu:
VkResult VKAPI vkQueueSignalReleaseImageANDROID( VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd );
vkQueuePresentKHR()
gọi vkQueueSignalReleaseImageANDROID()
trên hàng đợi được cung cấp. Người lái xe phải tạo ra một hàng rào tự nhiên không có tín hiệu
cho đến tất cả waitSemaphoreCount
semaphores trong
tín hiệu pWaitSemaphores
và mọi công việc khác cần thiết để
chuẩn bị image
để hoàn tất bản trình bày.
Nếu sự kiện semaphores chờ (nếu có) đã được báo hiệu và queue
là
đang ở trạng thái rảnh, người lái xe có thể đặt *pNativeFenceFd
thành -1
thay vì chỉ số mô tả tệp hàng rào gốc thực tế, cho biết rằng
không có gì phải chờ đợi cả. Phương thức gọi sở hữu và đóng chỉ số mô tả tệp
đã trả về trong *pNativeFenceFd
.
Nhiều người lái xe có thể bỏ qua thông số hình ảnh, nhưng một số người có thể cần chuẩn bị
Cấu trúc dữ liệu phía CPU được liên kết với vùng đệm Gralloc để sử dụng bởi bộ nhớ ngoài
người tiêu dùng hình ảnh. Việc chuẩn bị nội dung vùng đệm để người tiêu dùng bên ngoài sử dụng phải
được thực hiện không đồng bộ trong quá trình chuyển đổi hình ảnh để
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
.
Nếu hình ảnh được tạo bằng
VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID
, thì người lái xe phải
cho phép gọi vkQueueSignalReleaseImageANDROID()
nhiều lần
mà không có lệnh gọi can thiệp đến vkAcquireImageANDROID()
.
Hỗ trợ hình ảnh có thể trình bày được chia sẻ
Một số thiết bị có thể chia sẻ quyền sở hữu một hình ảnh giữa
quy trình hiển thị và triển khai Vulkan để giảm thiểu độ trễ.
Trong Android 9 trở lên, trình tải quảng cáo có điều kiện
Tiện ích VK_KHR_shared_presentable_image
dựa trên chế độ cài đặt của người lái xe
phản hồi cuộc gọi đến vkGetPhysicalDeviceProperties2
.
Nếu trình điều khiển không hỗ trợ Vulkan 1.1 hoặc
Tiện ích VK_KHR_physical_device_properties2
, trình tải không
quảng cáo hỗ trợ hình ảnh trình chiếu được chia sẻ. Nếu không, trình tải sẽ truy vấn
các chức năng của người lái xe bằng cách gọi vkGetPhysicalDeviceProperties2()
và bao gồm cấu trúc sau trong phần
Chuỗi VkPhysicalDeviceProperties2::pNext
:
typedef struct { VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID const void* pNext; VkBool32 sharedImage; } VkPhysicalDevicePresentationPropertiesANDROID;
Người lái xe có thể chia sẻ quyền sở hữu một hình ảnh với màn hình hay không
hệ thống, nó sẽ đặt thành phần sharedImage
thành VK_TRUE
.
Xác nhận kết quả
OEM có thể kiểm thử cách triển khai Vulkan bằng cách sử dụng CTS, bao gồm:
- Kiểm thử tính tuân thủ của Khronos Vulkan
trong mô-đun
CtsDeqpTestCases
, trong đó bao gồm các bài kiểm thử API chức năng cho Vulkan 1.0, 1.1, 1.2 và 1.3. - Mô-đun
CtsGraphicsTestCases
kiểm thử xem thiết bị được định cấu hình chính xác cho các chức năng Vulkan mà nó hỗ trợ.
Cờ tính năng Vulkan
Một thiết bị hỗ trợ Android 11 trở lên và có hỗ trợ API Vulkan
bắt buộc phải hiển thị cờ tính năng,
android.software.vulkan.deqp.level
. Giá trị của cờ tính năng này
là ngày, được mã hoá dưới dạng giá trị số nguyên. Ngày liên kết với
các bài kiểm thử dEQP Vulkan mà thiết bị tuyên bố là đạt.
Ngày có dạng YYYY-MM-DD được mã hoá thành số nguyên 32 bit như sau:
- Bit 0-15 lưu trữ trong năm
- Bit 16-23 lưu trữ trong tháng
- Bit 24-31 lưu trữ trong ngày
Giá trị tối thiểu được phép cho cờ tính năng là 0x07E30301
,
tương ứng với ngày 1-03-2019, là ngày được liên kết với
Các bài kiểm thử dEQP Vulkan cho Android 10. Nếu cờ tính năng có ít nhất là giá trị này,
thiết bị này tuyên bố vượt qua tất cả các bài kiểm thử dEQP về Vulkan của Android 10.
Giá trị 0x07E40301
tương ứng với ngày 01/03/2020, tức là
ngày liên quan đến các bài kiểm thử dEQP Vulkan cho Android 11. Nếu đối tượng
ít nhất là giá trị này, thiết bị tuyên bố đạt được tất cả các tính năng của Android 11
Kiểm thử dEQP trong Vulkan.
Giá trị 0x07E60301
tương ứng với ngày 1/3/2022, tức là
ngày liên quan đến các bài kiểm thử dEQP Vulkan cho
Android 13. Nếu cờ tính năng có ít nhất là giá trị này,
thiết bị này tuyên bố vượt qua mọi giao diện Vulkan của Android 13
Các thử nghiệm dEQP.
Một thiết bị cho thấy cờ tính năng cụ thể (tức là
0x07E30301
, 0x07E40301
, 0x07E60301
)
tuyên bố vượt qua tất cả các bài kiểm thử dEQP của Android Vulkan của cờ tính năng đó (Android 10,
Android 11 và Android 13). Thiết bị này
có thể vượt qua các bài kiểm thử dEQP Vulkan từ bản phát hành Android sau này.
Vulkan dEQP tạo thành một phần của Android CTS. Trên Android 11, trình chạy kiểm thử dEQP
thành phần của CTS có nhận biết được android.software.vulkan.deqp.level
cờ tính năng và bỏ qua mọi kiểm thử dEQP Vulkan mà – theo
cờ tính năng – thiết bị không tuyên bố hỗ trợ. Những kiểm thử như vậy
được báo cáo là thông qua một cách bình thường.