تنفيذ فولكان

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

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

  • محمل Vulkan المقدم من Android.
  • برنامج تشغيل Vulkan، يتم توفيره بواسطة SoCs مثل GPU IHVs، والذي يقوم بتنفيذ Vulkan API . لدعم وظيفة Vulkan، يحتاج جهاز Android إلى جهاز GPU قادر على استخدام Vulkan وبرنامج التشغيل المرتبط. يجب أن تدعم وحدة معالجة الرسومات أيضًا GLES 3.1 والإصدارات الأحدث. استشر بائع SoC الخاص بك لطلب دعم برنامج التشغيل.

إذا كان الجهاز يتضمن برنامج تشغيل Vulkan، فسيحتاج الجهاز إلى الإعلان عن ميزات النظام FEATURE_VULKAN_HARDWARE_LEVEL و FEATURE_VULKAN_HARDWARE_VERSION ، بإصدارات تعكس إمكانيات الجهاز بدقة. يساعد هذا على ضمان توافق الجهاز مع مستند تعريف التوافق (CDD).

محمل فولكان

تعد platform/frameworks/native/vulkan هي الواجهة الأساسية بين تطبيقات Vulkan وبرنامج تشغيل Vulkan الخاص بالجهاز. تم تثبيت مُحمل Vulkan على /system/lib[64]/libvulkan.so . يوفر المُحمل نقاط الدخول الأساسية لـ Vulkan API، ونقاط الدخول للامتدادات المطلوبة بواسطة Android CDD، والعديد من الامتدادات الاختيارية الإضافية. يتم تصدير ملحقات تكامل نظام النافذة (WSI) بواسطة المُحمل ويتم تنفيذها بشكل أساسي في المُحمل بدلاً من برنامج التشغيل. يدعم المُحمل أيضًا تعداد وتحميل الطبقات التي يمكنها الكشف عن امتدادات إضافية واعتراض استدعاءات واجهة برمجة التطبيقات الأساسية في طريقها إلى برنامج التشغيل.

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

تعداد السائق والتحميل

عندما يتم إنشاء صورة النظام، يتوقع 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

في 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() عن طريق استدعاء vkGetInstanceProcAddr() الخاص ببنية hw_device_t .

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

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

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

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

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

بالنسبة للتطبيقات غير القابلة للتصحيح، يبحث المُحمل عن الطبقات فقط في دليل المكتبة الأصلي للتطبيق ويحاول تحميل أي مكتبة باسم يطابق نمطًا معينًا (على سبيل المثال، libVKLayer_foo.so ).

بالنسبة للتطبيقات القابلة للتصحيح، يبحث المُحمل عن الطبقات في /data/local/debug/vulkan ويحاول تحميل أي مكتبة تطابق نمطًا معينًا.

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

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

يسرد الجدول التالي إصدارات Vulkan API للعديد من إصدارات Android.
نسخة أندرويد نسخة فولكان
أندرويد 13 فولكان 1.3
أندرويد 9 فولكان 1.1
أندرويد 7 فولكان 1.0

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

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

أهم مميزات Vulkan 1.3 للأندرويد هي:

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

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

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

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

أهم ميزة Vulkan 1.2 لنظام Android هي دعم سعة تخزين 8 بت.

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

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

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

أهم مميزات Vulkan 1.1 للأندرويد هي:

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

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

اختر دعم فولكان

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

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

يجب أن تدعم الأجهزة التي يتم تشغيلها من خلال Android 10 Vulkan 1.1.

يمكن للأجهزة الأخرى أن تدعم بشكل اختياري Vulkan 1.3 و1.2 و1.1.

دعم نسخة فولكان

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

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

يستدعي Android 7.x إصدارًا سابقًا من VkSwapchainImageUsageFlagsANDROID() ، المسمى vkGetSwapchainGrallocUsageANDROID() . يتجاهل نظام التشغيل Android 8.0 والإصدارات الأحدث vkGetSwapchainGrallocUsageANDROID() ولكنه لا يزال يستدعي vkGetSwapchainGrallocUsageANDROID() إذا لم يتم توفير vkGetSwapchainGrallocUsage2ANDROID() بواسطة برنامج التشغيل:

VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
    VkDevice            device,
    VkFormat            format,
    VkImageUsageFlags   imageUsage,
    int*                grallocUsage
);

لا يدعم vkGetSwapchainGrallocUsageANDROID() إشارات استخدام Swapchain أو إشارات استخدام 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 عندما تكون هناك حاجة إلى أي علامات استخدام لصورة Swapchain لسلسلة المبادلة. تحتوي بنية الامتداد على علامات استخدام صورة Swapchain:

typedef struct {
    VkStructureType                        sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
    const void*                            pNext;

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

في نظام Android 10 والإصدارات الأحدث، يدعم النظام الأساسي VK_KHR_swapchain v70، وبالتالي فإن تطبيق Vulkan قادر على إنشاء VkImage مدعومة بذاكرة المبادلة. يقوم التطبيق أولاً باستدعاء vkCreateImage باستخدام بنية VkImageSwapchainCreateInfoKHR المرتبطة ببنية VkImageCreateInfo . بعد ذلك، يقوم التطبيق باستدعاء vkBindImageMemory2(KHR) باستخدام بنية VkBindImageMemorySwapchainInfoKHR المرتبطة ببنية VkBindImageMemoryInfo . يجب أن يكون imageIndex المحدد في بنية VkBindImageMemorySwapchainInfoKHR فهرس صورة Swapchain صالحًا. وفي الوقت نفسه، يوفر النظام الأساسي بنية امتداد 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 بإعداد صورة سلسلة المبادلة للاستخدام الخارجي، وإنشاء سياج أصلي، وجدولة السياج الأصلي ليتم الإشارة إليه بعد الإشارة إلى إشارات الإدخال:

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 لتقليل زمن الوصول. في Android 9 والإصدارات الأحدث، يعلن برنامج التحميل بشكل مشروط عن امتداد VK_KHR_shared_presentable_image بناءً على استجابة السائق لاستدعاء vkGetPhysicalDeviceProperties2 .

إذا كان برنامج التشغيل لا يدعم Vulkan 1.1 أو ملحق VK_KHR_physical_device_properties2 ، فلن يعلن المُحمل عن دعم الصور المشتركة القابلة للتقديم. بخلاف ذلك، يقوم المُحمل بالاستعلام عن إمكانيات برنامج التشغيل عن طريق استدعاء vkGetPhysicalDeviceProperties2() وتضمين البنية التالية في سلسلة VkPhysicalDeviceProperties2::pNext :

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

إذا كان بإمكان السائق مشاركة ملكية الصورة مع نظام العرض، فإنه يقوم بتعيين عضو sharedImage على VK_TRUE .

تصديق

يمكن لمصنعي المعدات الأصلية اختبار تطبيق Vulkan الخاص بهم باستخدام CTS، والذي يتضمن ما يلي:

  • اختبارات التوافق Khronos Vulkan في وحدة CtsDeqpTestCases ، والتي تتضمن اختبارات API الوظيفية لـ Vulkan 1.0 و1.1 و1.2 و1.3.
  • وحدة CtsGraphicsTestCases ، التي تختبر ما إذا تم تكوين الجهاز بشكل صحيح لإمكانيات Vulkan التي يدعمها.

علم ميزة فولكان

يلزم وجود جهاز يدعم Android 11 أو إصدار أحدث ويدعم Vulkan API لعرض علامة الميزة، android.software.vulkan.deqp.level . قيمة علامة الميزة هذه هي تاريخ، مشفر كقيمة عددية. وهو يحدد التاريخ المرتبط باختبارات Vulkan dEQP التي يدعي الجهاز اجتيازها.

يتم ترميز التاريخ بالصيغة YYYY-MM-DD كعدد صحيح 32 بت كما يلي:

  • بت 0-15 تخزين السنة
  • البتات 16-23 تخزن الشهر
  • بت 24-31 تخزين اليوم

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

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

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

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

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