Vulkan को लागू करना

Vulkan के सिर पर काफ़ी कम खर्च होता है, बेहतर परफ़ॉर्मेंस वाले 3D के लिए क्रॉस-प्लैटफ़ॉर्म एपीआई ग्राफ़िक्स. OpenGL ES (GLES) की तरह, Vulkan, अच्छी क्वालिटी वाले ऐप्लिकेशन में रीयल-टाइम ग्राफ़िक की सुविधा. Vulkan का इस्तेमाल करने के पीछे, सीपीयू का कम इस्तेमाल होता है ओवरहेड और SPIR-V बाइनरी इंटरमीडिएट भाषा के लिए समर्थन.

Vulkan को लागू करने के लिए, डिवाइस में ये चीज़ें शामिल होनी चाहिए:

  • Android की ओर से उपलब्ध कराया गया Vulkan लोडर.
  • जीपीयू आईएचवी जैसे SoC से मिला Vulkan ड्राइवर, लागू करता है: Vulkan API. Vulkan के काम करने के लिए, Android इस डिवाइस के लिए Vulkan-सुविधा वाला जीपीयू हार्डवेयर और इससे जुड़े ड्राइवर की ज़रूरत है. जीपीयू इसे जीएलईएस 3.1 और इसके बाद के वर्शन के साथ भी काम करना चाहिए. अपने SoC वेंडर से सलाह लें, ताकि ड्राइवर की मदद के लिए अनुरोध करें.

अगर किसी डिवाइस में Vulkan ड्राइवर है, तो डिवाइस को यह जानकारी देनी होगी FEATURE_VULKAN_HARDWARE_LEVEL और FEATURE_VULKAN_HARDWARE_VERSION सिस्टम की सुविधाओं वाले वर्शन डिवाइस की क्षमताओं को सही तरीके से दिखाता है. इससे यह पक्का करने में मदद मिलती है कि डिवाइस इसके अनुपालन में है कंपैटबिलिटी डेफ़िनिशन दस्तावेज़ (सीडीडी).

Vulkan लोडर

Vulkan लोडर platform/frameworks/native/vulkan मुख्य इंटरफ़ेस, जो Vulkan ऐप्लिकेशन और डिवाइस के Vulkan ड्राइवर के बीच दिखता है. द वल्कन लोडर /system/lib[64]/libvulkan.so पर इंस्टॉल किया गया. लोडर इसमें Vulkan API के मुख्य एंट्री पॉइंट मौजूद हैं, जो एक्सटेंशन के एंट्री पॉइंट हैं और कई अतिरिक्त वैकल्पिक एक्सटेंशन भी मिलेंगे. विंडो सिस्टम इंटिग्रेशन (डब्ल्यूएसआई) एक्सटेंशन, लोडर से एक्सपोर्ट किए जाते हैं. मुख्य रूप से, ये एक्सटेंशन, लोडर से एक्सपोर्ट किए जाते हैं ड्राइवर के बजाय लोडर में लागू किया जाता है. लोडर भी इनका इस्तेमाल करता है उन लेयर की गिनती करना और उन्हें लोड करना जो अतिरिक्त एक्सटेंशन और इंटरसेप्ट को ज़ाहिर कर सकती हैं कोर एपीआई कॉल को ड्राइवर तक पहुंचाने के लिए.

एनडीके में इसके लिए एक स्टब libvulkan.so लाइब्रेरी है लिंक करना. लाइब्रेरी से, लोडर की तरह ही चिह्न एक्सपोर्ट किए जाते हैं. ऐप्लिकेशन, फ़ंक्शन को कॉल करते हैं रीयल libvulkan.so लाइब्रेरी से इसमें एक्सपोर्ट किया गया लोडर में ट्रैंपोलिन फलन डालें, जो लेयर या ड्राइवर को हाइलाइट करना चाहिए. vkGet*ProcAddr() कॉल, फ़ंक्शन पॉइंटर दिखाता है जिससे ट्रैंपोलीन, डिस्पैच करती है (यानी, यह सीधे कोर एपीआई कोड में कॉल करता है). फ़ंक्शन के ज़रिए कॉल करना एक्सपोर्ट किए गए सिंबल की जगह पॉइंटर का इस्तेमाल करना ज़्यादा कारगर है. ट्रैंपोलिन को स्किप करता है और डिस्पैच करता है.

ड्राइवर की जानकारी डालना और लोड करना

सिस्टम की इमेज बनने के बाद, Android चाहता है कि सिस्टम को यह जानकारी मिले कि किस जीपीयू का इस्तेमाल किया गया है उपलब्ध हैं. लोडर, नीचे दी गई एचएएल तकनीक का इस्तेमाल करता है hardware.h अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ड्राइवर को खोजने और लोड करने के लिए. 32-बिट और 64-बिट Vulkan ड्राइवर के लिए सुझाए गए पाथ:

/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 इस्तेमाल करने की प्रोडक्शन पर, नॉन-डीबग की जा सकने वाली प्रोसेस में बाहरी कोड को लोड करना (बिना रूट किया हुआ) इसके अलावा, न ही बाहरी कोड को इस प्रोसेस की जांच या कंट्रोल करने की अनुमति देता है मेमोरी, स्थिति वगैरह. इसमें कोर डंप और एपीआई को सेव करने पर पाबंदी भी शामिल है ट्रेस ट्रैक कर सकता है. केवल परतें इसके भाग के रूप में वितरित की गईं प्रोडक्शन डिवाइसों पर, डीबग करने लायक ऐप्लिकेशन चालू होते हैं. ड्राइवर को ये ऐप्लिकेशन उपलब्ध नहीं कराने चाहिए जो इन नीतियों का उल्लंघन करती हैं.

लेयर के लिए इस्तेमाल के उदाहरणों में ये शामिल हैं:

  • डेवलपमेंट-टाइम लेयर — पुष्टि ट्रेसिंग/प्रोफ़ाइलिंग/डीबगिंग टूल के लिए लेयर और शिम इंस्टॉल नहीं किए जाने चाहिए प्रोडक्शन डिवाइसों के सिस्टम की इमेज. के लिए सत्यापन परतें और शिम ट्रेसिंग/प्रोफ़ाइलिंग/डीबग करने वाले टूल को सिस्टम के बिना अपडेट किया जा सकता है इमेज. ऐसे डेवलपर जो इसे इस्तेमाल करना चाहते हैं में से ये लेयर, डेवलपमेंट के दौरान ऐप्लिकेशन पैकेज में बदलाव कर सकती हैं, उदाहरण के लिए, ऐसा करने के लिए, उन्हें अपनी लोकल लाइब्रेरी डायरेक्ट्री में कोई फ़ाइल जोड़ें. आईएचवी और ओईएम के इंजीनियर जो जिन ऐप्लिकेशन में बदलाव नहीं किया जा सकता उनकी शिपिंग में गड़बड़ी का पता लगाना है सिस्टम इमेज के नॉन-प्रोडक्शन (रूट किए हुए) बिल्ड का ऐक्सेस देगा. हालांकि, ऐसा तब ही होगा, जब वे ऐप्लिकेशन डीबग किए जा सकते हैं. ज़्यादा जानकारी के लिए, Android पर Vulkan की पुष्टि करने वाली लेयर देखें.
  • यूटिलिटी लेयर — ये लेयर, खोज के नतीजों में दिखती हैं एक्सटेंशन, जैसे कि एक लेयर जो डिवाइस की मेमोरी के लिए मेमोरी मैनेजर लागू करता है. डेवलपर अपने लेयर और वर्शन की लेयर और वर्शन चुनते हैं. ऐप्लिकेशन; एक ही लेयर का इस्तेमाल करने वाले अलग-अलग ऐप्लिकेशन, अब भी इसी लेयर का इस्तेमाल कर सकते हैं अलग-अलग वर्शन हैं. डेवलपर यह चुनते हैं कि इनमें से कौनसी लेयर को अपने ऐप्लिकेशन पैकेज.
  • इंजेक्टेड (इंप्लिसिट) लेयर — इसमें लेयर जैसी लेयर शामिल हैं उपयोगकर्ता के दिए गए फ़्रेम रेट, सोशल नेटवर्क, और गेम लॉन्चर ओवरले को या ऐप्लिकेशन की जानकारी या सहमति के बिना कोई दूसरा ऐप्लिकेशन इस्तेमाल करना. ये Android की सुरक्षा नीतियों का उल्लंघन करती हैं और समर्थित नहीं हैं.

डीबग न किए जा सकने वाले ऐप्लिकेशन के लिए, लोडर सिर्फ़ लेयर को खोजता है ऐप्लिकेशन की नेटिव लाइब्रेरी डायरेक्ट्री और नाम वाली किसी लाइब्रेरी को लोड करने की कोशिश करता है किसी खास पैटर्न से मैच करती हो (जैसे, libVKLayer_foo.so).

डीबग करने लायक ऐप्लिकेशन के लिए, लोडर /data/local/debug/vulkan और मिलती-जुलती किसी लाइब्रेरी को लोड करने की कोशिश करता है कोई खास पैटर्न चुनें.

Android, लेयर को पोर्ट करने की सुविधा देता है. ऐसा करने के लिए, लेयर के बीच बिल्ड-एनवायरमेंट में बदलाव करना होता है Android और अन्य प्लैटफ़ॉर्म पर उपलब्ध है. लेयर और लोडर, देखें Vulkan लोडर इंटरफ़ेस का आर्किटेक्चर. ख्रोनोस का रखरखाव किया गया सत्यापन परतें इसमें होस्ट की जाती हैं Vulkan की पुष्टि करने वाली लेयर.

Vulkan API के वर्शन और सुविधाएं

नीचे दी गई टेबल में, Android के कई रिलीज़ के लिए, Vulkan API के वर्शन की सूची दी गई है.
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 के लिए हार्डवेयर की ज़रूरतें वही हैं जो Vulkan 1.2, 1.1, और 1.0 के साथ, SoC के खास ग्राफ़िक ड्राइवर में ज़्यादातर लागू किए गए हैं. में ज़रूरी शर्तें पूरी करते हैं.

Android के लिए, Vulkan 1.3 की सबसे ज़रूरी सुविधाएं ये हैं:

  • एक पास रेंडर होने के इंस्टेंस के लिए सहायता
  • शेडर को शुरू करने के अनुरोध को तुरंत खत्म करने से जुड़ी सहायता
  • पाइपलाइन बनाने, उसे शेयर करने, और कंट्रोल करने के बारे में बेहतर जानकारी

Vulkan 1.3 में कई छोटी-छोटी सुविधाएं और एपीआई की उपयोगिता को बेहतर बनाया गया है. सभी बदलाव मामूली बदलाव 1.3 के साथ मुख्य Vulkan API के साथ की गई फ़ाइलें यहां देखी जा सकती हैं मुख्य संशोधन (Vulkan 1.3).

Vulkan 1.2 के काम करने के तरीके के बारे में खास जानकारी

Vulkan 1.2 में ऐसी कई सुविधाएं और एक्सटेंशन जोड़े गए हैं जो एपीआई सरफ़ेस को आसान बनाते हैं. इसमें ये शामिल हैं एक एकीकृत मेमोरी मॉडल और ऐसी अतिरिक्त जानकारी जिसके लिए डिवाइस ड्राइवर से क्वेरी की जा सकती है. Vulkan 1.2 की हार्डवेयर की ज़रूरतें, Vulkan 1.0 और 1.1 की तरह ही हैं; सभी लागू करने की प्रोसेस SoC के हिसाब से बने ग्राफ़िक्स ड्राइवर में होती है, न कि फ़्रेमवर्क में.

Android के लिए, Vulkan 1.2 की सबसे अहम सुविधा 8-बिट स्टोरेज है.

Vulkan 1.2 में कई छोटी-छोटी सुविधाएं और एपीआई की उपयोगिता को बेहतर बनाया गया है. सभी बदलाव मामूली बदलाव 1.2 के साथ मुख्य Vulkan API के साथ की गई फ़ाइलें यहां देखी जा सकती हैं मुख्य संशोधन (Vulkan 1.2).

Vulkan 1.1 के काम करने के तरीके के बारे में खास जानकारी

Vulkan 1.1 में मेमोरी/सिंक्रोनाइज़ेशन इंटरऑप की सुविधा शामिल है. OEM को डिवाइसों पर Vulkan 1.1 के साथ काम करने की अनुमति देता है. इसके अलावा, मेमोरी/सिंक्रोनाइज़ेशन इंटरऑप से डेवलपर को अनुमति मिलती है और देखें कि क्या Vulkan 1.1 किसी डिवाइस पर काम करता है. साथ ही, उस डिवाइस को उसी समय. Vulkan 1.1 की हार्डवेयर की ज़रूरतें, Vulkan 1.0 की तरह ही हैं. हालांकि, ज़्यादातर मामलों में लागू करने की प्रोसेस एसओसी के हिसाब से बने ग्राफ़िक ड्राइवर में होती है, फ़्रेमवर्क में नहीं.

Android के लिए, Vulkan 1.1 की सबसे ज़रूरी सुविधाएं ये हैं:

  • मेमोरी बफ़र और सिंक करने की सुविधा को इंपोर्ट और एक्सपोर्ट करने के लिए सहायता Vulkan के बाहर से मौजूद ऑब्जेक्ट (कैमरा, कोडेक, और जीएलईएस के साथ इंटरऑप के लिए)
  • YCbCr फ़ॉर्मैट के लिए सहायता

Vulkan 1.1 में कई छोटी-छोटी सुविधाएं और एपीआई की उपयोगिता को बेहतर बनाया गया है. सभी बदलाव मामूली बदलाव 1.1 के साथ मुख्य Vulkan API के साथ की गई फ़ाइलें यहां देखी जा सकती हैं मुख्य संशोधन (Vulkan 1.1).

Vulkan सहायता टीम चुनें

Android डिवाइसों पर, Vulkan की सबसे ऐडवांस सुविधाओं का इस्तेमाल किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि वे 64-बिट एबीआई के साथ काम करते हैं और इनमें कम मेमोरी नहीं होती.

Android 13 और इसके बाद के वर्शन वाले डिवाइसों पर, Vulkan 1.3 काम करना चाहिए.

Android 10 वाले डिवाइसों पर Vulkan 1.1 काम करता है.

अन्य डिवाइसों पर, Vulkan 1.3, 1.2, और 1.1 के साथ काम करने का विकल्प मौजूद है.

Vulkan वर्शन के साथ काम करता है

Android डिवाइस, Vulkan वर्शन के साथ तब काम करता है, जब ये शर्तें पूरी होती हैं:

  1. Android वर्शन की सीडीडी की ज़रूरी शर्तों के साथ-साथ, अपनी पसंद के Vulkan वर्शन (यह Vulkan वर्शन 1.3, 1.1 या 1.0 में से कोई एक होना चाहिए) के साथ काम करने वाला Vulkan ड्राइवर जोड़ें. इसके अलावा, Vulkan वर्शन के पुराने वर्शन वाले मौजूदा Vulkan ड्राइवर को भी अपडेट किया जा सकता है.
  2. Vulkan 1.3 या 1.1 के लिए, पक्का करें कि पैकेज मैनेजर से मिलने वाली, सिस्टम की सुविधा वापस आ गई हो सही vulkan वर्शन के लिए true.
    • Vulkan 1.3 के लिए यह सुविधा है PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000).
    • Vulkan 1.1 के लिए, यह सुविधा PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000).
    पैकेज मैनेजर, एक नियम जोड़कर Vulkan 1.3 और Vulkan 1.1 के लिए, true दिखाएगा. को उचित 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 बेसलाइन प्रोफ़ाइल (एबीपी)

हम सभी Android डिवाइसों को Android बेसलाइन 2022 प्रोफ़ाइल का पालन करने के लिए बढ़ावा देते हैं, क्योंकि इसमें बताया गया है Android बेसलाइन प्रोफ़ाइल गाइड.

Android 14 या उसके बाद के वर्शन और Vulkan API के साथ काम करने वाले सभी डिवाइसों पर, यह ज़रूरी है कि में बताई गई सभी सुविधाओं को पूरा करता हो Android बेसलाइन 2021 प्रोफ़ाइल. ज़रूरी सुविधाओं की पूरी सूची यह है Vulkan प्रोफ़ाइल json फ़ाइल में बताई गई, लेकिन ज़रूरी का एक मुख्य सबसेट इस तरह के फ़ंक्शन में ये शामिल हैं:

  • ASTC और ETC की मदद से कंप्रेस किए गए टेक्सचर.
  • VK_EXT_swapchain_colorspace तक के लिए वैरिएबल कलरस्पेस.
  • सैंपल शेडिंग और मल्टीसैंपल इंटरपोलेशन sampleRateShading.

विंडो सिस्टम इंटिग्रेशन (डब्ल्यूएसआई)

libvulkan.so में, ड्राइवर इन चीज़ों को लागू करता है विंडो सिस्टम इंटिग्रेशन (डब्ल्यूएसआई) एक्सटेंशन:

  • 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, ड्राइवर से अनुरोध किए गए फ़ॉर्मैट और इमेज के इस्तेमाल का अनुवाद करने के लिए कहता है फ़्लैग करने के लिए इस नंबर का इस्तेमाल करें:

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 इस्तेमाल के फ़्लैग ज़रूरी हैं और इनके इस्तेमाल के बारे में ज़्यादा जानें. ड्राइवर के लौटाए गए इस्तेमाल के फ़्लैग को इस्तेमाल के साथ मिला दिया जाता है बफ़र का बंटवारा करते समय, swapchain उपभोक्ता ने इन फ़्लैग का अनुरोध किया है.

Android 7.x, VkSwapchainImageUsageFlagsANDROID() के पुराने वर्शन को कॉल करता है, vkGetSwapchainGrallocUsageANDROID() नाम दिया गया है. Android 8.0 और उसके बाद के वर्शन अब सेवा में नहीं हैं vkGetSwapchainGrallocUsageANDROID() लेकिन कॉल अब भी आते हैं vkGetSwapchainGrallocUsageANDROID() अगर ड्राइवर ने vkGetSwapchainGrallocUsage2ANDROID() नहीं दिया है:

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

vkGetSwapchainGrallocUsageANDROID() में, स्वैपचेन टेक्नोलॉजी का इस्तेमाल नहीं किया जा सकता फ़्लैग या एक्सटेंडेड Gralloc इस्तेमाल फ़्लैग.

ग्रलोक-बैक्ड इमेज

VkNativeBufferANDROID एक vkCreateImage एक्सटेंशन है Gralloc बफ़र पर आधारित चित्र बनाने के लिए संरचना. VkNativeBufferANDROID है VkImageCreateInfo में vkCreateImage() को दी गई चेन होती है. VkNativeBufferANDROID से vkCreateImage() पर कॉल किए गए vkCreateSwapchainKHR को कॉल करने के दौरान. WSI के लागू होने पर, यह swapchain के लिए अनुरोध किए गए नेटिव बफ़र की संख्या को दिखाता है. इसके बाद, हर एक के लिए 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;

ग्रालोक-बैक्ड इमेज बनाते समय, 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 एक्सटेंशन स्ट्रक्चर है vkCreateImage को VkImageCreateInfo चेन दी गई जब स्वैपचेन के लिए, किसी भी स्वैपचेन इमेज के इस्तेमाल से जुड़े फ़्लैग की ज़रूरत हो. एक्सटेंशन स्ट्रक्चर में, स्वैपचेन इमेज के इस्तेमाल से जुड़े फ़्लैग शामिल होते हैं:

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 के लिए किया जाता है. ऐप्लिकेशन को सबसे पहले कॉल किया जाता है VkImageSwapchainCreateInfoKHR के साथ vkCreateImage VkImageCreateInfo स्ट्रक्चर से जुड़ी हुई है. इसके बाद, ऐप्लिकेशन, vkBindImageMemory2(KHR) को VkBindImageMemorySwapchainInfoKHR संरचना VkBindImageMemoryInfo स्ट्रक्चर. VkBindImageMemorySwapchainInfoKHR स्ट्रक्चर में बताए गए imageIndex का एक मान्य स्वैपचैन इमेज इंडेक्स होना चाहिए. वहीं, यह प्लैटफ़ॉर्म संबंधित VkNativeBufferANDROID एक्सटेंशन स्ट्रक्चर VkBindImageMemoryInfo शृंखला के लिए Gralloc बफ़र जानकारी ड्राइवर जानता है कि VkImage को किस Gralloc बफ़र से बाइंड करना है.

इमेज पाएं

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 में लौटाया गया.

कई ड्राइवर, इमेज पैरामीटर को अनदेखा कर सकते हैं. हालांकि, कुछ को बाहरी इमेज कंज्यूमर के इस्तेमाल के लिए, 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 पर सेट करता है.

पुष्टि करें

OEM, सीटीएस का इस्तेमाल करके यह जांच कर सकते हैं कि उन्होंने Vulkan को लागू किया है या नहीं. इसमें ये चीज़ें शामिल हैं:

  • Khronos Vulkan Conformance Test 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 का मान दिया जा सकता है, जो 01-03-2019 की तारीख से जुड़ा है, जो Android 10 के लिए Vulkan dEQP टेस्ट. अगर फ़ीचर फ़्लैग कम से कम इतना मान है, डिवाइस, Android 10 Vulkan dEQP के सभी टेस्ट को पास करने का दावा करता है.

0x07E40301 वैल्यू, 01-03-2020 की तारीख से मेल खाती है, जो Android 11 के लिए Vulkan dEQP के टेस्ट से जुड़ी तारीख. अगर सुविधा फ़्लैग इस मान का कम से कम एक मान है, तो डिवाइस का दावा है कि यह 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. इस डिवाइस के लिए Android के बाद के किसी वर्शन में, Vulkan dEQP टेस्ट को पास किया जा सकता है.

Vulkan dEQP, Android सीटीएस का हिस्सा है. Android 11 की मदद से, dEQP टेस्ट रनर सीटीएस कॉम्पोनेंट, android.software.vulkan.deqp.level के बारे में जानती है फ़ीचर फ़्लैग शामिल कर सकता है. साथ ही, इस फ़ीचर फ़्लैग - डिवाइस समर्थन का दावा नहीं करता. इस तरह की जांचों में को सामान्य तरीके से पास होने के बारे में बताया गया.