Triển khai Vulkan

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_LEVELFEATURE_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()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:

  1. 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.
  2. Đố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).
    Trình quản lý gói sẽ trả về 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ệp device.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
      
    • 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 10
  • VK_GOOGLE_display_timing, được triển khai cho mọi phiên bản Vulkan trong Android 10

Các đối tượng VkSurfaceKHRVkSwapchainKHR 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ố formatimageUsage được lấy từ cấu trúc VkSwapchainCreateInfoKHR. Tài xế sẽ điền *grallocConsumerUsage*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 vkCreateImageVkImageSwapchainCreateInfoKHR 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 VkSemaphoreVkFence 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 VkSemaphoreVkFence 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.