實作 Vulkan

Vulkan 是一款低負載的跨平台 API,可用於製作高品質 3D 圖像。與 OpenGL ES (GLES) 一樣,Vulkan 提供工具,可讓您在應用程式中製作高品質的即時圖形。使用 Vulkan 的優點包括降低 CPU 負擔,並支援 SPIR-V 二進位制中介語言。

如要成功實作 Vulkan,裝置必須包括:

  • Android 提供的 Vulkan 載入器。
  • 由 SoC (例如 GPU IHV) 提供的 Vulkan 驅動程式,可實作 Vulkan API。如要支援 Vulkan 功能,Android 裝置需要支援 Vulkan 的 GPU 硬體和相關驅動程式。GPU 也必須支援 GLES 3.1 以上版本。如需驅動程式支援,請洽詢您的 SoC 供應商。

如果裝置包含 Vulkan 驅動程式,則需要宣告 FEATURE_VULKAN_HARDWARE_LEVELFEATURE_VULKAN_HARDWARE_VERSION 系統功能,且版本必須準確反映裝置的功能。這有助於確保裝置符合相容性定義說明文件 (CDD) 的規定。

Vulkan 載入程式

Vulkan 載入器 platform/frameworks/native/vulkan 是 Vulkan 應用程式與裝置 Vulkan 驅動程式之間的主要介面。Vulkan 載入器會安裝在 /system/lib[64]/libvulkan.so 中。載入器會提供核心 Vulkan API 進入點、Android CDD 所需的擴充功能進入點,以及許多其他選用擴充功能。載入器會匯出 Windows 系統整合 (WSI) 擴充功能,並主要在載入器中實作,而不是在驅動程式中實作。載入器也支援用於公開其他擴充功能的列舉和載入圖層,並在對驅動程式途中攔截核心 API 呼叫。

NDK 包含用於連結的 Stub libvulkan.so 程式庫。程式庫會匯出與載入器相同的符號。應用程式會呼叫從實際 libvulkan.so 程式庫匯出的函式,以便在載入器中輸入 Trampoline 函式,再根據第一個引數調度至適當的圖層或驅動程式。vkGet*ProcAddr() 呼叫會傳回跳板調度的函式指標 (也就是直接呼叫核心 API 程式碼)。透過函式指標 (而非匯出的符號) 呼叫,可省略彈跳和調度,因此效率更高。

驅動程式列舉和載入

建構系統映像檔時,Android 會預期系統知道有哪些可用的 GPU。載入器會使用 hardware.h 中現有的 HAL 機制來探索及載入驅動程式。32 位元和 64 位元 Vulkan 驅動程式的偏好路徑如下:

/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

在 Android 7.0 以上版本中,Vulkan hw_module_t 衍生項目會包裝單一 hw_module_t 結構體;僅支援一個驅動程式,且常數字串 HWVULKAN_DEVICE_0 會傳遞至 open()

Vulkan hw_device_t 衍生工具則對應至可支援多個實體裝置的單一驅動程式。hw_device_t 結構體可延伸至匯出 vkGetGlobalExtensionProperties()vkCreateInstance()vkGetInstanceProcAddr() 函式。載入器可以透過呼叫 hw_device_t 結構的 vkGetInstanceProcAddr(),找出所有其他 VkInstance()VkPhysicalDevice()vkGetDeviceProcAddr() 函式。

圖層探索和載入

Vulkan 載入器支援列舉和載入層,這些層可以公開其他擴充功能,並在對驅動程式途中攔截核心 API 呼叫。Android 不會在系統映像檔中加入圖層,但應用程式可以在 APK 中加入圖層。

使用層時,請注意 Android 的安全性模型和政策與其他平台有極大差異。具體來說,Android 不允許在正式版 (未解鎖) 裝置上,將外部程式碼載入無法偵錯的程序,也不允許外部程式碼檢查或控制程序的記憶體、狀態等。這包括禁止將核心傾印、API 追蹤記錄等內容儲存至磁碟,以利日後檢查。只有在正式版裝置上啟用以非可偵錯應用程式提供的圖層,且驅動程式不得提供違反這些政策的功能。

圖層的用途包括:

  • 開發階段層:用於追蹤/分析/偵錯工具的驗證層和墊片,不應安裝在實際執行環境裝置的系統映像檔中。追蹤/分析/偵錯工具的驗證層和墊片,應可在沒有系統映像檔的情況下更新。開發人員如要在開發期間使用其中一個層級,可以修改應用程式套件,例如在原生程式庫目錄中新增檔案。如要診斷無法修改的應用程式出貨失敗問題,IHV 和 OEM 工程師可使用系統映像檔的非正式 (已根目錄) 版本,除非這些應用程式可進行偵錯。詳情請參閱「Android 上的 Vulkan 驗證層」。
  • 公用程式層:這些層會公開擴充功能,例如實作裝置記憶體記憶體管理員的層。開發人員會選擇要用於應用程式的圖層和圖層版本;使用相同圖層的不同應用程式可能會使用不同的版本。開發人員可選擇要將哪些圖層納入應用程式套件。
  • 插入的 (隱含) 圖層 - 包括使用者或某些其他應用程式在不知情或未同意的情況下,提供的影格速率、社群網路和遊戲啟動器疊加圖層。這些違反 Android 的安全性政策,因此無法提供支援。

對於無法偵錯的應用程式,載入器只會在應用程式的原生資料庫目錄中搜尋圖層,並嘗試載入名稱符合特定模式 (例如 libVKLayer_foo.so) 的任何資料庫。

對於可進行偵錯的應用程式,載入器會搜尋 /data/local/debug/vulkan 中的圖層,並嘗試載入符合特定模式的任何程式庫。

Android 可讓系統隨著 Android 和其他平台之間的建構環境變更,移植層。如要進一步瞭解層與載入器之間的介面,請參閱「Vulkan 載入器介面的架構」。由 Khronos 維護的驗證層會託管在 Vulkan 驗證層中。

Vulkan API 版本和功能

下表列出多個 Android 版本的 Vulkan API 版本。
Android 版本 Vulkan 版本
Android 13 Vulkan 1.3
Android 9 Vulkan 1.1
Android 7 Vulkan 1.0 版

Vulkan 1.3 功能總覽

Vulkan 1.3 將先前可選的擴充功能標準化,並納入 Vulkan 核心功能。這類功能的大部分目的,是為了提升對 Vulkan 程式設計介面的控制和精細程度。單一渲染通道例項不再需要渲染通道物件或幀緩衝區。管道狀態物件總數可以減少,API 內的同步處理作業會受到影響。Vulkan 1.3 的硬體需求與 Vulkan 1.2、1.1 和 1.0 相同,大部分實作項目都在 SoC 專屬圖形驅動程式中,而不是在架構中。

Android 適用的最重要 Vulkan 1.3 功能如下:

  • 支援單一渲染通道例項
  • 支援立即終止著色器叫用作業
  • 更精細地控管管道建立、共用和控制作業

Vulkan 1.3 也包含多項較小的功能和 API 可用性強化功能。您可以在「核心修訂版本 (Vulkan 1.3)」一文中,查看對核心 Vulkan API 進行的所有變更,這些變更適用於次要修訂版本 1.3。

Vulkan 1.2 功能總覽

Vulkan 1.2 新增了多項功能和擴充功能,可簡化 API 途徑。這包括統一的記憶體模型,以及可透過裝置驅動程式查詢的其他資訊。Vulkan 1.2 的硬體需求與 Vulkan 1.0 和 1.1 相同;所有實作項目都在 SoC 專屬圖形驅動程式中,而非架構。

Android 適用的 Vulkan 1.2 最重要的功能,就是支援 8 位元儲存空間。

Vulkan 1.2 也包含多項較小的功能和 API 可用性強化功能。您可以在「核心修訂版本 (Vulkan 1.2)」一文中,查看對核心 Vulkan API 進行的所有變更,這些變更已納入修訂版本 1.2。

Vulkan 1.1 功能總覽

Vulkan 1.1 支援記憶體/同步作業互通,可讓原始設備製造商 (OEM) 在裝置上支援 Vulkan 1.1。此外,記憶體/同步互通性可讓開發人員判斷裝置是否支援 Vulkan 1.1,並在裝置支援的情況下有效使用。Vulkan 1.1 的硬體要求與 Vulkan 1.0 相同,但大部分實作項目都位於 SOC 專用的圖形驅動程式中,而非架構中。

Android 適用的最重要 Vulkan 1.1 功能如下:

  • 支援從 Vulkan 外部匯入及匯出記憶體緩衝區和同步處理物件 (用於與相機、編解碼器和 GLES 互通)
  • 支援 YCbCr 格式

Vulkan 1.1 也包含多項較小的功能和 API 可用性增強功能。如要查看對核心 Vulkan API 進行的所有變更,請參閱核心修訂版本 (Vulkan 1.1)

選擇 Vulkan 支援

如果 Android 裝置支援 64 位元 ABI,且記憶體不低,則應支援最先進的 Vulkan 功能組合。

搭載 Android 13 以上版本的裝置應支援 Vulkan 1.3。

透過 Android 10 啟動的裝置應支援 Vulkan 1.1。

其他裝置可選擇支援 Vulkan 1.3、1.2 和 1.1。

支援 Vulkan 版本

如果 Android 裝置符合下列條件,就會支援 Vulkan 版本:

  1. 新增支援所需 Vulkan 版本 (必須是 Vulkan 1.3、1.1 或 1.0 版本之一) 的 Vulkan 驅動程式,以及 Android 版本的額外 CDD 需求。或者,您也可以更新現有的 Vulkan 驅動程式,以便使用較低的 Vulkan 版本號碼。
  2. 針對 Vulkan 1.3 或 1.1,請確保套件管理員傳回的系統功能會傳回正確的 Vulkan 版本 true
    • 在 Vulkan 1.3 中,這項功能為 PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • 在 Vulkan 1.1 中,這項功能為 PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    套件管理員會在適當的 device.mk 檔案中加入規則 (如下所示),針對 Vulkan 1.3 和 Vulkan 1.1 傳回 true
    • 針對 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
      
    • 為 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

Android 基準設定檔 (ABP)

我們建議所有 Android 裝置都符合最新的 Android Baseline 2022 設定檔,詳情請參閱 Android 基準設定檔指南

凡是支援 Android 14 以上版本和 Vulkan API 的裝置,都必須執行 Android Baseline 2021 設定檔中定義的所有功能。必要功能的完整清單會在 Vulkan 設定檔 json 檔案中列舉,但必要功能的關鍵子集包括:

  • 透過 ASTC 和 ETC 壓縮紋理。
  • 透過 VK_EXT_swapchain_colorspace 設定可變色域。
  • 透過 sampleRateShading 使用陰影取樣和插值多重取樣功能。

視窗系統整合 (WSI)

libvulkan.so 中,驅動程式會實作下列視窗系統整合 (WSI) 擴充功能:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties,僅在 Android 10 中為 Vulkan 1.1 實作
  • VK_GOOGLE_display_timing,已針對 Android 10 中的任何 Vulkan 版本實作

VkSurfaceKHRVkSwapchainKHR 物件,以及與 ANativeWindow 的所有互動,都由平台處理,不會公開給驅動程式。WSI 實作項目會依賴 VK_ANDROID_native_buffer 擴充功能,而驅動程式必須支援該擴充功能;這個擴充功能只供 WSI 實作項目使用,不會公開給應用程式。

Gralloc 使用標記

Vulkan 實作項目可能需要使用實作定義的 Private Gralloc 使用旗標進行交換鏈緩衝區。建立交換鏈時,Android 會要求驅動程式透過呼叫以下項目,將要求的格式和圖片用途標記轉譯為 Gralloc 用途標記:

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
);

formatimageUsage 參數是從 VkSwapchainCreateInfoKHR 結構中取得。驅動程式應使用格式和用途所需的 Gralloc 用法旗標,填入 *grallocConsumerUsage*grallocProducerUsage。驅動程式傳回的用法旗標會與交換鏈消費者在分配緩衝區時要求的用法旗標合併。

Android 7.x 會呼叫名為 vkGetSwapchainGrallocUsageANDROID() 的舊版 VkSwapchainImageUsageFlagsANDROID()。Android 8.0 以上版本會淘汰 vkGetSwapchainGrallocUsageANDROID(),但如果驅動程式未提供 vkGetSwapchainGrallocUsage2ANDROID(),仍會呼叫 vkGetSwapchainGrallocUsageANDROID()

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

vkGetSwapchainGrallocUsageANDROID() 不支援 Swapchain 用途旗標或擴充的 Gralloc 用途旗標。

Gralloc 支援的圖片

VkNativeBufferANDROIDvkCreateImage 擴充功能結構,可用來建立由 Gralloc 緩衝區支援的圖片。VkNativeBufferANDROID 會在 VkImageCreateInfo 結構鏈結中提供給 vkCreateImage()。在呼叫 vkCreateSwapchainKHR 時,會使用 VkNativeBufferANDROID 呼叫 vkCreateImage()。WSI 實作會分配 Swapchain 要求的原生緩衝區數量,然後為每個緩衝區建立 VkImage

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;

建立 Gralloc 支援的圖片時,VkImageCreateInfo 會包含下列資料:

  .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

在 Android 8.0 以上版本中,如果交換鏈圖片需要使用標記,平台會在提供給 vkCreateImageVkImageCreateInfo 鏈結中提供 VkSwapchainImageCreateInfoKHR 擴充功能結構。擴充功能結構包含交換鏈圖片使用旗標:

typedef struct {
    VkStructureType                        sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
    const void*                            pNext;

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

在 Android 10 以上版本中,這個平台支援 VK_KHR_swapchain 70 版,因此 Vulkan 應用程式能夠建立使用交換鏈記憶體支援的 VkImage。應用程式會先使用鏈結至 VkImageCreateInfo 結構的 VkImageSwapchainCreateInfoKHR 結構呼叫 vkCreateImage。接著,應用程式會使用鏈結至 VkBindImageMemoryInfo 結構的 VkBindImageMemorySwapchainInfoKHR 結構呼叫 vkBindImageMemory2(KHR)VkBindImageMemorySwapchainInfoKHR 結構中指定的 imageIndex 必須是有效的 Swapchain 圖片索引。同時,平台會為 VkBindImageMemoryInfo 鏈結提供 VkNativeBufferANDROID 擴充功能結構,其中包含對應的 Gralloc 緩衝區資訊,讓驅動程式知道要將 VkImage 與哪個 Gralloc 緩衝區繫結。

取得圖片

vkAcquireImageANDROID 會取得 Swapchain 圖片的擁有權,並將外部信號的原生圍欄匯入現有的 VkSemaphore 物件和現有的 VkFence 物件:

VkResult VKAPI vkAcquireImageANDROID(
    VkDevice            device,
    VkImage             image,
    int                 nativeFenceFd,
    VkSemaphore         semaphore,
    VkFence             fence
);

系統會在 vkAcquireNextImageKHR 期間呼叫 vkAcquireImageANDROID(),將原生柵欄匯入應用程式提供的 VkSemaphoreVkFence 物件 (不過,此呼叫可選擇使用信號量和柵欄物件)。驅動程式也可以利用這個機會,辨識並處理 Gralloc 緩衝區狀態的任何外部變更;許多驅動程式在這裡不需要執行任何操作。這個呼叫會將 VkSemaphoreVkFence 置於與 vkQueueSubmit 信號相同的待處理狀態,因此佇列可等待信號量,應用程式也可等待柵欄。

當底層原生柵欄發出信號時,這兩個物件都會收到信號;如果原生柵欄已發出信號,則此函式傳回時,信號量表就會處於已發出信號的狀態。驅動程式會取得柵欄檔案描述元的擁有權,並在不再需要時關閉柵欄檔案描述元。即使未提供信號量或柵欄物件,或 vkAcquireImageANDROID 失敗並傳回錯誤,驅動程式也必須這麼做。如果 fenceFd 為 -1,表示已傳送原生邊界信號。

發布圖片

vkQueueSignalReleaseImageANDROID 會準備交換鏈圖片供外部使用、建立原生圍欄,並安排在輸入季度發出信號後,讓原生圍欄發出訊號:

VkResult VKAPI vkQueueSignalReleaseImageANDROID(
    VkQueue             queue,
    uint32_t            waitSemaphoreCount,
    const VkSemaphore*  pWaitSemaphores,
    VkImage             image,
    int*                pNativeFenceFd
);

vkQueuePresentKHR() 會在提供的佇列上呼叫 vkQueueSignalReleaseImageANDROID()。驅動程式必須產生原生圍欄,在 pWaitSemaphores 信號中的所有 waitSemaphoreCount 信號,以及準備 image 以供呈現所需的任何額外工作完成前,不會傳送信號。

如果等待信號燈 (如有) 已發出信號,且 queue 已處於閒置狀態,驅動程式可以將 *pNativeFenceFd 設為 -1,而非實際的原生柵欄檔案描述元,表示沒有任何項目需要等待。呼叫端擁有並關閉 *pNativeFenceFd 中傳回的檔案描述元。

許多驅動程式可以忽略圖片參數,但有些驅動程式可能需要準備與 Gralloc 緩衝區相關聯的 CPU 端資料結構,供外部圖片使用者使用。為外部使用者準備緩衝區內容時,應以非同步方式進行,並將圖片轉換為 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

如果圖片是使用 VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID 建立,則驅動程式必須允許重複呼叫 vkQueueSignalReleaseImageANDROID(),而不會在其中插入對 vkAcquireImageANDROID() 的呼叫。

分享可分享的圖片

部分裝置可以在顯示管道和 Vulkan 實作項目之間共用單一圖像的擁有權,盡可能縮短延遲時間。在 Android 9 以上版本中,載入器會根據驅動程式對 vkGetPhysicalDeviceProperties2 呼叫的回應,有條件地宣傳 VK_KHR_shared_presentable_image 擴充功能。

如果驅動程式不支援 Vulkan 1.1 或 VK_KHR_physical_device_properties2 擴充功能,載入程式就不會宣傳支援共用可顯示圖片。否則,載入器會透過呼叫 vkGetPhysicalDeviceProperties2() 並在 VkPhysicalDeviceProperties2::pNext 鏈結中加入下列結構,查詢驅動程式功能:

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

如果駕駛人可與顯示系統共用映像檔的擁有權,就會將 sharedImage 成員設為 VK_TRUE

驗證

原始設備製造商 (OEM) 可以使用 CTS 測試 Vulkan 實作,其中包含下列項目:

  • CtsDeqpTestCases 模組中的 Khronos Vulkan 相容性測試,包括 Vulkan 1.0、1.1、1.2 和 1.3 的功能 API 測試。
  • CtsGraphicsTestCases 模組,用於測試裝置的 Vulkan 功能設定是否正確。

Vulkan 功能旗標

裝置必須支援 Android 11 以上版本,且支援 Vulkan API,才能公開功能旗標 android.software.vulkan.deqp.level。這個功能旗標的值是日期,已編碼為整數值。它會指定與裝置聲稱通過的 Vulkan dEQP 測試相關聯的日期。

以 YYYY-MM-DD 格式表示的日期會以 32 位元整數編碼,如下所示:

  • 位元 0 到 15 儲存年份
  • Bits 16-23 (當月商店)
  • 位元 24-31 儲存當天

功能旗標允許的最低值為 0x07E30301,對應日期為 2019-03-01,這是與 Android 10 的 Vulkan dEQP 測試相關聯的日期。如果功能旗標至少為這個值,裝置就會聲稱通過所有 Android 10 Vulkan dEQP 測試。

0x07E40301 值對應於 2020-03-01 日期,也就是與 Android 11 的 Vulkan dEQP 測試相關聯的日期。如果功能標記至少為這個值,裝置就會聲稱通過所有 Android 11 Vulkan dEQP 測試。

0x07E60301 對應的日期為 2022-03-01,這是與 Android 13 的 Vulkan dEQP 測試相關聯的日期。如果功能旗標至少為這個值,裝置就會聲稱通過所有 Android 13 Vulkan dEQP 測試。

公開特定功能旗標 (例如 0x07E303010x07E403010x07E60301) 的裝置聲稱已通過該功能旗標的所有 Android Vulkan dEQP 測試 (分別為 Android 10、Android 11、Android 13)。這部裝置可能會通過較新 Android 版本的 Vulkan dEQP 測試。

Vulkan dEQP 是 Android CTS 的一部分。從 Android 11 開始,CTS 的 dEQP 測試執行程式元件會瞭解 android.software.vulkan.deqp.level 功能旗標,並略過任何裝置聲稱不支援的 Vulkan dEQP 測試。這類測試會回報為經常通過。