Vulkan هي واجهة برمجة تطبيقات متوافقة مع عدة أنظمة أساسية وتتطلّب موارد قليلة، وهي مخصّصة للرسومات الثلاثية الأبعاد العالية الأداء. مثل OpenGL ES (GLES)، توفّر Vulkan أدوات لإنشاء رسومات عالية الجودة في الوقت الفعلي في التطبيقات. تشمل مزايا استخدام Vulkan تقليل النفقات العامة لوحدة المعالجة المركزية وإتاحة استخدام لغة SPIR-V Binary Intermediate.
لتنفيذ Vulkan بنجاح، يجب أن يتضمّن الجهاز ما يلي:
- برنامج تحميل Vulkan الذي يوفّره نظام التشغيل Android
- برنامج تشغيل Vulkan، وهو برنامج توفّره أنظمة على شرائح مثل مورّدي أجهزة معالجة الرسومات المستقلة، ويتضمّن واجهة برمجة تطبيقات Vulkan. لإتاحة وظائف Vulkan، يجب أن يتضمّن جهاز Android وحدة معالجة الرسومات (GPU) متوافقة مع Vulkan وبرنامج التشغيل المرتبط بها. يجب أن تتوافق وحدة معالجة الرسومات أيضًا مع الإصدار 3.1 من GLES والإصدارات الأحدث. يُرجى التواصل مع مورِّد منظومة على رقاقة (SoC) لطلب توفير برنامج تشغيل متوافق.
إذا كان الجهاز يتضمّن برنامج تشغيل Vulkan، يجب أن يعرِّف الجهاز ميزتَي النظام FEATURE_VULKAN_HARDWARE_LEVEL وFEATURE_VULKAN_HARDWARE_VERSION، مع إصدارات تعكس إمكانات الجهاز بدقة. يساعد ذلك في التأكّد من أنّ الجهاز متوافق مع مستند تعريف معايير التوافق (CDD).
برنامج تحميل Vulkan
برنامج التحميل Vulkan platform/frameworks/native/vulkan هو الواجهة الأساسية بين تطبيقات Vulkan وبرنامج تشغيل Vulkan على الجهاز. تم تثبيت برنامج تحميل Vulkan في /system/lib[64]/libvulkan.so. يوفر برنامج التحميل نقاط الدخول الأساسية إلى واجهة برمجة تطبيقات Vulkan ونقاط الدخول إلى الإضافات التي يتطلبها مستند تعريف التوافق لنظام التشغيل Android والعديد من الإضافات الاختيارية الأخرى. يتم تصدير إضافات Window
System Integration (WSI) من خلال أداة التحميل، ويتم تنفيذها بشكل أساسي
في أداة التحميل بدلاً من برنامج التشغيل. يتيح برنامج التحميل أيضًا تعداد وتحميل الطبقات التي يمكنها عرض إضافات أخرى واعتراض طلبات البيانات الأساسية من واجهة برمجة التطبيقات أثناء انتقالها إلى برنامج التشغيل.
يتضمّن حزمة NDK مكتبة libvulkan.so فارغة لتسهيل الربط. تصدِّر المكتبة الرموز نفسها التي يصدِّرها برنامج التحميل. تستدعي التطبيقات الدوال
التي تم تصديرها من مكتبة libvulkan.so الحقيقية
لإدخال دوال trampoline في أداة التحميل، والتي يتم إرسالها إلى الطبقة أو برنامج التشغيل المناسبَين استنادًا إلى وسيطتهما الأولى. يعرض طلب vkGet*ProcAddr()
مؤشرات الدوال التي يتم إرسالها إلى منصات الإطلاق (أي أنّه
يتم استدعاؤها مباشرةً في الرمز البرمجي لواجهة برمجة التطبيقات الأساسية). ويكون استدعاء الدوال من خلال مؤشرات الدوال بدلاً من الرموز التي تم تصديرها أكثر فعالية لأنّه يتخطى عملية التوجيه والإرسال.
تعداد برامج التشغيل وتحميلها
عند إنشاء صورة النظام، يتوقّع نظام التشغيل Android أن يعرف النظام وحدات معالجة الرسومات المتاحة. يستخدم برنامج التحميل آلية HAL الحالية في
hardware.h
لاكتشاف برنامج التشغيل وتحميله. المسارات المفضّلة لبرامج تشغيل Vulkan التي تعمل بالإصدار 32 بت و64 بت هي:
/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib/hw/vulkan.<ro.board.platform>.so /vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib64/hw/vulkan.<ro.board.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.
ro.vulkan.apex على اسم حزمة APEX الخاصة بـ Vulkan لتحميل Vulkan من حزمة APEX.
العثور على الطبقات وتحميلها
يتيح برنامج التحميل Vulkan تعداد وتحميل الطبقات التي يمكنها عرض إضافات أخرى واعتراض طلبات البيانات الأساسية من واجهة برمجة التطبيقات أثناء انتقالها إلى برنامج التشغيل. يمكن أن تتضمّن التطبيقات طبقات في حزمة APK. لا يتضمّن نظام التشغيل Android طبقات في صورة النظام.
عند استخدام الطبقات، يُرجى العِلم أنّ نموذج الأمان والسياسات في نظام التشغيل Android يختلفان بشكل كبير عن المنصات الأخرى. على وجه الخصوص، لا يسمح نظام التشغيل Android بتحميل رمز خارجي في عملية غير قابلة للتصحيح على أجهزة الإنتاج (غير المزودة بإذن الوصول إلى الجذر)، كما لا يسمح للرمز الخارجي بفحص ذاكرة العملية وحالتها وما إلى ذلك أو التحكّم فيها. ويشمل ذلك حظر حفظ عمليات تفريغ الذاكرة الأساسية وعمليات تتبُّع واجهة برمجة التطبيقات وما إلى ذلك على القرص لفحصها لاحقًا. لا يتم تفعيل الطبقات التي يتم توفيرها كجزء من التطبيقات غير القابلة للتصحيح إلا على أجهزة الإنتاج، ويجب ألا توفّر برامج التشغيل وظائف تنتهك هذه السياسات.
تشمل حالات استخدام الطبقات ما يلي:
- طبقات وقت التطوير: يجب عدم تثبيت طبقات التحقّق من الصحة ورموز التوافق الخاصة بأدوات التتبُّع/إنشاء الملفات الشخصية/تصحيح الأخطاء في صورة نظام الأجهزة المخصّصة للإنتاج. يجب أن تكون طبقات التحقّق والبرامج الوسيطة لأدوات التتبُّع/إنشاء الملفات الشخصية/تصحيح الأخطاء قابلة للتحديث بدون صورة نظام. يمكن للمطوّرين الذين يريدون استخدام إحدى هذه الطبقات أثناء التطوير تعديل حزمة التطبيق، مثلاً، عن طريق إضافة ملف إلى دليل المكتبات الأصلية. من المفترض أن يتمكّن مهندسو مورّدي الأجهزة المستقلين (IHV) ومصنّعي المعدات الأصلية (OEM) الذين يريدون تشخيص الأعطال في التطبيقات غير القابلة للتعديل التي يتم شحنها من الوصول إلى إصدارات غير إنتاجية (تم الوصول إلى الجذر) من صورة النظام، ما لم تكن هذه التطبيقات قابلة لتصحيح الأخطاء. لمزيد من المعلومات، اطّلِع على طبقات التحقّق من صحة Vulkan على Android.
- طبقات الأدوات المساعدة: تعرض هذه الطبقات إضافات، مثل طبقة تنفّذ أداة إدارة الذاكرة لذاكرة الجهاز. يختار المطوّرون الطبقات وإصدارات هذه الطبقات لاستخدامها في تطبيقاتهم، وقد تستخدم التطبيقات المختلفة التي تستخدم الطبقة نفسها إصدارات مختلفة. يختار المطوّرون الطبقات التي سيتم تضمينها في حِزمة التطبيق.
- الطبقات المُدرَجة (الضمنية): تشمل طبقات مثل عدد اللقطات في الثانية، وشبكة التواصل الاجتماعي، وتراكبات مشغّل الألعاب التي يوفّرها المستخدم أو بعض التطبيقات الأخرى بدون علم التطبيق أو موافقته. وتنتهك هذه السياسات سياسات الأمان في Android ولا تتوافق معها.
بالنسبة إلى التطبيقات غير القابلة للتصحيح، يبحث عامل التحميل عن الطبقات في دليل المكتبة المجمّعة من رموز برمجية أصلية للتطبيق فقط، ويحاول تحميل أي مكتبة يتطابق اسمها مع نمط معيّن (على سبيل المثال، libVKLayer_foo.so). ويتم تحميل هذه الطبقات في مساحة اسم التطبيق. وبالتالي، يجب إنشاء هذه التطبيقات باستخدام حزمة NDK.
بالنسبة إلى التطبيقات التي يمكن تصحيح أخطائها، يبحث عامل التحميل عن الطبقات في /data/local/debug/vulkan ويحاول تحميل أي مكتبة تتطابق مع نمط معيّن. بدءًا من Android 10 (المستوى 29 لواجهة برمجة التطبيقات)، يمكن أن يحمّل Vulkan أيضًا طبقات وقت التطوير
من حزمة APK أخرى.
في كلتا الحالتَين، يختار برنامج التحميل الطبقات التي سيتم تفعيلها على أساس كل تطبيق على حدة، وذلك باستخدام إعدادات النظام.
يتم إدراج هذه الطبقات في
vkEnumerateInstanceLayerProperties (أي أنّ التطبيق قد يكون على علم بها)، على الرغم من أنّه قد يتم تحميلها بدون موافقة التطبيق.
يتيح نظام التشغيل Android نقل الطبقات مع تغييرات بيئة التصميم بين Android والمنصات الأخرى. للحصول على تفاصيل حول الواجهة بين الطبقات وبرنامج التحميل، يُرجى الاطّلاع على بنية واجهات برنامج التحميل في Vulkan. تتم استضافة طبقات التحقّق التي تحتفظ بها Khronos في طبقات التحقّق من Vulkan.
إصدارات واجهة برمجة تطبيقات Vulkan وإمكاناتها
يسرد الجدول التالي إصدارات Vulkan API لعدة إصدارات من Android.| إصدار Android | إصدار Vulkan |
|---|---|
| Android 16 | Vulkan 1.4 |
| Android 13 | Vulkan 1.3 |
| Android 9 | Vulkan 1.1 |
| Android 7 | Vulkan 1.0 |
نظرة عامة على وظائف Vulkan 1.4
تضمّن الإصدار 1.4 من Vulkan عددًا من الإضافات التي كانت اختيارية سابقًا في الوظائف الأساسية لـ Vulkan. يتم تضمين معظم هذه الوظائف بهدف زيادة التحكّم والدقة في واجهة برمجة تطبيقات Vulkan. يزيد الإصدار 1.4 من Vulkan متطلبات الأجهزة مقارنةً بالإصدار 1.3، ويتم تنفيذ معظم الميزات في برنامج تشغيل الرسومات الخاص بنظام على شريحة (SoC)، وليس في إطار العمل.
نظرة عامة على وظائف Vulkan 1.3
تضمّن الإصدار 1.3 من Vulkan عددًا من الإضافات التي كانت اختيارية سابقًا في الوظائف الأساسية لـ Vulkan. يتم تضمين معظم هذه الوظائف بهدف زيادة التحكّم والدقة في واجهة برمجة تطبيقات Vulkan. لم تعُد مثيلات تمرير العرض الفردي بحاجة إلى كائنات تمرير العرض أو مخازن مؤقتة للإطارات. يمكن تقليل إجمالي عدد عناصر حالة مسار العرض، كما تم إصلاح عملية المزامنة داخل واجهة برمجة التطبيقات. يتضمّن الإصدار 1.3 من Vulkan متطلبات الأجهزة نفسها التي يتضمّنها الإصدارات 1.2 و1.1 و1.0، ويتم تنفيذ معظم الميزات في برنامج تشغيل الرسومات الخاص بنظام على شريحة (SoC)، وليس في إطار العمل.
في ما يلي أهم ميزات Vulkan 1.3 على Android:
- إتاحة مثيلات تمرير العرض لمرة واحدة
- إتاحة إيقاف استدعاء برنامج تظليل على الفور
- دقة أكبر في إنشاء خطوط الإنتاج ومشاركتها والتحكّم فيها
يتضمّن الإصدار 1.3 من Vulkan أيضًا العديد من الميزات الصغيرة والتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكن الاطّلاع على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.3 على المراجعات الأساسية (Vulkan 1.3).
نظرة عامة على وظائف Vulkan 1.2
يضيف الإصدار 1.2 من Vulkan عددًا من الميزات والإضافات التي تبسّط مساحة واجهة برمجة التطبيقات. ويشمل ذلك نموذج ذاكرة موحّد ومعلومات إضافية يمكن طلبها من برنامج تشغيل الجهاز. تتطلّب Vulkan 1.2 متطلبات الأجهزة نفسها التي تتطلّبها Vulkan 1.0 و1.1، ويتم تنفيذ جميع عمليات التنفيذ في برنامج تشغيل الرسومات الخاص بالمنظومة على الرقاقة (SoC)، وليس في إطار العمل.
أهم ميزة في Vulkan 1.2 لنظام Android هي إتاحة مساحة تخزين بسعة 8 بت.
يتضمّن الإصدار 1.2 من Vulkan أيضًا العديد من الميزات الصغيرة والتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكن الاطّلاع على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.2 على المراجعات الأساسية (Vulkan 1.2).
نظرة عامة على وظائف Vulkan 1.1
يتضمّن الإصدار 1.1 من Vulkan إمكانية التشغيل التفاعلي للذاكرة والمزامنة، ما يتيح لمصنّعي المعدات الأصلية توفير الإصدار 1.1 من Vulkan على الأجهزة. بالإضافة إلى ذلك، تتيح إمكانية التشغيل التفاعلي للذاكرة/المزامنة للمطوّرين تحديد ما إذا كان الإصدار 1.1 من Vulkan متوافقًا مع أحد الأجهزة، واستخدامه بفعالية عندما يكون متوافقًا. يتضمّن الإصدار 1.1 من Vulkan متطلبات الأجهزة نفسها التي يتضمّنها الإصدار 1.0 من Vulkan، ولكن معظم عملية التنفيذ تكون في برنامج تشغيل الرسومات الخاص بنظام على شريحة، وليس في إطار العمل.
في ما يلي أهم ميزات Vulkan 1.1 على Android:
- إتاحة استيراد وتصدير مخازن مؤقتة للذاكرة وعناصر المزامنة من خارج Vulkan (للتشغيل التفاعلي مع الكاميرا وبرامج الترميز وGLES)
- التوافق مع تنسيقات YCbCr
يتضمّن الإصدار 1.1 من Vulkan أيضًا العديد من الميزات الصغيرة والتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكنك الاطّلاع على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.1 في المراجعات الأساسية (Vulkan 1.1).
اختيار دعم Vulkan
يجب أن تتوافق جميع أجهزة Android مع مجموعة خصائص Vulkan الأكثر تقدّمًا المتاحة، شرط أن تتوافق مع واجهة التطبيق الثنائية (ABI) بنظام 64 بت وألا تكون ذاكرتها منخفضة.
يجب أن تتوافق الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android والإصدارات الأحدث مع Vulkan 1.4.
يجب أن تتوافق الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android والإصدارات الأحدث مع Vulkan 1.3.
يجب أن تتوافق الأجهزة التي يتم إطلاقها من خلال Android 10 مع الإصدار 1.1 من Vulkan.
يمكن للأجهزة الأخرى أن تتوافق اختياريًا مع الإصدارات 1.4 و1.3 و1.2 و1.1 من Vulkan.
توفير إصدار Vulkan
يتوافق جهاز Android مع إصدار Vulkan إذا استوفى الشروط التالية:
- أضِف برنامج تشغيل Vulkan يتوافق مع إصدار Vulkan المطلوب (يجب أن يكون أحد الإصدارات 1.4 أو 1.3 أو 1.1 أو 1.0 من Vulkan) إلى جانب متطلبات توافق تعريفات Android الإضافية الخاصة بإصدار Android. بدلاً من ذلك، يمكنك تحديث برنامج تشغيل Vulkan الحالي الذي يحمل رقم إصدار أقل من Vulkan.
- بالنسبة إلى الإصدار 1.4 أو 1.3 أو 1.1 من Vulkan، تحقَّق من أنّ ميزة النظام التي يعرضها مدير الحِزم تعرض
trueلإصدار Vulkan الصحيح.- بالنسبة إلى Vulkan 1.4، تكون الميزة
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x404000). - بالنسبة إلى Vulkan 1.3، تكون الميزة
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000). - بالنسبة إلى Vulkan 1.1، تكون الميزة
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000).
trueللإصدارات 1.4 و1.3 و1.1 من Vulkan من خلال إضافة قاعدة، كما هو موضّح أدناه، إلى ملفdevice.mkمناسب.- أضِف ما يلي لإصدار Vulkan 1.4:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_4.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- أضِف ما يلي لإصدار 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
- بالنسبة إلى Vulkan 1.4، تكون الميزة
ملف Android الأساسي (ABP)
ننصح جميع أجهزة Android بالالتزام بأحدث ملف شخصي من Android Baseline لعام 2022 كما هو موضّح في دليل ملف Android Baseline الشخصي.
يجب أن يستوفي أي جهاز متوافق مع الإصدار 14 من نظام التشغيل Android أو الإصدارات الأحدث وواجهة برمجة التطبيقات Vulkan جميع الوظائف المحدّدة في الملف الشخصي Android Baseline 2021. يمكن العثور على القائمة الكاملة بالوظائف المطلوبة في ملف json الخاص بملف تعريف Vulkan، ولكن تتضمّن مجموعة فرعية رئيسية من الوظائف المطلوبة ما يلي:
- بِنيات مضغوطة من خلال ASTC وETC
- مساحات الألوان المتغيرة من خلال
VK_EXT_swapchain_colorspace - تظليل العيّنات واستيفاء العيّنات المتعددة من خلال
sampleRateShading
دمج نظام النوافذ (WSI)
في libvulkan.so، ينفّذ برنامج التشغيل إضافات دمج نظام النوافذ (WSI) التالية:
VK_KHR_surfaceVK_KHR_android_surfaceVK_KHR_swapchain-
VK_KHR_driver_properties، تم تنفيذه في Vulkan 1.1 على نظام التشغيل Android 10 فقط -
VK_GOOGLE_display_timing، تم تنفيذه لأي إصدار من Vulkan أقل من 0x0A في 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 المطلوبة للتنسيق
والاستخدام. يتم دمج علامات الاستخدام التي يعرضها برنامج التشغيل مع علامات الاستخدام التي يطلبها مستهلك سلسلة التبديل عند تخصيص المخازن المؤقتة.
يستخدم الإصدار 7.x من نظام التشغيل Android إصدارًا سابقًا من VkSwapchainImageUsageFlagsANDROID()،
يُسمى vkGetSwapchainGrallocUsageANDROID(). في الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، تم إيقاف
vkGetSwapchainGrallocUsageANDROID() نهائيًا، ولكن سيظل يتم استدعاء
vkGetSwapchainGrallocUsageANDROID() إذا لم يوفّر برنامج التشغيل
vkGetSwapchainGrallocUsage2ANDROID():
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
VkDevice device,
VkFormat format,
VkImageUsageFlags imageUsage,
int* grallocUsage
);
لا يتيح vkGetSwapchainGrallocUsageANDROID() استخدام علامات swapchain
أو علامات استخدام Gralloc الموسّعة.
صور Gralloc-backed
VkNativeBufferANDROID هي بنية إضافة vkCreateImage
لإنشاء صورة تستند إلى مخزن مؤقت Gralloc. يتم توفير VkNativeBufferANDROID للمستخدم vkCreateImage() في سلسلة بنية VkImageCreateInfo. تتم المكالمات مع الرقم vkCreateImage() باستخدام الرقم VkNativeBufferANDROID
أثناء المكالمة مع الرقم vkCreateSwapchainKHR. يخصّص تنفيذ WSI عدد المخازن المؤقتة المدمجة مع المحتوى المطلوبة لسلسلة التبديل، ثم ينشئ 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
في الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، توفّر المنصة بنية إضافة VkSwapchainImageCreateInfoKHR في سلسلة VkImageCreateInfo المقدَّمة إلى vkCreateImage عندما تكون أي علامات استخدام لصورة سلسلة التبديل مطلوبة لسلسلة التبديل.
يحتوي هيكل الإضافة على علامات استخدام صور سلسلة التبديل:
typedef struct {
VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
const void* pNext;
VkSwapchainImageUsageFlagsANDROID usage;
} VkSwapchainImageCreateInfoANDROID;
في الإصدار 10 من نظام التشغيل Android والإصدارات الأحدث، تتوافق المنصة مع
VK_KHR_swapchain الإصدار 70، وبالتالي يمكن لتطبيق Vulkan إنشاء
VkImage مدعوم بذاكرة swapchain. يستدعي التطبيق أولاً
vkCreateImage باستخدام بنية VkImageSwapchainCreateInfoKHR
مرتبطة ببنية VkImageCreateInfo. بعد ذلك، يستدعي التطبيق vkBindImageMemory2(KHR) مع بنية VkBindImageMemorySwapchainInfoKHR مرتبطة ببنية VkBindImageMemoryInfo. يجب أن يكون imageIndex المحدّد في بنية VkBindImageMemorySwapchainInfoKHR فهرسًا صالحًا لصورة سلسلة التبديل. في الوقت نفسه، توفّر المنصة بنية إضافة VkNativeBufferANDROID تتضمّن معلومات مخزن Gralloc المؤقت المناسب لسلسلة VkBindImageMemoryInfo، لكي يعرف برنامج التشغيل مخزن Gralloc المؤقت الذي يجب ربط VkImage به.
الحصول على الصور
يكتسب vkAcquireImageANDROID ملكية صورة swapchain ويستورد سياجًا أصليًا تم إرسال إشارة إليه خارجيًا إلى كل من كائن 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 صورة swapchain للاستخدام الخارجي، وتنشئ سياجًا أصليًا، وتجدول إشارة السياج الأصلي بعد أن تُصدر إشارات دلالية الإدخال:
VkResult VKAPI vkQueueSignalReleaseImageANDROID(
VkQueue queue,
uint32_t waitSemaphoreCount,
const VkSemaphore* pWaitSemaphores,
VkImage image,
int* pNativeFenceFd
);
vkQueuePresentKHR() مكالمات vkQueueSignalReleaseImageANDROID()
في قائمة الانتظار المحدّدة يجب أن ينتج برنامج التشغيل سياجًا أصليًا لا يشير إلى اكتمال العملية إلا بعد أن تشير جميع إشارات waitSemaphoreCount في pWaitSemaphores إلى اكتمالها، وبعد اكتمال أي عمل إضافي مطلوب لإعداد image للعرض.
إذا كانت إشارات الإيقاف المؤقت (إن وجدت) قد تم إرسالها بالفعل، وكان queue في وضع الخمول، يمكن لبرنامج التشغيل ضبط *pNativeFenceFd على -1 بدلاً من واصِف ملف السياج الأصلي الفعلي، ما يشير إلى عدم توفّر أي شيء يجب انتظاره. يملك المتصل واصف الملف الذي تم عرضه في *pNativeFenceFd ويغلقه.
يمكن للعديد من برامج التشغيل تجاهل مَعلمة الصورة، ولكن قد يحتاج البعض إلى إعداد بنى بيانات مرتبطة بمخزن مؤقت في Gralloc على مستوى وحدة المعالجة المركزية لاستخدامها من قِبل مستهلكي الصور الخارجيين. يجب إعداد محتوى المخزن المؤقت لاستخدامه من قِبل المستهلكين الخارجيين بشكل غير متزامن كجزء من نقل الصورة إلى VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.
إذا تم إنشاء الصورة باستخدام
VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID، يجب أن يسمح برنامج التشغيل
باستدعاء vkQueueSignalReleaseImageANDROID() بشكل متكرر
بدون استدعاء vkAcquireImageANDROID() بشكل متكرر.
توفير صور مشتركة قابلة للعرض
يمكن لبعض الأجهزة مشاركة ملكية صورة واحدة بين مسار العرض وتنفيذ Vulkan لتقليل وقت الاستجابة.
في الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث، يعلن برنامج التحميل بشكل مشروط عن الإضافة 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، والتي تتضمّن اختبارات وظيفية لواجهة برمجة التطبيقات للإصدارات 1.0 و1.1 و1.2 و1.3 و1.4 من Vulkan - وحدة
CtsGraphicsTestCasesالتي تختبر ما إذا كان الجهاز مضبوطًا بشكل صحيح للاستفادة من إمكانات Vulkan المتوافقة معه.
مفتاح إيقاف أو تفعيل ميزة Vulkan
يجب أن يكون الجهاز متوافقًا مع الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث ومتوافقًا مع واجهة برمجة التطبيقات Vulkan لعرض علامة الميزة android.software.vulkan.deqp.level. قيمة علامة الميزة هذه هي تاريخ، ويتم ترميزها كقيمة عددية صحيحة. تحدّد هذه السمة التاريخ المرتبط باختبارات Vulkan dEQP التي يزعم الجهاز أنّه اجتازها.
يتم ترميز التاريخ بالتنسيق YYYY-MM-DD كعدد صحيح 32 بت على النحو التالي:
- تخزّن الأجزاء من 0 إلى 15 السنة
- تخزِّن الأجزاء من 16 إلى 23 الشهر
- تخزِّن الأجزاء من 24 إلى 31 اليوم
الحد الأدنى المسموح به لقيمة علامة الميزة هو 0x07E30301،
وهو ما يتوافق مع التاريخ 2019-03-01، وهو التاريخ المرتبط
باختبارات Vulkan dEQP لنظام التشغيل Android 10. إذا كانت قيمة علامة الميزة تساوي هذه القيمة على الأقل،
سيزعم الجهاز أنّه يجتاز جميع اختبارات dEQP في Vulkan على Android 10.
تتوافق القيمة 0x07E40301 مع التاريخ 2020-03-01، وهو التاريخ المرتبط باختبارات Vulkan dEQP لنظام التشغيل Android 11. إذا كانت قيمة علامة الميزة أكبر من هذه القيمة أو تساويها، يوضّح الجهاز أنّه يجتاز جميع اختبارات dEQP في Vulkan على Android 11.
تتوافق القيمة 0x07E60301 مع التاريخ 2022-03-01، وهو التاريخ المرتبط باختبارات Vulkan dEQP لنظام Android 13. إذا كانت قيمة علامة الميزة تساوي هذه القيمة أو أكبر منها،
سيزعم الجهاز أنّه اجتاز جميع اختبارات dEQP الخاصة بـ Vulkan على Android 13.
يدّعي الجهاز الذي يعرض علامة ميزة معيّنة (مثل
0x07E30301 و0x07E40301 و0x07E60301) أنّه يجتاز جميع اختبارات dEQP الخاصة بعلامة الميزة هذه في Vulkan على Android (الإصدار 10 و11 و13 من نظام التشغيل Android على التوالي). قد يجتاز هذا الجهاز اختبارات dEQP الخاصة بـ Vulkan من إصدار Android أحدث.
تشكّل حزمة dEQP الخاصة بواجهة Vulkan جزءًا من مجموعة أدوات اختبار التوافق (CTS) على Android. بدءًا من Android 11، أصبح مكوّن مشغّل اختبار dEQP في مجموعة أدوات اختبار التوافق (CTS) على دراية بعلامة الميزة android.software.vulkan.deqp.level، ويتخطّى أي اختبارات Vulkan dEQP التي لا يزعم الجهاز توفيرها وفقًا لعلامة الميزة هذه. ويتم الإبلاغ عن هذه الاختبارات على أنّها اجتازت الاختبار بشكل بسيط.