הטמעת Vulkan

Vulkan הוא תקורה נמוכה, Cross-platform API לתלת-ממד בעל ביצועים גבוהים גרפי. כמו OpenGL ES (GLES), Vulkan מספקת כלים ליצירה בגרפיקה בזמן אמת באפליקציות. יתרונות השימוש ב-Vulkan כוללים צמצום במעבד (CPU) תקורה ותמיכה בשפה SPIR-V Binary Intermediate.

כדי להטמיע את Vulkan בהצלחה, המכשיר צריך לכלול:

  • טוען Vulkan, שסופק על ידי Android.
  • מנהל התקן Vulkan, שסופק על ידי SoC כמו GPU IHV, מטמיעים את Vulkan API. כדי לתמוך בפונקציונליות של Vulkan, גרסת Android למכשיר נדרשים חומרת GPU עם יכולות Vulkan ואת מנהל ההתקן המשויך. ה-GPU צריכה לתמוך גם ב-GLES 3.1 ואילך. יש לפנות לספק ה-SoC כדי לבקש תמיכה מהנהג.

אם מכשיר כולל מנהל התקן Vulkan, המכשיר צריך להצהיר על כך FEATURE_VULKAN_HARDWARE_LEVEL והקבוצה FEATURE_VULKAN_HARDWARE_VERSION תכונות מערכת, עם גרסאות לשקף במדויק את יכולות המכשיר. כך אפשר לוודא המכשיר תואם ל- מסמך הגדרת התאימות (CDD).

טעינת Vulkan

עומס ה-Vulkan platform/frameworks/native/vulkan הוא הממשק הראשי בין אפליקציות Vulkan לבין מנהל התקן Vulkan של המכשיר. הוולקן המטען מותקן ב-/system/lib[64]/libvulkan.so. רכיב הטעינה מספק את נקודות הכניסה המרכזיות של Vulkan API, את נקודות הכניסה של תוספים שנדרשים על ידי ה-CDD ב-Android, ותוספים אופציונליים רבים נוספים. חלון תוספי שילוב מערכת (WSI) מיוצאים על ידי הטוען, בעיקר שמוטמעות בטעינה ולא במנהל ההתקן. הטוענים תומך גם ספירה וטעינה של שכבות שיכולות לחשוף תוספים נוספים וליירט קריאות ליבה ל-API בדרך אל הנהג.

ה-NDK כולל ספריית libvulkan.so משניים עבור קישור. הספרייה מייצאת את אותם סמלים כמו של הטוען. האפליקציות קוראות לפונקציות מיוצא מספריית libvulkan.so האמיתית אל להזין פונקציות טרמפולינה במטען, ששולח אל או מנהל התקן בהתאם לארגומנט הראשון שלהם. vkGet*ProcAddr() הפונקציה מחזירה את מצביעי הפונקציה שאליהם הטרמפולינות שולחות (כלומר, הוא קורא ישירות לקוד הליבה של ה-API). ביצוע קריאה דרך הפונקציה מצביעים, ולא סמלים מיוצאים, יעילים יותר מדלג על הטרמפולינה ושולח.

ספירת נהגים וטעינה

כשתמונת המערכת נוצרת, Android מצפה שהמערכת תדע אילו יחידות GPU זמינים. הטוען משתמש במנגנון HAL הקיים hardware.h כדי למצוא ולטעון את הנהג. הנתיבים המועדפים למנהלי התקנים של Vulkan של 32 סיביות ו-64 סיביות הם:

/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 ואילך, נגזרת hw_module_t של Vulkan כולל מבנה hw_module_t יחיד; יש תמיכה במנהל התקן אחד בלבד, והמחרוזת הקבועה HWVULKAN_DEVICE_0 מועבר אל open().

נגזרת Vulkan hw_device_t תואמת שיכול לתמוך במכשירים פיזיים מרובים. ניתן להרחיב את המבנה של hw_device_t לייצוא vkGetGlobalExtensionProperties(), vkCreateInstance() וגם פונקציות vkGetInstanceProcAddr(). הטוען יכול לראות את כל שאר VkInstance(), VkPhysicalDevice() וגם קריאה לפונקציות של vkGetDeviceProcAddr() vkGetInstanceProcAddr() של המבנה hw_device_t.

גילוי וטעינה של שכבות

טוען Vulkan תומך בספירה ובטעינה של שכבות שיכולות לחשוף תוספים נוספים וליירט קריאות ליבה ל-API בדרכם אל לנהג. מערכת Android לא כוללת שכבות בתמונת המערכת. עם זאת, אפליקציות יכולות לכלול שכבות ב-APK שלהן.

כשמשתמשים בשכבות, חשוב לזכור שמודל האבטחה וכללי המדיניות של Android שונות באופן משמעותי מפלטפורמות אחרות. באופן ספציפי, מערכת Android לא מאפשרת טעינת קוד חיצוני לתהליך שלא ניתן לניפוי באגים בסביבת הייצור (ללא הרשאות בסיס) וגם לא מאפשר לקוד חיצוני לבדוק או לשלוט זיכרון, מצב וכו'. האיסור הזה כולל איסור על שמירת קובצי נתונים מרכזיים, API עוקבים, וכן הלאה לדיסק לבדיקה מאוחרת יותר. רק שכבות שהועברו כחלק מ אפליקציות שלא ניתנות לניפוי באגים מופעלות במכשירים בסביבת הייצור, ומנהלי ההתקנים לא יכולים לספק פונקציונליות שמפרה את המדיניות.

תרחישים לדוגמה לשכבות כוללים:

  • שכבות זמן פיתוח – אימות אין להתקין שכבות ו-Shims לכלי מעקב, פרופיילינג או ניפוי באגים את תמונת המערכת של מכשירים בסביבת הייצור. שכבות אימות ו-shims עבור כלי מעקב/פרופיל או ניפוי באגים צריכים להיות ניתנים לעדכון ללא מערכת תמונה. מפתחים שרוצים להשתמש השכבות האלה במהלך הפיתוח יכולות לשנות את חבילת האפליקציה, לדוגמה, על ידי הוספת קובץ לספריית הספריות המקורית שלהם. מהנדסי IHV ומהנדסי OEM שרוצים לאבחן כשלים באפליקציות שאי אפשר לשנות אותן בזמן השליחה, אמורים לקבל גישה לגרסאות build לא ייצור (root) של קובץ האימג' של המערכת, אלא אם אפשר לנפות באפליקציות האלה באגים. למידע נוסף, ראו שכבות אימות של Vulkan ב-Android.
  • שכבות שירות – השכבות האלה חושפות תוספים, כמו שכבה שמטמיעה מנהל זיכרון לזיכרון המכשיר. המפתחים בוחרים את השכבות והגרסאות של השכבות האלה, שישמשו app; אפליקציות שונות שמשתמשות באותה שכבה עדיין עשויות להשתמש גרסאות שונות. המפתחים בוחרים אילו מהשכבות לשלוח חבילת אפליקציה.
  • Injected (Implicit) (שכבות משתמעות) — כולל שכבות כמו קצב הפריימים, רשתות חברתיות ושכבות-על של מרכז המשחקים שסופקו על ידי המשתמש או אפליקציה אחרת כלשהי ללא ידיעתה או הסכמתה. האלה מפירות את מדיניות האבטחה של Android והן לא נתמכות.

עבור אפליקציות שלא ניתנות לניפוי באגים, הטוען מחפש שכבות רק על ספריית הספריות המקורית של האפליקציה, ומנסה לטעון ספרייה עם שם תואם לדפוס מסוים (לדוגמה, libVKLayer_foo.so).

באפליקציות שניתנות לניפוי באגים, מכשיר הטעינה מחפש שכבות ב- /data/local/debug/vulkan ומנסה לטעון כל ספרייה תואמת דפוס מסוים.

מערכת Android מאפשרת לנייד שכבות עם שינויים בסביבת ה-build בין Android ופלטפורמות אחרות. לפרטים על הממשק בין השכבות loader, לראות הארכיטקטורה של Vulkan Loader Interface בתחזוקה של בני חרונו שכבות האימות מתארחות ב- Vulkan Validation Layers.

גרסאות ויכולות של Vulkan API

בטבלה הבאה מפורטות גרסאות של Vulkan API לכמה גרסאות של Android.
גרסת 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. ב-framework.

התכונות החשובות ביותר של Vulkan 1.3 ל-Android הן:

  • תמיכה במופעים של אישור מעבר יחיד לרינדור
  • תמיכה בסיום מיידי של הפעלה של תוכנת ההצללה
  • רמת פירוט עדינה יותר של יצירה, שיתוף ובקרה של צינורות עיבוד נתונים

Vulkan 1.3 כולל גם כמה תכונות קטנות יותר ושיפורים בנוחות השימוש לממשק API. כל השינויים שמיועד ל-API המרכזי של Vulkan עם גרסה 1.3 קטנה יותר ניתן למצוא כאן גרסאות ליבה (Vulkan 1.3).

סקירה כללית על הפונקציונליות של Vulkan 1.2

ב-Vulkan 1.2 נוספו כמה תכונות ותוספים שמפשטים את פלטפורמת ה-API. המידע הזה כולל מודל זיכרון מאוחד ומידע נוסף שאפשר לשלוח לגביו שאילתות ממנהל התקן של המכשיר. ל-Vulkan 1.2 יש אותן דרישות חומרה כמו Vulkan 1.0 ו-Vulkan 1.1; כל הוא במנהל התקן הגרפיקה שספציפי ל-SoC, ולא ב-framework.

התכונה החשובה ביותר של Vulkan 1.2 ל-Android היא תמיכה באחסון ב-8 ביט.

Vulkan 1.2 כולל גם כמה תכונות קטנות יותר ושיפורים בנוחות השימוש לממשקי API. כל השינויים שבוצע ל-API המרכזי של Vulkan עם גרסה 1.2 משנית, ניתן למצוא ב גרסאות ליבה (Vulkan 1.2).

סקירה כללית של הפונקציונליות של Vulkan 1.1

Vulkan 1.1 כולל תמיכה ביכולת פעולה הדדית של זיכרון/סנכרון, שמאפשרת ליצרני ציוד מקורי לתמוך ב-Vulkan 1.1 במכשירים. בנוסף, יכולת פעולה הדדית של זיכרון/סנכרון מאפשרת למפתחים כדי לקבוע אם Vulkan 1.1 נתמך במכשיר, ולהשתמש בו בצורה יעילה כשזה יקרה. ל-Vulkan 1.1 יש אותן דרישות חומרה כמו Vulkan 1.0, אבל ההטמעה מתבצעת במנהל הגרפיקה שספציפי ל-SOC, ולא ב-framework.

התכונות החשובות ביותר של Vulkan 1.1 ל-Android הן:

  • תמיכה בייבוא וייצוא של מאגרי נתונים זמניים ובסנכרון אובייקטים מחוץ ל-Vulkan (ליכולת פעולה הדדית עם מצלמה, קודק ו-GLES)
  • תמיכה בפורמטים של YCbCr

Vulkan 1.1 כולל גם כמה תכונות קטנות יותר ושיפורים בנוחות השימוש לממשקי API. כל השינויים שבוצע ל-API המרכזי של Vulkan עם גרסה 1.1 משנית, ניתן למצוא ב גרסאות ליבה (Vulkan 1.1).

בחירת תמיכה של Vulkan

מכשירי Android צריכים לתמוך בקבוצת התכונות המתקדמת ביותר של Vulkan, בתנאי שהם תומכים ב-ABI של 64 סיביות ושהזיכרון לא נמוך.

מכשירים עם Android מגרסה 13 ואילך צריכים לתמוך ב-Vulkan 1.3.

מכשירים שמופעלים דרך Android 10 צריכים לתמוך ב-Vulkan 1.1.

מכשירים אחרים יכולים לתמוך ב-Vulkan בגרסאות 1.3, 1.2 ו-1.1.

תמיכה בגרסת Vulkan

מכשיר Android תומך בגרסת Vulkan אם התנאים הבאים מתקיימים:

  1. צריך להוסיף מנהל התקן Vulkan שתומך בגרסת העניין של Vulkan (זו צריכה להיות גרסה של Vulkan 1.3, 1.1 או 1.0) לצד הדרישות הנוספות לגבי CDD. גרסת Android. לחלופין, אפשר לעדכן מנהל התקן קיים של Vulkan למספר גרסה נמוך יותר של Vulkan.
  2. ב-Vulkan בגרסאות 1.3 או 1.1, צריך לוודא שתכונת המערכת שהוחזרה על ידי מנהל החבילות מחזירה true לגרסת ה-Vulkan הנכונה.
    • ב-Vulkan 1.3, התכונה PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • ב-Vulkan 1.1, התכונה PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    מנהל החבילות יחזיר true עבור Vulkan 1.3 ו-Vulkan 1.1 על ידי הוספת כלל, מוצגת באופן הבא, לקובץ device.mk מתאים.
    • מוסיפים את הערכים הבאים ב-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 Baseline (ABP)

אנחנו ממליצים לכל מכשירי Android להתאים לפרופיל העדכני ביותר של Android Baseline 2022 בתור שמפורטת מדריך הפרופיל ל-Android Baseline.

כל מכשיר שתומך ב-Android 14 ואילך וב-Vulkan API למלא את כל הפונקציונליות שמוגדרת פרופיל Android Baseline 2021. הרשימה המלאה של הפונקציונליות הנדרשת מפורטות בקובץ הפרופיל json של Vulkan, אבל קבוצת משנה של המפתח הפונקציונליות כוללת:

  • טקסטורות דחוסות באמצעות 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, הוטמע עבור Vulkan 1.1 אינץ' Android 10 בלבד
  • VK_GOOGLE_display_timing, מוטמע בכל גרסה של Vulkan ב-Android 10

האובייקטים VkSurfaceKHR ו-VkSwapchainKHR וכל האובייקטים האינטראקציות עם ANativeWindow מטופלות על ידי הפלטפורמה והן לא בפני נהגים. הטמעת WSI מסתמכת על תוסף VK_ANDROID_native_buffer, חייב להיות נתמך על ידי הנהג. התוסף הזה נמצא בשימוש רק בהטמעה של WSI ולא חשוף לאפליקציות.

התרעות שימוש של Gralloc

יכול להיות שיהיה צורך להקצות מאגרי נתונים זמניים ב-Vulkan דגלים פרטיים לשימוש ב-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
);

הפרמטרים format ו-imageUsage נלקחים מ- במבנה VkSwapchainCreateInfoKHR. הנהג/ת צריך למלא את הטופס *grallocConsumerUsage ו-*grallocProducerUsage עם דגלי השימוש של Gralloc שנדרשים לפורמט והשימוש בו. סימוני השימוש שהנהג מחזירים משולבים עם נתוני השימוש הדגלים הנדרשים על ידי צרכן ה-splacementchain בעת הקצאת חוצצים.

Android 7.x מפעיל גרסה קודמת של VkSwapchainImageUsageFlagsANDROID(), בשם vkGetSwapchainGrallocUsageANDROID(). Android 8.0 ואילך יוצא משימוש vkGetSwapchainGrallocUsageANDROID() אבל עדיין מתקשר vkGetSwapchainGrallocUsageANDROID() אם הנהג/ת לא סיפק/ה את vkGetSwapchainGrallocUsage2ANDROID():

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

ב-vkGetSwapchainGrallocUsageANDROID() אין תמיכה בשימוש ב-splacementchain דגלים או סימוני שימוש מורחבים ב-Gralloc.

תמונות בגיבוי גרלוק

VkNativeBufferANDROID הוא תוסף של vkCreateImage ליצירת תמונה שמגובה על ידי מאגר נתונים זמני של Gralloc. VkNativeBufferANDROID הוא סופק ל-vkCreateImage() בVkImageCreateInfo שרשרת מבנה. מתבצעות שיחות אל vkCreateImage() עם VkNativeBufferANDROID במהלך השיחה אל vkCreateSwapchainKHR. הטמעת WSI את מספר מאגרי הנתונים הזמניים המקוריים המבוקשים ל-replacementchain, ויוצרת 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 ואילך, הפלטפורמה מספקת מבנה התוסף VkSwapchainImageCreateInfoKHR ב רשת VkImageCreateInfo סופקה ל-vkCreateImage כאשר נדרשים סימונים לשימוש בתמונה ב-splacementchain. מבנה התוסף מכיל את הדגלים של שימוש בתמונות של swapchain:

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 מגובה על ידי זיכרון החלפה. האפליקציה מבצעת שיחה ראשונה vkCreateImage עם VkImageSwapchainCreateInfoKHR שהוצמדו למבנה VkImageCreateInfo. לאחר מכן האפליקציה מתקשרת אל vkBindImageMemory2(KHR) באמצעות המבנה VkBindImageMemorySwapchainInfoKHR מקושר אל VkBindImageMemoryInfo. imageIndex שצוין במבנה VkBindImageMemorySwapchainInfoKHR חייב להיות אינדקס תמונה חוקי להחלפת נתונים. בינתיים, הפלטפורמה מספקת מבנה התוסף VkNativeBufferANDROID עם התואם למבנה מידע על מאגר נתונים זמני של Gralloc לשרשרת VkBindImageMemoryInfo, כך הנהג יודע עם איזה מאגר נתונים זמני של Gralloc צריך לקשר את VkImage.

צילום תמונות

vkAcquireImageANDROID מקבל בעלות על תמונת Sitelinkchain והיא מייבאת גדר מקומית עם סימון חיצוני אובייקט VkSemaphore ואובייקט VkFence קיים:

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

מתבצעת שיחה אל vkAcquireImageANDROID() במהלך vkAcquireNextImageKHR כדי לייבא גדר מותאמת לאובייקטים VkSemaphore ו-VkFence שהאפליקציה מספקת (עם זאת, גם אובייקטים של סמפור וגם אובייקטים של גדרות) אופציונלי בשיחה הזו). ההזדמנות הזו עשויה גם לשמש את הנהג/ת ולטפל בשינויים חיצוניים במצב מאגר הנתונים הזמני של Gralloc; נהגים רבים לא לעשות כאן משהו. השיחה הזו מציבה את VkSemaphore ואת VkFence יהיה באותו מצב המתנה כמו אם סומן על ידי vkQueueSubmit, כך שתורים יכולים להמתין על הסמפה, והאפליקציה יכולה להמתין על הגדר.

שני האובייקטים מסוותים כשהאותות של הגדר הטבעית שבבסיס האותות שלהם. אם גדר המקומית כבר אותתה, והסמפור כשהפונקציה הזו מחזירה. הנהג מקבל בעלות על קובץ הגדרות הגבולות. וסוגר את מתאר קובץ הגבולות כשכבר אין צורך בו. הנהג/ת לעשות זאת גם אם לא סופק אובייקט סמפור או אובייקט גדר, וגם אם הפונקציה vkAcquireImageANDROID נכשלת ומחזירה שגיאה. אם המיקום הערך של fenceFd הוא 1-, זה כאילו גדר המקורית כבר סומן.

תמונות של פריט התוכן

vkQueueSignalReleaseImageANDROID מכין תמונת החלפה עבור לשימוש חיצוני, יוצר גדר מקומית ומתזמנת את סימון ההגדרה המקורית סמפורי הקלט ציינו:

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

vkQueuePresentKHR() מתקשר אל vkQueueSignalReleaseImageANDROID() בתור הנתון. הנהג צריך ליצור גדר מקומית שאין בו אותות עד כל waitSemaphoreCount הסמפוריות ב- אות pWaitSemaphores וכל עבודה נוספת שנדרשת כדי להכין את image להשלמת המצגת.

אם כבר אותת על סמפורי ההמתנה (אם יש), והסימון של queue הוא כבר אין פעילות במכשיר, הנהג יכול להגדיר את *pNativeFenceFd ל--1 במקום לתיאור קובץ גדר נייטיב, שמציין אין למה לחכות. מבצע הקריאה החוזרת הוא הבעלים של מתאר הקובץ וסוגר אותו הוחזרו ב-*pNativeFenceFd.

מנהלי התקנים רבים יכולים להתעלם מפרמטר התמונה, אבל ייתכן שחלקם יצטרכו להתכונן מבני נתונים בצד ה-CPU שמשויכים למאגר נתונים זמני של Gralloc לשימוש על ידי גורמים חיצוניים צרכני תמונות. צריך להכין תוכן מאגר נתונים זמני לשימוש צרכנים חיצוניים תתבצע באופן אסינכרוני כחלק מהעברת התמונה אל VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

אם התמונה נוצרה עם VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID, ואז הנהג/ת צריך/ה ניתן להתקשר אל vkQueueSignalReleaseImageANDROID() שוב ושוב ללא קריאות ביניים למספר vkAcquireImageANDROID().

תמיכה בשיתוף תמונות שניתן להציג

מכשירים מסוימים יכולים לחלוק את הבעלות על תמונה אחת בין את צינור עיבוד הנתונים לתצוגה ואת ההטמעה של Vulkan כדי למזער את זמן האחזור. ב-Android 9 ואילך, הטוען מפרסם באופן מותנה תוסף אחד (VK_KHR_shared_presentable_image) על סמך הנהג תגובה לקריאה ל-vkGetPhysicalDeviceProperties2.

אם הנהג לא תומך ב-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.

אימות

יצרני ציוד מקורי יכולים לבדוק את ההטמעה של Vulkan באמצעות CTS, כולל:

  • בדיקות תאימות של Khronos Vulkan במודול CtsDeqpTestCases, שכוללות בדיקות API פונקציונליות של Vulkan בגרסאות 1.0, 1.1, 1.2 ו-1.3.
  • המודול CtsGraphicsTestCases, שבודק אם המכשיר מוגדרת נכון ליכולות Vulkan שבהן היא תומכת.

סימון תכונה של Vulkan

מכשיר שתומך ב-Android 11 ואילך ותומך ב-Vulkan API נדרש כדי לחשוף את התכונה הניסיונית, android.software.vulkan.deqp.level הערך של התכונה הניסיונית הזו הוא תאריך, מקודד כערך מספר שלם. הוא מציין את התאריך שמשויך אל בדיקות ה-dEQP של Vulkan שהמכשיר מתיימר לעבור.

תאריך בפורמט YYYY-MM-DD מקודד כמספר שלם בגרסת 32 סיביות באופן הבא:

  • ביטים 0-15 מאחסנים את השנה
  • סיביות 16-23 מאחסנות את החודש
  • סיביות 24-31 מאחסנות את היום

הערך המינימלי המותר לסימון התכונה הוא 0x07E30301, שתואם לתאריך 01-03-2019, שהוא התאריך שמשויך בדיקות dEQP של Vulkan ל-Android 10. אם דגל התכונה הוא לפחות הערך הזה, שהמכשיר מתיימר לעבור את כל בדיקות ה-dEQP של Android 10 Vulkan.

הערך 0x07E40301 תואם לתאריך 1.03.2020, כלומר התאריך שמשויך לבדיקות dEQP של Vulkan ב-Android 11. אם התכונה הדגל הוא לפחות הערך הזה, המכשיר טוען שהוא עובר את כל בדיקות dEQP של Vulkan.

הערך 0x07E60301 תואם לתאריך 1.3.2022, כלומר את התאריך שמשויך לבדיקות dEQP של Vulkan Android מגרסה 13. אם דגל התכונה הוא לפחות הערך הזה, המכשיר טוען להעביר את כל ה-Vulkan של Android 13 בדיקות dEQP.

מכשיר שחושף דגל של תכונה ספציפית (למשל 0x07E30301, 0x07E40301, 0x07E60301) טוען לעבור את כל בדיקות ה-dEQP של Android Vulkan של התכונה הניסיונית הזו (Android 10, Android 11 או Android 13 בהתאמה). במכשיר הזה עשויות לעבור בדיקות dEQP של Vulkan מגרסה מאוחרת יותר של Android.

Vulkan dEQP הוא חלק מ-Android CTS. מ-Android 11, הכלי להרצת מבחן dEQP לרכיב ב-CTS מודע לandroid.software.vulkan.deqp.level והיא מדלגת על כל בדיקה של Vulkan dEQP, סימון תכונה – המכשיר אינו מתיימר לתמוך. בדיקות כאלה דווחו כעוברות באופן טריוויאלי.