Triển khai Vulkan

Vulkan là API đa nền tảng, chi phí thấp dành cho đồ họa 3D hiệu suất cao. Giống như OpenGL ES (GLES) , Vulkan cung cấp các công cụ để tạo đồ họa thời gian thực, chất lượng cao trong ứng dụng. Ưu điểm của việc sử dụng Vulkan bao gồm giảm chi phí CPU và hỗ trợ ngôn ngữ trung gian nhị phân SPIR-V .

Để triển khai Vulkan thành công, một thiết bị phải bao gồm:

  • Trình tải Vulkan, được cung cấp bởi Android.
  • Trình điều khiển Vulkan, được cung cấp bởi các SoC như GPU IHV, triển khai API Vulkan . Để hỗ trợ chức năng Vulkan, thiết bị Android cần có phần cứng GPU hỗ trợ Vulkan và trình điều khiển liên quan. GPU cũng phải hỗ trợ GLES 3.1 trở lên. Hãy tham khảo nhà cung cấp SoC của bạn để yêu cầu hỗ trợ trình điều khiển.

Nếu một thiết bị có trình điều khiển Vulkan, thiết bị đó cần khai báo các tính năng hệ thống FEATURE_VULKAN_HARDWARE_LEVELFEATURE_VULKAN_HARDWARE_VERSION , 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 Tương thích (CDD).

Trình tải Vulkan

platform/frameworks/native/vulkan trình tải Vulkan là giao diện chính giữa ứng dụng Vulkan và trình điều khiển Vulkan của thiết bị. Trình tải Vulkan được cài đặt tại /system/lib[64]/libvulkan.so . Trình tải cung cấp các điểm vào API Vulkan cốt lõi, điểm vào của các tiện ích mở rộng được CDD Android yêu cầu và nhiều tiện ích mở rộng tùy chọn bổ sung. Các phần mở rộng Tích hợp hệ thống cửa sổ (WSI) được trình tải xuất ra và chủ yếu được triển khai trong trình tải chứ không phải trong trình điều khiển. Trình tải cũng hỗ trợ việc liệt kê và tải các lớp có thể hiển thị các tiện ích mở rộng bổ sung và chặn các lệnh gọi API cốt lõi trên đường tới trình điều khiển.

NDK bao gồm một thư viện libvulkan.so sơ khai để liên kết. Thư viện xuất các ký hiệu giống như trình tải. Các ứng dụng gọi các hàm được xuất từ ​​thư viện libvulkan.so thực để nhập các hàm tấm bạt lò xo vào trình tải, các hàm này sẽ gửi đến lớp hoặc trình điều khiển thích hợp dựa trên đối số đầu tiên của chúng. Lệnh gọi vkGet*ProcAddr() trả về các con trỏ hàm mà tấm bạt lò xo gửi tới (nghĩa là nó gọi trực tiếp vào mã API lõi). Việc gọi thông qua các con trỏ hàm, thay vì các ký hiệu được xuất, sẽ hiệu quả hơn vì nó bỏ qua tấm bạt lò xo và điều phối.

Liệt kê và tải trình điều khiển

Khi hình ảnh hệ thống được xây dựng, Android mong đợi 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. Đường dẫn ưa thích 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 Vulkan hw_module_t bao bọc một cấu trúc hw_module_t duy nhất; chỉ có một trình điều khiển được hỗ trợ và chuỗi không đổi HWVULKAN_DEVICE_0 được chuyển tới open() .

Đạo hàm Vulkan hw_device_t tương ứng với một trình điều khiển duy nhất có thể hỗ trợ nhiều thiết bị vật lý. Cấu trúc hw_device_t có thể mở rộng để xuất các hàm vkGetGlobalExtensionProperties() , vkCreateInstance()vkGetInstanceProcAddr() . Trình tải có thể tìm thấy tất cả các hàm VkInstance() , VkPhysicalDevice()vkGetDeviceProcAddr() khác bằng cách gọi vkGetInstanceProcAddr() của cấu trúc hw_device_t .

Phát hiện và tải lớp

Trình tải Vulkan hỗ trợ liệt kê và tải các lớp có thể hiển thị các tiện ích mở rộng bổ sung và chặn các lệnh gọi API cốt lõi trên đường tới trình điều khiển. Android không bao gồm các lớp trên hình ả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 các lớp, hãy nhớ rằng mô hình và chính sách bảo mật của Android khác biệt đáng kể so với các nền tảng khác. Đặc biệt, Android không cho phép tải mã bên ngoài vào một quy trình không thể sửa lỗi trên các thiết bị sản xuất (không được root) 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 của quy trình, v.v. Điều này bao gồm việc cấm lưu các kết xuất lõi, dấu vết API, v.v. vào đĩa để kiểm tra sau. Chỉ các lớp được phân phối như một phần của ứng dụng không thể gỡ lỗi mới được bật trên thiết bị sản xuất và trình điều khiển không được cung cấp chức năng vi phạm các chính sách này.

Các trường hợp sử dụng cho các lớp bao gồm:

  • Lớp thời gian phát triển — Không nên cài đặt các lớp xác thực và miếng chêm cho các công cụ theo dõi/lập hồ sơ/gỡ lỗi trên hình ảnh hệ thống của thiết bị sản xuất. Các lớp xác thực và miếng chêm cho các công cụ theo dõi/lập hồ sơ/gỡ lỗi phải có thể cập nhật được mà không cần hình ảnh hệ thống. Các nhà phát triển muốn sử dụng một trong các lớp này trong quá trình phát triển có thể sửa đổi gói ứng dụng, chẳng hạn như bằng cách thêm tệp vào thư mục thư viện gốc của họ. Các kỹ sư IHV và OEM muốn chẩn đoán lỗi khi vận chuyển các ứ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 hình ảnh hệ thống không sản xuất (đã root), trừ khi những ứng dụng đó có thể gỡ lỗi được. Để biết thêm thông tin, hãy xem Lớp xác thực Vulkan trên Android .
  • Các lớp tiện ích - Các lớp này hiển thị các phần mở rộng, chẳng hạn như 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 các lớp đó để sử dụng trong ứng dụng của họ; các ứng dụng khác nhau sử dụng cùng một lớp vẫn có thể sử dụng các phiên bản khác nhau. Các nhà phát triển chọn lớp nào trong số này sẽ được đưa vào gói ứng dụng của họ.
  • Các lớp được chèn (ẩ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 khởi chạy trò chơi do người dùng hoặc một số ứng dụng khác cung cấp mà ứng dụng không biết hoặc không đồng ý. Những điều này 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ể sửa 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 khớp với một mẫu cụ thể.

Android cho phép các lớp được chuyển với những thay đổi về môi trường xây 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, hãy xem Kiến trúc của Giao diện trình tải Vulkan . Các lớp xác thực do Khronos duy trì được lưu trữ trong Lớp xác thực Vulkan .

Các phiên bản và khả năng của API Vulkan

Bảng sau 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 của Vulkan 1.3

Vulkan 1.3 chuẩn hóa một số tiện ích mở rộng tùy chọn trước đây thành 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 trên giao diện lập trình Vulkan. Các trường hợp vượt qua kết xuất một lượt không còn cần các đối tượng kết xuất hoặc bộ đệm khung nữa. Tổng số đối tượng trạng thái quy trình có thể giảm xuống và đồng bộ hóa trong API được cải tiến. Vulkan 1.3 có các yêu cầu phần cứng giố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 đồ họa dành riêng cho SoC chứ không phải trong framework.

Các tính năng quan trọng nhất của Vulkan 1.3 dành cho Android là:

  • Hỗ trợ cho các trường hợp vượt qua kết xuất một lượt
  • Hỗ trợ chấm dứt ngay lập tức lệnh gọi shader
  • Độ chi tiết cao 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ải tiến khả năng sử dụng API. Tất cả các thay đổi được thực hiện đối với API Vulkan cốt lõi với bản sửa đổi nhỏ 1.3 có thể được tìm thấy tại Bản sửa đổi lõi (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 mở rộng giúp đơn giản hóa bề mặt API. Điều này bao gồm Mô hình bộ nhớ hợp nhất và thông tin bổ sung có thể được truy vấn từ trình điều khiển thiết bị. Vulkan 1.2 có cùng yêu cầu phần cứng như Vulkan 1.0 và 1.1; tất cả việc triển khai đều nằm trong trình điều khiển đồ họa dành riêng cho SoC chứ không phải trong khung.

Tính năng quan trọng nhất của Vulkan 1.2 dành cho Android là hỗ trợ lưu trữ 8 bit.

Vulkan 1.2 cũng bao gồm một số tính năng nhỏ hơn và cải tiến khả năng sử dụng API. Tất cả các thay đổi được thực hiện đối với API Vulkan cốt lõi với bản sửa đổi nhỏ 1.2 có thể được tìm thấy tại Bản sửa đổi lõi (Vulkan 1.2) .

Tổng quan về chức năng của Vulkan 1.1

Vulkan 1.1 bao gồm hỗ trợ tương tác bộ nhớ/đồng bộ hóa, cho phép các OEM hỗ trợ Vulkan 1.1 trên các thiết bị. Ngoài ra, khả năng tương tác bộ nhớ/đồng bộ hóa cho phép các 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 nó một cách hiệu quả khi có. Vulkan 1.1 có các yêu cầu phần cứng giống như Vulkan 1.0, nhưng hầu hết việc triển khai đều nằm trong trình điều khiển đồ họa dành riêng cho SOC chứ không phải trong khung.

Các tính năng quan trọng nhất của Vulkan 1.1 dành cho Android là:

  • Hỗ trợ nhập và xuất bộ đệm bộ nhớ và các đối tượng đồng bộ hóa từ bên ngoài Vulkan (để tương tác với máy ảnh, codec 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ải tiến khả năng sử dụng API. Tất cả các thay đổi được thực hiện đối với API Vulkan cốt lõi với bản sửa đổi nhỏ 1.1 có thể được tìm thấy tại Bản sửa đổi lõi (Vulkan 1.1) .

Chọn 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à chúng hỗ trợ ABI 64-bit và không có bộ nhớ thấp.

Các thiết bị chạy Android 13 trở lên phải hỗ trợ Vulkan 1.3.

Các thiết bị chạy Android 10 phải hỗ trợ Vulkan 1.1.

Các thiết bị khác có thể tùy chọn hỗ trợ Vulkan 1.3, 1.2 và 1.1.

Hỗ trợ phiên bản Vulkan

Thiết bị Android 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 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 CDD bổ sung của phiên bản Android. Ngoài ra, hãy cập nhật trình điều khiển Vulkan hiện có với 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 được trình quản lý gói trả về trả về true cho phiên bản Vulkan chính xác.
    • Đố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 phần sau 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 phần sau 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
      

Cấu hình cơ bản của Android (ABP)

Chúng tôi khuyến khích tất cả các thiết bị Android tuân thủ cấu hình Android Baseline 2022 mới nhất như được nêu trong hướng dẫn về cấu hình Android Baseline .

Mọi thiết bị hỗ trợ Android 14 trở lên và API Vulkan đều phải đáp ứng tất cả chức năng được xác định trong hồ sơ Android Baseline 2021 . Danh sách đầy đủ các chức năng cần thiết được liệt kê trong tệp json hồ sơ Vulkan, nhưng một tập hợp con chính của chức năng cần thiết bao gồm:

  • Kết cấu được nén thông qua ASTC và ETC.
  • Không gian màu có thể thay đổi thông qua VK_EXT_swapchain_colorspace .
  • Đổ bóng mẫu và nội suy nhiều 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 phần mở rộng 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 , chỉ được triển khai cho Vulkan 1.1 trên 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 như tất cả các tương tác với ANativeWindow đều được nền tảng xử lý và không hiển thị với trình điều khiển. Việc triển khai WSI dựa trên tiện ích mở rộng VK_ANDROID_native_buffer , tiện ích mở rộng này phải được trình điều khiển hỗ trợ; tiện ích mở rộng này chỉ được sử dụng khi triển khai WSI và không hiển thị với các ứng dụng.

Cờ sử dụng Gralloc

Việc triển khai Vulkan có thể cần phân bổ bộ đệm chuỗi hoán đổi bằng các cờ sử dụng Gralloc riêng do triển khai xác định. Khi tạo một chuỗi hoán đổi, Android yêu cầu trình điều khiển dịch các cờ sử dụng hình ảnh và định dạng được yêu cầu thành các 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 . Trình điều khiển phải điền *grallocConsumerUsage*grallocProducerUsage bằng các cờ sử dụng Gralloc cần thiết cho định dạng và cách sử dụng. Các cờ sử dụng được trình điều khiển trả về được kết hợp với các cờ sử dụng được yêu cầu bởi người tiêu dùng chuỗi trao đổi khi phân bổ bộ đệm.

Android 7.x gọi phiên bản cũ hơn của VkSwapchainImageUsageFlagsANDROID() , được đặt tên là vkGetSwapchainGrallocUsageANDROID() . Android 8.0 trở lên không dùng vkGetSwapchainGrallocUsageANDROID() nhưng vẫn gọi vkGetSwapchainGrallocUsageANDROID() nếu vkGetSwapchainGrallocUsage2ANDROID() không được trình điều khiển cung cấp:

VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
    VkDevice            device,
    VkFormat            format,
    VkImageUsageFlags   imageUsage,
    int*                grallocUsage
);

vkGetSwapchainGrallocUsageANDROID() không hỗ trợ cờ sử dụng chuỗi trao đổi hoặc cờ sử dụng Gralloc mở rộng.

Hình ảnh được hỗ trợ bởi Gralloc

VkNativeBufferANDROID là cấu trúc mở rộng vkCreateImage để tạo hình ảnh được hỗ trợ bởi bộ đệm Gralloc. VkNativeBufferANDROID được cung cấp cho vkCreateImage() trong chuỗi cấu trúc VkImageCreateInfo . Lệnh gọi vkCreateImage() bằng VkNativeBufferANDROID diễn ra trong khi gọi vkCreateSwapchainKHR . Việc triển khai WSI phân bổ số lượng bộ đệm gốc được yêu cầu cho chuỗi hoán đổi, sau đó tạo VkImage cho mỗi bộ đệm:

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 hình ảnh được hỗ trợ bởi Gralloc, VkImageCreateInfo 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

Trong Android 8.0 trở lên, nền tảng này cung cấp cấu trúc tiện ích mở rộng VkSwapchainImageCreateInfoKHR trong chuỗi VkImageCreateInfo được cung cấp cho vkCreateImage khi cần có bất kỳ cờ sử dụng hình ảnh chuỗi hoán đổi nào cho chuỗi hoán đổi. Cấu trúc tiện ích mở rộng chứa các cờ sử dụng hình ảnh 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;

Trong Android 10 trở lên, nền tảng này hỗ trợ VK_KHR_swapchain v70, do đó ứng dụng Vulkan có thể tạo VkImage được hỗ trợ bởi bộ nhớ swapchain. Trước tiên, ứng dụng sẽ gọi vkCreateImage bằng cấu trúc VkImageSwapchainCreateInfoKHR được nối với cấu trúc VkImageCreateInfo . Sau đó, ứng dụng gọi vkBindImageMemory2(KHR) với cấu trúc VkBindImageMemorySwapchainInfoKHR được nố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 mở rộng VkNativeBufferANDROID với thông tin bộ đệm Gralloc tương ứng cho chuỗi VkBindImageMemoryInfo , để trình điều khiển biết bộ đệm Gralloc nào để liên kết VkImage .

Thu được hình ảnh

vkAcquireImageANDROID có được quyền sở hữu hình ảnh chuỗi hoán đổi và nhập hàng rào gốc được tín hiệu bên ngoài vào cả đối tượng VkSemaphore hiện có và đố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 vkAcquireNextImageKHR để nhập 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ả đối tượng semaphore và hàng rào đều là tùy chọn trong lệnh gọi này). Trình điều khiển cũng có thể tận dụng cơ hội này để nhận biết và xử lý mọi thay đổi bên ngoài đối với trạng thái bộ đệm Gralloc; nhiều tài xế sẽ không cần phải làm gì ở đây. Lệnh gọi này đặt VkSemaphoreVkFence vào cùng trạng thái chờ xử lý như thể được báo hiệu bởi vkQueueSubmit , do đó hàng đợi có thể đợi trên semaphore và ứng dụng có thể đợi trên hàng rào.

Cả hai đối tượng đều được phát tín hiệu khi hàng rào gốc bên dưới phát tín hiệu; nếu hàng rào gốc đã được báo hiệu thì semaphore ở trạng thái được báo hiệu khi hàm này quay trở lại. Trình điều khiển có quyền sở hữu bộ mô tả tệp hàng rào và đóng bộ mô tả tệp hàng rào khi không còn cần thiết. Trình điều khiển phải làm như vậy ngay cả khi không có đối tượng 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ề lỗi. Nếu fenceFd là -1 thì có vẻ như hàng rào gốc đã được báo hiệu.

Phát hành hình ảnh

vkQueueSignalReleaseImageANDROID chuẩn bị hình ảnh chuỗi hoán đổi để sử dụng bên ngoài, tạo hàng rào gốc và lên lịch cho hàng rào gốc được báo hiệu sau khi các ngữ nghĩa đầ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. Trình điều khiển phải tạo ra một hàng rào gốc không phát tín hiệu cho đến khi tất cả các ngữ nghĩa waitSemaphoreCount trong tín hiệu pWaitSemaphores và bất kỳ công việc bổ sung nào cần thiết để chuẩn bị image cho bản trình bày hoàn tất.

Nếu các ẩn dụ chờ (nếu có) đã được báo hiệu và queue không hoạt động, trình điều khiển có thể đặt *pNativeFenceFd thành -1 thay vì bộ 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. Người gọi sở hữu và đóng bộ mô tả tệp được trả về trong *pNativeFenceFd .

Nhiều trình điều khiển có thể bỏ qua tham số hình ảnh, nhưng một số trình điều khiển có thể cần chuẩn bị cấu trúc dữ liệu phía CPU được liên kết với bộ đệm Gralloc để người tiêu dùng hình ảnh bên ngoài sử dụng. Việc chuẩn bị nội dung bộ đệ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ộ như một phần của quá trình chuyển hình ảnh sang VK_IMAGE_LAYOUT_PRESENT_SRC_KHR .

Nếu hình ảnh được tạo bằng VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID thì trình điều khiển phải cho phép gọi vkQueueSignalReleaseImageANDROID() nhiều lần mà không can thiệp vào các cuộc gọi đế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 mở rộng VK_KHR_shared_presentable_image dựa trên phản hồi của trình điều khiển đối với lệnh gọi tới vkGetPhysicalDeviceProperties2 .

Nếu trình điều khiển không hỗ trợ Vulkan 1.1 hoặc tiện ích mở rộng VK_KHR_physical_device_properties2 thì trình tải sẽ không quảng cáo hỗ trợ cho các hình ảnh có thể trình bày được chia sẻ. Mặt khác, trình tải sẽ truy vấn các khả năng của trình điều khiển bằng cách gọi vkGetPhysicalDeviceProperties2() và bao gồm cấu trúc sau trong chuỗi VkPhysicalDeviceProperties2::pNext :

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

Nếu trình điều khiển có thể chia sẻ quyền sở hữu hình ảnh với hệ thống hiển thị, nó sẽ đặt thành viên sharedImage thành VK_TRUE .

Thẩm định

Các OEM có thể kiểm tra việc triển khai Vulkan của họ bằng CTS, bao gồm:

  • Kiểm tra sự phù hợp của Khronos Vulkan trong mô-đun CtsDeqpTestCases , bao gồm các kiểm tra API chức năng cho Vulkan 1.0, 1.1, 1.2 và 1.3.
  • Mô-đun CtsGraphicsTestCases kiểm tra xem thiết bị có được cấu hình chính xác cho các khả năng Vulkan mà nó hỗ trợ hay không.

Cờ tính năng Vulkan

Cần có thiết bị hỗ trợ Android 11 trở lên và hỗ trợ API Vulkan để 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ã hóa dưới dạng giá trị số nguyên. Nó chỉ định ngày liên quan đến các bài kiểm tra Vulkan dEQP mà thiết bị tuyên bố đã vượt qua.

Ngày có dạng YYYY-MM-DD được mã hóa dưới dạng số nguyên 32 bit như sau:

  • Bit 0-15 lưu trữ năm
  • Bit 16-23 lưu trữ tháng
  • Bit 24-31 lưu trữ ngày

Giá trị tối thiểu được phép đối với cờ tính năng là 0x07E30301 , tương ứng với ngày 01/03/2019, là ngày được liên kết với các thử nghiệm Vulkan dEQP dành cho Android 10. Nếu cờ tính năng ít nhất có giá trị này thì thiết bị sẽ xác nhận vượt qua tất cả các bài kiểm tra dEQP Vulkan của Android 10.

Giá trị 0x07E40301 tương ứng với ngày 2020-03-01, là ngày được liên kết với các bài kiểm tra Vulkan dEQP dành cho Android 11. Nếu cờ tính năng ít nhất có giá trị này thì thiết bị tuyên bố đã vượt qua tất cả các bài kiểm tra Vulkan dEQP của Android 11.

Giá trị 0x07E60301 tương ứng với ngày 2022-03-01, là ngày liên quan đến các bài kiểm tra Vulkan dEQP dành cho Android 13. Nếu cờ tính năng ít nhất có giá trị này thì thiết bị tuyên bố đã vượt qua tất cả các bài kiểm tra Vulkan dEQP của Android 13.

Một thiết bị hiển thị cờ tính năng cụ thể ( tức là 0x07E30301 , 0x07E40301 , 0x07E60301 ) tuyên bố sẽ vượt qua tất cả các bài kiểm tra Android Vulkan dEQP của cờ tính năng đó (tương ứng là Android 10, Android 11, Android 13). Thiết bị này có thể vượt qua các bài kiểm tra Vulkan dEQP từ bản phát hành Android mới hơn.

Vulkan dEQP là một phần của Android CTS. Từ Android 11, thành phần chạy thử nghiệm dEQP của CTS nhận biết cờ tính năng android.software.vulkan.deqp.level và bỏ qua mọi thử nghiệm Vulkan dEQP mà - theo cờ tính năng này - thiết bị không yêu cầu hỗ trợ. Những bài kiểm tra như vậy được báo cáo là đã vượt qua một cách tầm thường.