تنفيذ Vulkan

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

لتنفيذ Vulkan بنجاح، يجب أن يشتمل الجهاز على ما يلي:

  • أداة تحميل Vulkan المقدَّمة من Android
  • يشير ذلك المصطلح إلى برنامج تشغيل Vulkan يتم توفيره من خلال منظومة على الرقاقة (SoC) مثل وحدات معالجة الرسومات الداخلية (GPU) التي توفّر وحدات معالجة الرسومات (GPU). لتنفيذ Vulkan API: لدعم وظائف Vulkan، يحتاج الجهاز إلى أجهزة وحدة معالجة رسومات متوافقة مع Vulkan وبرامج التشغيل المرتبطة بها. وحدة معالجة الرسومات أن يتوافق مع الإصدار 3.1 من GLES والإصدارات الأحدث استشِر مورّد المنظومة على الرقاقة (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 الأساسية ونقاط دخول الإضافات المطلوبة بواسطة Android CDD، والعديد من الإضافات الاختيارية الإضافية. نافذة يتم تصدير إضافات تكامل النظام (WSI) بواسطة أداة التحميل وبشكل أساسي تنفيذها في برنامج التحميل بدلاً من تنفيذها في برنامج التشغيل. كما يدعم برنامج التحميل مع تعداد الطبقات وتحميلها التي يمكن أن تكشف عن المزيد من الإضافات وتتقاطع مع الأساسية في طريقها إلى برنامج التشغيل.

يتضمن NDK مكتبة بديلة libvulkan.so المرتبطة. تصدر المكتبة نفس الرموز مثل برنامج التحميل. تطلب التطبيقات الوظائف تم تصديره من مكتبة libvulkan.so الحقيقية إلى دخول وظائف الترامبولين في الحمولة، والذي يتم نقله إلى طبقة أو برنامج التشغيل بناءً على الوسيطة الأولى. vkGet*ProcAddr() يقوم بإرجاع مؤشرات الدالة التي تنقل منصات الترامبولين إليها (أي فإنها تستدعي مباشرة رمز واجهة برمجة التطبيقات الأساسية). يشير استدعاء الدالة من خلال الدالة أكثر كفاءة، بدلاً من الرموز التي يتم تصديرها، حيث ويتخطى الترامبولين ويرسلها.

تعداد برامج التشغيل والتحميل

عند إنشاء صورة النظام، يتوقع 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 والإصدارات الأحدث، تم استخدام مشتق Vulkan hw_module_t تتضمن هذه العلامة بنية hw_module_t واحدة، يتم دعم برنامج تشغيل واحد فقط والسلسلة الثابتة تم تمرير HWVULKAN_DEVICE_0 إلى open().

يتجاوب مشتق Vulkan hw_device_t مع قيمة واحدة لبرنامج التشغيل الذي يمكن أن يدعم أجهزة مادية متعددة. تشير رسالة الأشكال البيانية يمكن توسيع بنية hw_device_t لتصديرها vkGetGlobalExtensionProperties() وvkCreateInstance() و vkGetInstanceProcAddr(). ويمكن للقائم بالتحميل العثور على جميع VkInstance() وVkPhysicalDevice() و دوال vkGetDeviceProcAddr() عن طريق استدعاء بنية hw_device_t vkGetInstanceProcAddr().

اكتشاف الطبقات وتحميلها

يدعم برنامج تحميل Vulkan تعداد الطبقات وتحميلها التي يمكن أن تعرض الإضافات الإضافية واعتراض طلبات البيانات من واجهة برمجة التطبيقات الأساسية في طريقها إلى السائق. لا يشتمل Android على طبقات على صورة النظام. وَلَكِنْ قد تتضمن التطبيقات طبقات في حزمة APK

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

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

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

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

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

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

إصدارات وإمكانات Vulkan API

يسرد الجدول التالي إصدارات Vulkan API لعدة إصدارات من Android.
إصدار Android إصدار Vulkan
Android 13 Vulkan 1.3
الإصدار 9 من نظام التشغيل Android Vulkan 1.1
الإصدار 7 من نظام التشغيل Android Vulkan 1.0

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

يعتمد Vulkan 1.3 على عدد من الإضافات الاختيارية سابقًا في وظائف Vulkan الأساسية. ويتم تضمين الكثير من هذه الوظائف بغرض زيادة التحكم والدقة في واجهة برمجة Vulkan. لم تعُد مثيلات بطاقات العرض ذات بطاقة واحدة مطلوبة لعرض كائنات التمرير أو المخزن المؤقت للإطارات. ويمكن تقليل العدد الإجمالي لكائنات حالة المسار، إصلاح المزامنة داخل واجهة برمجة التطبيقات. Vulkan 1.3 له نفس متطلبات الأجهزة مثل Vulkan 1.2 و1.1 و1.0 مع معظم عمليات التنفيذ في برنامج تشغيل الرسومات الخاص بمنظومة SoC، وليس في إطار العمل.

في ما يلي أهم ميزات Vulkan 1.3 لنظام التشغيل Android:

  • إتاحة مثيلات بطاقات العرض بمرّة واحدة
  • الدعم للإنهاء الفوري لاستدعاء أداة التظليل
  • دقّة أكبر في إنشاء المسارات ومشاركتها والتحكّم فيها

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

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

يضيف Vulkan 1.2 عددًا من الميزات والإضافات التي تبسِّط عرض واجهة برمجة التطبيقات. وتشمل هذه المعلومات ما يلي: طراز ذاكرة موحد ومعلومات إضافية يمكن الاستعلام عنها من برنامج تشغيل الجهاز. Vulkan 1.2 له نفس متطلبات الأجهزة مثل Vulkan 1.0 و1.1؛ جميع تطبيقها في برنامج تشغيل الرسومات الخاص بمنظومة المنظومة على الرقاقة (SoC)، وليس في إطار العمل.

أهم ميزة في الإصدار 1.2 من Vulkan لنظام التشغيل Android هي توفير مساحة تخزين على 8 بت.

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

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

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

في ما يلي أهم ميزات Vulkan 1.1 لنظام التشغيل Android:

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

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

اختيار دعم Vulkan

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

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

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

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

دعم إصدار Vulkan

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

  1. إضافة برنامج تشغيل Vulkan يتوافق مع إصدار Vulkan محلّ الاهتمام (يجب أن يكون هذا الإصدار من إصدار Vulkan) 1.3 أو 1.1 أو 1.0) إلى جانب المتطلبات الإضافية لقرص الحِزمة إصدار Android. بدلاً من ذلك، يمكنك تحديث برنامج تشغيل Vulkan الحالي برقم إصدار Vulkan أقل.
  2. بالنسبة إلى Vulkan 1.3 أو 1.1، تأكَّد من إرجاع ميزة النظام التي يعرضها مدير الحِزم true لإصدار vulkan الصحيح.
    • بالنسبة إلى Vulkan 1.3، تعد هذه الميزة PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • بالنسبة إلى Vulkan 1.1، تعد هذه الميزة PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    سيعرض مدير الحزمة true لبرنامج Vulkan 1.3 وVulkan 1.1 بإضافة قاعدة. كما هو موضح على النحو التالي، إلى ملف device.mk مناسب.
    • أضف ما يلي إلى Vulkan 1.3:
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
      
    • أضف ما يلي إلى Vulkan 1.1:
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
      

الملف الشخصي الأساسي على Android (ABP)

ننصح جميع أجهزة Android بالتوافق مع أحدث ملف شخصي للإصدار Android Baseline 2022 وفقًا للمواصفات التالية: الموضحة في دليل الملف الشخصي في Android Baseline

على أي جهاز يعمل بنظام التشغيل Android 14 أو الإصدارات الأحدث وواجهة Vulkan API، يجب: تلبية جميع الوظائف المحددة في الملف الشخصي لإصدار Android Baseline 2021 القائمة الكاملة بالوظائف المطلوبة هي في ملف Vulkan الشخصي json، إلا أنّ هناك مجموعة فرعية رئيسية من القيم تشمل الوظائف ما يلي:

  • الزخارف المضغوطة من خلال 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 المطلوبة للتنسيق واستخدامها. يتم دمج علامات الاستخدام التي يعرضها برنامج التشغيل مع معدّل الاستخدام. علامات طلبها مستهلك نظام التبديل عند تخصيص الموارد الاحتياطية.

يطلب الإصدار 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

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

وفي Android 8.0 والإصدارات الأحدث، يوفر النظام الأساسي بنية الإضافة "VkSwapchainImageCreateInfoKHR" في تم توفير سلسلة VkImageCreateInfo لـ "vkCreateImage" عندما تكون هناك حاجة إلى علامات استخدام صورة سلسلة التبديل لسلسلة التبديل. تحتوي بنية الإضافة على علامات استخدام صورة سلسلة التبديل:

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 على ملكية صورة لسلسلة التبديل. وتستورد سياجًا أصليًا يتم إرسال إشارة إليه خارجيًا إلى كلٍ من كائن 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 لتقليل وقت الاستجابة. وفي الإصدار 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

جهاز متوافق مع Android 11 أو الإصدارات الأحدث ويتوافق مع 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 إذا كانت علامة الميزة بهذه القيمة على الأقل، يدّعي الجهاز اجتياز جميع اختبارات Vulkan dEQP على نظام Android 10.

تتوافق القيمة 0x07E40301 مع التاريخ 2020-03-01، وهو التاريخ المرتبط باختبارات Vulkan dEQP لنظام Android 11. إذا كانت الميزة هذه القيمة على الأقل، يدعي الجهاز أنه يجتاز كل معايير اختبارات dEQP من Vulkan.

تتوافق القيمة 0x07E60301 مع التاريخ 01-03-2022، وهو التاريخ المرتبط باختبارات Vulkan dEQP الإصدار 13 من نظام التشغيل Android إذا كانت علامة الميزة بهذه القيمة على الأقل، يدّعي الجهاز أنّه يحيل جميع بيانات Vulkan Android 13 اختبارات dEQP.

هو جهاز يكشف عن علامة ميزة معيّنة (أي 0x07E30301 و0x07E40301 و0x07E60301) يدعي أنه يجتاز جميع اختبارات dEQP من Android Vulkan لعلامة الميزة هذه (نظام التشغيل Android 10، Android 11 وAndroid 13 على التوالي). هذا الجهاز قد تجتاز اختبارات Vulkan dEQP من إصدار Android لاحق.

ويشكّل Vulkan dEQP جزءًا من مجموعة أدوات Android CTS. من نظام Android 11، يُعد معدّو اختبار dEQP أحد مكوّنات CTS على دراية بـ android.software.vulkan.deqp.level وتتخطى أي اختبارات Vulkan dEQP وفقًا لذلك علامة الميزة - لا يدّعي الجهاز توافقه. مثل هذه الاختبارات تم الإبلاغ عنه على أنه يمر تافهًا.