Vulkan هي واجهة برمجة تطبيقات خفيفة التحميل وتعمل على جميع الأنظمة الأساسية لتوفير رسومات ثلاثية الأبعاد عالية الأداء. مثل OpenGL ES (GLES)، يقدّم Vulkan أدوات لإنشاء رسومات عالية الجودة في الوقت الفعلي في التطبيقات. تشمل مزايا استخدام Vulkan تقليل وقت المعالجة في وحدة المعالجة المركزية وتوفير لغة SPIR-V Binary Intermediate.
لتنفيذ Vulkan بنجاح، يجب أن يشتمل الجهاز على ما يلي:
- أداة تحميل Vulkan التي يوفّرها نظام التشغيل Android
- برنامج تشغيل Vulkan، الذي تقدّمه وحدات المعالجة المركزية المتكاملة (SoC) مثل مورّدي واجهة برمجة التطبيقات لوحدات معالجة الرسومات (IHV)، والذي ينفِّذ Vulkan API لإتاحة وظائف Vulkan، يحتاج جهاز Android إلى جهاز وحدة معالجة رسومات متوافق مع Vulkan وبرنامج التشغيل المرتبط به. يجب أن يكون وحدة معالجة الرسومات متوافقة أيضًا مع GLES 3.1 والإصدارات الأحدث. استشر بائع المنظومة على الرقاقة (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 CDD والعديد من الإضافات الاختيارية الإضافية. يتم تصدير إضافات تكامل نظام النوافذ (WSI) بواسطة برنامج التحميل ويتم تنفيذها بشكل أساسي في برنامج التحميل بدلاً من تنفيذها في برنامج التشغيل. يتيح أداة التحميل أيضًا
إحصاء الطبقات وتحميلها التي يمكنها عرض إضافات إضافية واعتراض
طلبات البيانات الأساسية من واجهة برمجة التطبيقات في طريقها إلى برنامج التشغيل.
يتضمّن حِزم NDK مكتبة libvulkan.so
لعمليات الربط. تُصدِّر المكتبة الرموز نفسها التي يصدِّرها أداة التحميل. تستدعي التطبيقات الدوالّ
المصدَّرة من مكتبة libvulkan.so
الحقيقية لتحديد الدوالّ التي تؤدي إلى إعادة التوجيه في أداة التحميل، والتي يتم توجيهها إلى الخطوة المناسبة في
الطبقة أو برنامج التشغيل استنادًا إلى الوسيطة الأولى. تُعرِض vkGet*ProcAddr()
call مؤشرات الدوال التي ترسلها العناصر الوسيطة (أي
يُجري الاستدعاء مباشرةً في رمز واجهة برمجة التطبيقات الأساسية). إنّ الاستدعاء من خلال مؤشرات الدوالّ، بدلاً من الرموز المُصدَّرة، هو أكثر فعالية لأنّه يتخطّى القفزة والتوجيه.
تعداد برامج تشغيل الأجهزة وتحميلها
عند إنشاء صورة النظام، يتوقّع Android أن يعرف النظام وحدات معالجة الرسومات
المتوفّرة. يستخدم أداة التحميل آلية 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
في الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث، يلُفّ مشتق 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 إدراج الطبقات وتحميلها التي يمكنها عرض إضافات إضافية واعتراض طلبات البيانات الأساسية لواجهة برمجة التطبيقات في طريقها إلى برنامج التشغيل. لا يتضمّن نظام التشغيل Android طبقات في صورة النظام، ولكن قد تتضمّن التطبيقات طبقات في حِزم APK الخاصة بها.
عند استخدام الطبقات، تذكَّر أنّ نموذج الأمان وسياسات الأمان في Android يختلفان بشكل كبير عن الأنظمة الأساسية الأخرى. على وجه الخصوص، لا يسمح نظام التشغيل Android بتحميل رمز خارجي في عملية لا يمكن تصحيح أخطاءها على الأجهزة المخصّصة للإصدار العلني (غير المزوّدة بإذن الوصول إلى الجذر)، ولا يسمح للرمز الخارجي بفحص ذاكرة العملية أو حالتها أو غير ذلك أو التحكّم فيها. ويشمل ذلك حظر حفظ عمليات تفريغ الذاكرة الأساسية ومسارات واجهة برمجة التطبيقات وغيرها على القرص لفحصها لاحقًا. لا يتم تفعيل سوى الطبقات التي يتم تقديمها كجزء من التطبيقات التي لا يمكن تصحيح الأخطاء بها على أجهزة الإنتاج، ويجب ألا توفّر برامج التشغيل وظائف تنتهك هذه السياسات.
تشمل حالات استخدام الطبقات ما يلي:
- الطبقات في مرحلة التطوير: يجب عدم تثبيت أدوات التتبّع/التحليل/تصحيح الأخطاء وطبقات التحقّق على صورة النظام للأجهزة العلنية. يجب أن تكون طبقات التحقّق والعناصر الوسيطة لأدوات التتبُّع/التحليل/تصحيح الأخطاء قابلَين للتحديث بدون استخدام ملف تكوين النظام. يمكن للمطوّرين الذين يريدون استخدام إحدى هذه الطبقات أثناء التطوير تعديل حزمة التطبيق، على سبيل المثال، عن طريق إضافة ملف إلى دليل المكتبات الأصلية. يُفترض أن يكون لدى مهندسي المصنّعين الأصليين للأجهزة (OEM) ومصنّعي الأجهزة الداخلية (IHV) الذين يريدون تحديد الأعطال في شحن التطبيقات غير القابلة للتعديل إذن بالوصول إلى إصدارات غير مخصّصة للإصدار العلني (مزوّدة بإذن الوصول إلى الجذر) من صورة النظام، ما لم يكن بالإمكان تصحيح أخطاء هذه التطبيقات. لمزيد من المعلومات، يُرجى الاطّلاع على طبقات التحقّق من Vulkan على Android.
- طبقات الأدوات المساعدة: تعرض هذه الطبقات الإضافات، مثل الطبقة التي تنفِّذ أداة إدارة الذاكرة لذاكرة الجهاز. يختار مطورو البرامج طبقات وإصدارات من هذه الطبقات لاستخدامها في تطبيقاتهم، ومن المحتمل أن تستخدم التطبيقات المختلفة التي تستخدم الطبقة نفسها إصدارات مختلفة. يختار المطوّرون الطبقات التي سيتم تضمينها في حزمة التطبيق.
- الطبقات المُدرَجة (الضمنية): تشمل طبقات مثل معدل عرض اللقطات والشبكة الاجتماعية وطبقات مشغّل الألعاب التي يقدّمها المستخدم أو تطبيق آخر بدون علم التطبيق أو موافقته. تنتهك هذه التطبيقات سياسات أمان Android وهي غير متوافقة.
بالنسبة إلى التطبيقات التي لا يمكن تصحيح أخطاءها، يبحث أداة التحميل عن الطبقات في directory مكتبة التطبيق الأصلي فقط ويحاول تحميل أي مكتبة باسم
مطابق لنمط معيّن (مثل libVKLayer_foo.so
).
بالنسبة إلى التطبيقات التي يمكن تصحيح أخطاءها، يبحث أداة التحميل عن الطبقات في
/data/local/debug/vulkan
ويحاول تحميل أي مكتبة تتطابق مع
نمط معيّن.
يتيح نظام التشغيل Android نقل الطبقات مع تغييرات بيئة التصميم بين Android والمنصات الأخرى. لمعرفة تفاصيل حول الواجهة بين الطبقات وأداة التحميل، يمكنك الاطّلاع على بنية Vulkan Loader Interface. يتم استضافة مراحل التحقّق التي تديرها Khronos في مراحل التحقّق من Vulkan.
إصدارات Vulkan API وإمكاناتها
يسرد الجدول التالي إصدارات Vulkan API لعدة إصدارات من Android.إصدار Android | إصدار Vulkan |
---|---|
Android 13 | Vulkan 1.3 |
Android 9 | Vulkan 1.1 |
الإصدار 7 من نظام التشغيل Android | Vulkan 1.0 |
نظرة عامة على وظائف Vulkan 1.3
يضيف الإصدار 1.3 من Vulkan عددًا من الإضافات التي كانت اختيارية في السابق إلى الوظائف الأساسية في Vulkan. ويتم تضمين الكثير من هذه الوظائف بهدف زيادة التحكّم والدقة في واجهة برمجة Vulkan. لم تعُد نُسخ تمريرة التقديم ذات المرور الواحد بحاجة إلى عناصر تمريرة التقديم أو إطارات التخزين المؤقت. يمكن تقليل إجمالي عدد عناصر حالة مسار الإحالة الناجحة، وتمت إعادة فحص عملية التنسيق ضمن واجهة برمجة التطبيقات. يتطلب إصدار Vulkan 1.3 متطلبات الأجهزة نفسها التي يتطلبها إصدار Vulkan 1.2 و1.1 و1.0، مع تنفيذ معظم العمليات في برنامج تشغيل الرسومات المخصّص لوحدة المعالجة المركزية (SoC)، وليس في إطار العمل.
في ما يلي أهم ميزات Vulkan 1.3 لنظام التشغيل Android:
- إتاحة مثيلات تمريرة التقديم لمرّة واحدة
- إتاحة إنهاء طلب تظليل على الفور
- دقة أكبر في إنشاء مسار الإحالة الناجحة ومشاركته والتحكّم فيه
يتضمّن Vulkan 1.3 أيضًا العديد من الميزات الأصغر حجمًا وتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكن العثور على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.3 على Core Revisions (الإصدار 1.3) الأساسي.
نظرة عامة على وظائف Vulkan 1.2
يضيف Vulkan 1.2 عددًا من الميزات والإضافات التي تبسّط واجهة برمجة التطبيقات. ويشمل ذلك نموذج الذاكرة الموحّد ومعلومات إضافية يمكن الاستعلام عنها من برنامج تشغيل الجهاز. يتطلب Vulkan 1.2 متطلبات الأجهزة نفسها التي يتطلبها Vulkan 1.0 و1.1، ويتم تنفيذ كل العمليات في برنامج تشغيل الرسومات المخصّص للمنظومة على الرقاقة، وليس في إطار العمل.
أهم ميزة في Vulkan 1.2 لنظام Android هي إتاحة مساحة تخزين بسعة 8 بت.
يتضمّن Vulkan 1.2 أيضًا العديد من الميزات الأصغر حجمًا وتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكن العثور على كل التغييرات التي تم إجراؤها على واجهة برمجة التطبيقات الأساسية لـ 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)، وليس في إطار العمل.
في ما يلي أهم ميزات Vulkan 1.1 لنظام التشغيل Android:
- إتاحة استيراد وتصدير المخازن المؤقتة للذاكرة وكائنات المزامنة من خارج Vulkan (لإمكانية التشغيل التفاعلي مع الكاميرا وبرامج الترميز وGLES)
- التوافق مع تنسيقات YCbCr
يشتمل Vulkan 1.1 أيضًا على العديد من الميزات الأصغر وتحسينات قابلية استخدام واجهة برمجة التطبيقات. يمكن العثور على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.1 على Core Revisions (الإصدار 1.1) الأساسي.
اختيار ميزة دعم Vulkan
يجب أن تتوافق أجهزة Android مع مجموعة ميزات Vulkan الأكثر تقدمًا المتاحة، شرط أن تتوافق مع ABI بسعة 64 بت وأن تكون الذاكرة فيها كافية.
ويجب أن تتوافق الأجهزة التي تعمل بنظام التشغيل Android 13 والإصدارات الأحدث مع الإصدار 1.3 من Vulkan.
يجب أن تكون الأجهزة التي تعمل بالإصدار 10 من نظام التشغيل Android متوافقة مع 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 (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_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 المطلوبة للتنسيق والاستخدام. يتم دمج علامات الاستخدام التي يعرضها برنامج التشغيل مع علامات الاستخدام
التي يطلبها مستخدِم سلسلة التبديل عند تخصيص المخزن المؤقت.
يطلب نظام التشغيل Android 7.x إصدارًا سابقًا من VkSwapchainImageUsageFlagsANDROID()
،
يُسمى vkGetSwapchainGrallocUsageANDROID()
. يوقف الإصدار 8.0 من نظام التشغيل Android نهائيًا استخدام دالة
vkGetSwapchainGrallocUsageANDROID()
، ولكنه لا يزال يستدعي دالة
vkGetSwapchainGrallocUsageANDROID()
إذا لم يقدّم برنامج التشغيل دالة
vkGetSwapchainGrallocUsage2ANDROID()
:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage );
لا يتوافق vkGetSwapchainGrallocUsageANDROID()
مع علامات استخدام سلسلة التبديل
أو علامات استخدام Gralloc الموسّعة.
الصور التي تتضمّن محتوى إضافيًا
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 والإصدارات الأحدث، تتيح المنصة استخدام الإصدار 70 من مكتبة برمجة التطبيقات
VK_KHR_swapchain
، ما يتيح لتطبيق Vulkan إنشاء مكتبة برمجة التطبيقات
VkImage
مستندة إلى ذاكرة سلسلة الاستبدال. يستدعي التطبيق أولاً
vkCreateImage
مع بنية VkImageSwapchainCreateInfoKHR
مرتبطة ببنية VkImageCreateInfo
. بعد ذلك، يُطلِق
التطبيق vkBindImageMemory2(KHR)
باستخدام بنية
VkBindImageMemorySwapchainInfoKHR
مرتبطة ببنية
VkBindImageMemoryInfo
. يجب أن تكون السمة imageIndex
المحدّدة في بنية VkBindImageMemorySwapchainInfoKHR
عبارة عن فهرس صالح للصور لسلسلة التبديل. في الوقت نفسه، توفّر المنصة بنية VkNativeBufferANDROID
مع معلومات ملف التخزين المؤقت Gralloc المقابلة لسلسلة VkBindImageMemoryInfo
، حتى يعرف السائق ملف التخزين المؤقت Gralloc الذي يجب ربط VkImage
به.
الحصول على الصور
يحصل vkAcquireImageANDROID
على ملكية صورة سلسلة التبديل ويستورد سياجًا أصليًا تم إرسال إشارة إليه خارجيًا إلى كل من عنصر VkSemaphore
حالي وكائن VkFence
حالي:
VkResult VKAPI vkAcquireImageANDROID( VkDevice device, VkImage image, int nativeFenceFd, VkSemaphore semaphore, VkFence fence );
يتم استدعاء vkAcquireImageANDROID()
أثناء
vkAcquireNextImageKHR
لاستيراد
سياج أصلي في كائنَي VkSemaphore
وVkFence
المتوفّرين في التطبيق (ومع ذلك، يكون كل من عنصرَي إشارة المرور والسياج
اختياريًا في هذا الطلب). يمكن أن يستغل برنامج التشغيل هذه الفرصة أيضًا للتعرّف على
أي تغييرات خارجية في حالة مخزن مؤقت Gralloc ومعالجتها، ولن يحتاج العديد من برامج التشغيل
إلى اتّخاذ أي إجراء هنا. تؤدي هذه الدعوة إلى وضع VkSemaphore
و
VkFence
في الحالة المعلّقة نفسها كما لو تم إرسال إشارة من vkQueueSubmit
،
بحيث يمكن للطوابير الانتظار على إشارة المرور ويمكن للتطبيق الانتظار على السياج.
وتصبح الإشارات في كلا العنصرين عند إشارات السياج الأصلي.
وإذا سبق أن تم إرسال إشارة إليها من قبل، تصبح الإشارة إلى الحالة المرصودة عند عودة هذه الدالة. يحصل برنامج التشغيل على ملكية ملف وصف حدود الشبكة ويقفل ملف وصف حدود الشبكة عندما لا يكون مطلوبًا بعد ذلك. يجب أن يفعل السائق
ذلك حتى في حال عدم توفير إشارة Semaphore أو كائن Fence، أو حتى في حال تعطُّل
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
.
يمكن للعديد من برامج تشغيل الأجهزة تجاهل مَعلمة الصورة، ولكن قد يحتاج البعض إلى تجهيز
هياكل البيانات من جهة وحدة المعالجة المركزية المرتبطة بوحدة تخزين مؤقت 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
، التي تتضمّن اختبارات واجهة برمجة التطبيقات الوظيفية لإصدارات Vulkan 1.0 و1.1 و1.2 و1.3 - وحدة
CtsGraphicsTestCases
التي تختبر إعدادات الجهاز بشكل صحيح للتأكّد من توافقه مع إمكانيات Vulkan.
علامة ميزة Vulkan
يجب أن يكون لديك جهاز متوافق مع الإصدار 11 من نظام التشغيل Android أو إصدار أحدث ومتوافق مع واجهة برمجة التطبيقات Vulkan API
لعرض علامة اختيار ميزة،
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. إذا كانت علامة الميزة هذه القيمة على الأقل،
يُفترض أنّ الجهاز اجتاز جميع اختبارات Vulkan dEQP في Android 10.
تتوافق القيمة 0x07E40301
مع التاريخ 01-03-2020، وهو
التاريخ المرتبط باختبارات Vulkan dEQP لنظام التشغيل Android 11. إذا كانت قيمة علامة الميزة هي هذه القيمة على الأقل، يدّعي الجهاز أنّه اجتاز جميع اختبارات Vulkan dEQP لنظام Android 11.
تتوافق القيمة 0x07E60301
مع التاريخ 01-03-2022، وهو
التاريخ المرتبط باختبارات Vulkan dEQP لنظام التشغيل
Android 13. إذا كانت علامة الميزة هذه القيمة على الأقل،
يُفترض أن يكون الجهاز قد اجتاز جميع اختبارات Vulkan
dEQP في Android 13.
يدّعي الجهاز الذي يعرض علامة ميزة معيّنة (أي
0x07E30301
أو 0x07E40301
أو 0x07E60301
)
اجتياز جميع اختبارات dEQP لنظام Android Vulkan لعلامة هذه الميزة على الأجهزة (Android 10
وAndroid 11 وAndroid 13 على التوالي). قد يُجتاز هذا الجهاز اختبارات Vulkan dEQP من إصدار Android لاحق.
تشكّل أداة Vulkan dEQP جزءًا من مجموعة أدوات اختبار التوافق (CTS) في Android. اعتبارًا من Android 11، يتعرّف android.software.vulkan.deqp.level
مكوّن مشغّل اختبار dEQP في مجموعة أدوات اختبار التوافق (CTS) على علامة ميزة
، ويتخطّى أي اختبارات Vulkan dEQP لا يُزعَم أنّ الجهاز يتوافق معها وفقًا لعلامة ميزة
هذه. تم الإبلاغ عن هذه الاختبارات
على أنها نجاح تافه.