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 אם התנאים הבאים מתקיימים:
- צריך להוסיף מנהל התקן Vulkan שתומך בגרסת העניין של Vulkan (זו צריכה להיות גרסה של Vulkan 1.3, 1.1 או 1.0) לצד הדרישות הנוספות לגבי CDD. גרסת Android. לחלופין, אפשר לעדכן מנהל התקן קיים של Vulkan למספר גרסה נמוך יותר של Vulkan.
- ב-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.3, התכונה
- מוסיפים את הערכים הבאים ב-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,
סימון תכונה – המכשיר אינו מתיימר לתמוך. בדיקות כאלה
דווחו כעוברות באופן טריוויאלי.