تنفيذ Vulkan

Vulkan هي واجهة برمجة تطبيقات متوافقة مع عدة أنظمة أساسية للرسومات الثلاثية الأبعاد عالية الأداء، وتتطلّب الحد الأدنى من النفقات العامة. مثل OpenGL ES (GLES)، توفّر Vulkan أدوات لإنشاء رسومات عالية الجودة في الوقت الفعلي في التطبيقات. تشمل مزايا استخدام Vulkan تقليل الحمل الزائد لوحدة المعالجة المركزية (CPU) وتوفير الدعم للغة SPIR-V Binary Intermediate.

لتنفيذ Vulkan بنجاح، يجب أن يتضمّن الجهاز ما يلي:

  • برنامج تحميل Vulkan الذي يوفّره نظام التشغيل Android
  • برنامج تشغيل Vulkan، وهو برنامج توفّره أنظمة على شرائح مثل مورّدي أجهزة معالجة الرسومات المستقلة، ويتضمّن واجهة برمجة تطبيقات Vulkan. لإتاحة وظائف Vulkan، يجب أن يتضمّن جهاز Android وحدة معالجة رسومات (GPU) متوافقة مع Vulkan وبرنامج التشغيل المرتبط بها. يجب أن تتوافق وحدة معالجة الرسومات أيضًا مع الإصدار 3.1 من GLES والإصدارات الأحدث. يُرجى التواصل مع مورِّد نظام التشغيل على الشريحة لطلب توفير برنامج تشغيل متوافق.

إذا كان الجهاز يتضمّن برنامج تشغيل 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 الحقيقية لإدخال دوال الترامبولين في أداة التحميل، والتي يتم إرسالها إلى الطبقة أو برنامج التشغيل المناسبَين استنادًا إلى وسيطهما الأول. تعرض عملية الاستدعاء 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.

منذ الإصدار 15 من نظام التشغيل Android، يتيح برنامج التحميل استخدام APEX لتحميل برنامج تشغيل Vulkan. اضبط ro.vulkan.apex على اسم حزمة APEX الخاصة بـ Vulkan لتحميل Vulkan من حزمة APEX.

العثور على الطبقات وتحميلها

يتيح برنامج التحميل Vulkan إمكانية تعداد وتحميل الطبقات التي يمكنها عرض إضافات أخرى واعتراض طلبات البيانات الأساسية من واجهة برمجة التطبيقات أثناء انتقالها إلى برنامج التشغيل. لا يتضمّن نظام التشغيل Android طبقات في صورة النظام، ولكن قد تتضمّن التطبيقات طبقات في حِزمة APK.

عند استخدام الطبقات، ضَع في اعتبارك أنّ نموذج الأمان والسياسات في Android يختلفان بشكل كبير عن المنصات الأخرى. على وجه الخصوص، لا يسمح نظام التشغيل Android بتحميل رمز خارجي في عملية غير قابلة للتصحيح على أجهزة الإنتاج (غير المزودة بإذن الوصول إلى الجذر)، كما لا يسمح للرمز الخارجي بفحص أو التحكّم في ذاكرة العملية وحالتها وما إلى ذلك. ويشمل ذلك حظر حفظ عمليات تفريغ الذاكرة الأساسية وعمليات تتبُّع واجهة برمجة التطبيقات (API) وما إلى ذلك على القرص لفحصها لاحقًا. لا يتم تفعيل سوى الطبقات التي يتم توفيرها كجزء من التطبيقات غير القابلة للتصحيح على الأجهزة المخصّصة للإنتاج، ويجب ألا توفّر برامج التشغيل وظائف تنتهك هذه السياسات.

تشمل حالات استخدام الطبقات ما يلي:

  • طبقات وقت التطوير: يجب عدم تثبيت طبقات التحقّق من الصحة ورموز التوافق الخاصة بأدوات التتبُّع/إنشاء الملفات الشخصية/تصحيح الأخطاء في صورة نظام الأجهزة المخصّصة للإنتاج. يجب أن تكون طبقات التحقّق من الصحة ووسائل التوافق لأدوات التتبُّع/إنشاء الملفات الشخصية/تصحيح الأخطاء قابلة للتحديث بدون صورة نظام. يمكن للمطوّرين الذين يريدون استخدام إحدى هذه الطبقات أثناء التطوير تعديل حزمة التطبيق، مثلاً، عن طريق إضافة ملف إلى دليل المكتبات الأصلية. من المفترض أن يتمكّن مهندسو مورّدي الأجهزة المستقلين ومصنّعي المعدات الأصلية الذين يريدون تشخيص الأعطال في التطبيقات غير القابلة للتعديل التي يتم شحنها من الوصول إلى إصدارات غير إنتاجية (تم الوصول إلى جذرها) من صورة النظام، ما لم تكن هذه التطبيقات قابلة لتصحيح الأخطاء. لمزيد من المعلومات، اطّلِع على طبقات التحقّق من Vulkan على Android.
  • طبقات الأدوات المساعدة: تعرض هذه الطبقات إضافات، مثل طبقة تنفّذ أداة إدارة الذاكرة لذاكرة الجهاز. يختار المطوّرون الطبقات وإصدارات هذه الطبقات لاستخدامها في تطبيقاتهم، وقد تستخدم التطبيقات المختلفة التي تستخدم الطبقة نفسها إصدارات مختلفة. يختار المطوّرون الطبقات التي سيتم تضمينها في حِزمة التطبيق.
  • الطبقات المُدرَجة (الضمنية): تشمل طبقات مثل معدّل عرض اللقطات في الثانية، والشبكة الاجتماعية، وتراكبات مشغّل الألعاب التي يوفّرها المستخدم أو بعض التطبيقات الأخرى بدون علم التطبيق أو موافقته. وتنتهك هذه السياسات سياسات الأمان في Android ولا تتوافق معها.

بالنسبة إلى التطبيقات التي لا يمكن تصحيح أخطائها، يبحث برنامج التحميل عن الطبقات في دليل المكتبة الأصلية للتطبيق فقط ويحاول تحميل أي مكتبة تحمل اسمًا يطابق نمطًا معيّنًا (على سبيل المثال، libVKLayer_foo.so).

بالنسبة إلى التطبيقات التي يمكن تصحيح أخطائها، يبحث برنامج التحميل عن الطبقات في /data/local/debug/vulkan ويحاول تحميل أي مكتبة تتطابق مع نمط معيّن.

يتيح نظام التشغيل Android نقل الطبقات مع تغييرات بيئة التصميم بين Android والمنصات الأخرى. للحصول على تفاصيل حول الواجهة بين الطبقات وبرنامج التحميل، يُرجى الاطّلاع على بنية واجهات برنامج التحميل في Vulkan. تتم استضافة طبقات التحقّق التي تحتفظ بها Khronos في طبقات التحقّق من Vulkan.

إصدارات واجهة برمجة التطبيقات Vulkan وإمكاناتها

يعرض الجدول التالي إصدارات 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. لم تعُد مثيلات تمرير العرض أحادي المسار بحاجة إلى كائنات تمرير العرض أو مخازن مؤقتة للإطارات. يمكن تقليل إجمالي عدد عناصر حالة مسار العرض، كما تم إصلاح عملية المزامنة داخل واجهة برمجة التطبيقات. تتطلّب واجهة برمجة التطبيقات Vulkan 1.3 متطلبات الأجهزة نفسها التي تتطلّبها الإصدارات 1.2 و1.1 و1.0 من Vulkan، ويتم تنفيذ معظمها في برنامج تشغيل الرسومات الخاص بنظام على شريحة واحدة (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 بت.

يتضمّن Vulkan 1.2 أيضًا العديد من الميزات الصغيرة وتحسينات سهولة استخدام واجهة برمجة التطبيقات. يمكنك الاطّلاع على جميع التغييرات التي تم إجراؤها على واجهة برمجة التطبيقات الأساسية Vulkan مع المراجعة الثانوية 1.2 على المراجعات الأساسية (Vulkan 1.2).

نظرة عامة على وظائف Vulkan 1.1

يتضمّن الإصدار 1.1 من Vulkan إمكانية التشغيل التفاعلي للذاكرة والمزامنة، ما يتيح لمصنّعي المعدات الأصلية توفير الإصدار 1.1 من Vulkan على الأجهزة. بالإضافة إلى ذلك، تتيح إمكانية التشغيل التفاعلي للذاكرة/المزامنة للمطوّرين تحديد ما إذا كان الإصدار 1.1 من Vulkan متوافقًا مع أحد الأجهزة، واستخدامه بفعالية عندما يكون متوافقًا. يتضمّن الإصدار 1.1 من Vulkan متطلبات الأجهزة نفسها التي يتضمّنها الإصدار 1.0 من Vulkan، ولكن معظم عملية التنفيذ تكون في برنامج تشغيل الرسومات الخاص بنظام SOC، وليس في إطار العمل.

في ما يلي أهم ميزات Vulkan 1.1 على Android:

  • إتاحة استيراد وتصدير مخازن مؤقتة للذاكرة وعناصر المزامنة من خارج Vulkan (للتوافق مع الكاميرا وبرامج الترميز وGLES)
  • التوافق مع تنسيقات YCbCr

يتضمّن Vulkan 1.1 أيضًا العديد من الميزات الصغيرة والتحسينات على سهولة استخدام واجهة برمجة التطبيقات. يمكنك الاطّلاع على جميع التغييرات التي تم إجراؤها على واجهة برمجة تطبيقات Vulkan الأساسية مع المراجعة الثانوية 1.1 على المراجعات الأساسية (Vulkan 1.1).

اختيار دعم Vulkan

يجب أن تتوافق أجهزة Android مع مجموعة ميزات Vulkan الأكثر تقدّمًا المتوفّرة، شرط أن تتوافق مع واجهة التطبيق الثنائية (ABI) ذات 64 بت وألا تكون ذات ذاكرة منخفضة.

يجب أن تتوافق الأجهزة التي تعمل بالإصدار 13 من نظام التشغيل Android والإصدارات الأحدث مع Vulkan 1.3.

يجب أن تتوافق الأجهزة التي يتم إطلاقها من خلال Android 10 مع الإصدار 1.1 من Vulkan.

يمكن للأجهزة الأخرى أن تتوافق اختياريًا مع الإصدارات 1.3 و1.2 و1.1 من Vulkan.

التوافق مع إصدار Vulkan

يتوافق جهاز Android مع إصدار Vulkan إذا استوفيت الشروط التالية:

  1. أضِف برنامج تشغيل Vulkan يتوافق مع إصدار Vulkan المطلوب (يجب أن يكون أحد الإصدارات 1.3 أو 1.1 أو 1.0 من Vulkan) بالإضافة إلى متطلبات توافق تعريفات Android الإضافية لإصدار 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

ملف ABP الأساسي على Android

ننصح جميع أجهزة Android بالالتزام بأحدث ملف تعريف Android Baseline لعام 2022 كما هو موضّح في دليل ملف تعريف Android Baseline.

يجب أن يستوفي أي جهاز متوافق مع Android 14 أو الإصدارات الأحدث وواجهة برمجة التطبيقات 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 أقل من 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() مع علامات استخدام سلسلة التبديل أو علامات استخدام 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 مدعوم بذاكرة سلسلة التبديل. يطلب التطبيق أولاً vkCreateImage باستخدام بنية VkImageSwapchainCreateInfoKHR مرتبطة ببنية VkImageCreateInfo. بعد ذلك، يستدعي التطبيق vkBindImageMemory2(KHR) باستخدام بنية VkBindImageMemorySwapchainInfoKHR مرتبطة ببنية VkBindImageMemoryInfo. يجب أن يكون imageIndex المحدّد في بنية VkBindImageMemorySwapchainInfoKHR فهرسًا صالحًا لصورة سلسلة التبديل. في الوقت نفسه، توفّر المنصة بنية إضافة تتضمّن معلومات مخزن Gralloc المؤقت المناسب لسلسلة VkBindImageMemoryInfo، كي يعرف برنامج التشغيل مخزن Gralloc المؤقت الذي يجب ربط VkImage به.VkNativeBufferANDROID

الحصول على الصور

يكتسب 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 ويغلقه.

يمكن للعديد من برامج التشغيل تجاهل مَعلمة الصورة، ولكن قد يحتاج البعض إلى إعداد بِنى بيانات من جهة وحدة المعالجة المركزية (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، والتي تتضمّن اختبارات وظيفية لواجهة برمجة التطبيقات للإصدارات 1.0 و1.1 و1.2 و1.3 من Vulkan
  • وحدة 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، وهو التاريخ المرتبط باختبارات dEQP في Vulkan لنظام التشغيل 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، ويتخطّى أي اختبارات dEQP في Vulkan لا يتيح الجهاز إجراؤها وفقًا لعلامة الميزة هذه. ويتم الإبلاغ عن هذه الاختبارات على أنّها اجتازت الاختبار بشكل بسيط.