जिन वर्कलोड के लिए जीपीयू कंप्यूट सबसे सही है उनके लिए, RenderScript स्क्रिप्ट को Vulkan कंप्यूट पर माइग्रेट करने से, आपके ऐप्लिकेशन को जीपीयू हार्डवेयर पर ज़्यादा सीधे तौर पर कंट्रोल करने की सुविधा मिलती है. इससे, अन्य एपीआई की तुलना में बेहतर परफ़ॉर्मेंस मिल सकती है.
यहां खास जानकारी दी गई है, ताकि आपको RenderScript स्क्रिप्ट को बदलने के लिए, Vulkan कंप्यूट स्हेडर का इस्तेमाल करने में मदद मिल सके.
Vulkan को शुरू करना
Kotlin या Java में RenderScript कॉन्टेक्स्ट ऑब्जेक्ट बनाने के बजाय, NDK का इस्तेमाल करके Vulkan कॉन्टेक्स्ट बनाने के लिए, यहां दिया गया तरीका अपनाएं.
Vulkan इंस्टेंस बनाएं.
कोई ऐसा Vulkan फ़िज़िकल डिवाइस चुनें जो कंप्यूट लाइन के साथ काम करता हो.
Vulkan लॉजिकल डिवाइस बनाएं और कंप्यूट क्वे्यू पाएं.
इसके अलावा, Vulkan ऐप्लिकेशन के डेवलपमेंट को तेज़ करने के लिए, Android पर Vulkan की पुष्टि करने वाली लेयर को सेट अप किया जा सकता है.
सैंपल ऐप्लिकेशन में, VulkanContext.h
में Vulkan कॉन्टेक्स्ट को शुरू करने का तरीका बताया गया है.
ज़्यादा जानने के लिए, Vulkan स्पेसिफ़िकेशन के शुरुआत और डिवाइस और कतारें सेक्शन देखें.
Vulkan ऐलोकेशन
RenderScript एलोकेशन को Vulkan स्टोरेज इमेज या Vulkan स्टोरेज बफ़र में माइग्रेट किया जा सकता है. रीड-ओनली इमेज की बेहतर परफ़ॉर्मेंस के लिए, फ़ेच ऑपरेशन के साथ सैंपल की गई इमेज का इस्तेमाल करें. इसे कॉम्बाइन की गई इमेज सैंपलर के तौर पर या अलग-अलग सैंपलर और सैंपल की गई इमेज बाइंडिंग के साथ इस्तेमाल करें.
Vulkan संसाधन, Vulkan में ही असाइन किए जाते हैं. Android के अन्य कॉम्पोनेंट के साथ इंटरैक्ट करते समय, मेमोरी कॉपी करने से जुड़ी समस्या से बचने के लिए, Vulkan में Android AHardwareBuffer
को इंपोर्ट करने के लिए, VK_ANDROID_external_memory_android_hardware_buffer
एक्सटेंशन का इस्तेमाल करें. यह एक्सटेंशन, Vulkan
1.1 के साथ काम करने वाले सभी Android डिवाइसों पर उपलब्ध है. ज़्यादा जानकारी के लिए, FEATURE_VULKAN_HARDWARE_VERSION
देखें.
सैंपल ऐप्लिकेशन में, VulkanResources.h
में Vulkan रिसॉर्स बनाने का तरीका बताया गया है.
ज़्यादा जानने के लिए, Vulkan स्पेसिफ़िकेशन के रिसॉर्स बनाने
और रिसॉर्स डिस्क्रिप्टर
सेक्शन देखें.
Vulkan कंप्यूट शेडर में बदलना
आपकी RenderScript स्क्रिप्ट को Vulkan कंप्यूट शेडर में बदलना होगा. आपको रेंडरस्क्रिप्ट ग्लोबल के इस्तेमाल के आधार पर, अपने कोड में बदलाव भी करना पड़ सकता है.
Vulkan कंप्यूट शेडर लिखना
आम तौर पर, Vulkan कंप्यूट शेडर को OpenGL शेडिंग लैंग्वेज (GLSL) में लिखा जाता है. इसके बाद, इसे स्टैंडर्ड पोर्टेबल इंटरमीडिएट रिप्रज़ेंटेशन-V (SPIR-V) फ़ॉर्मैट में कंपाइल किया जाता है.
अपने ऐप्लिकेशन में शेडर इंटिग्रेट करने के बारे में ज़्यादा जानकारी और निर्देश पाने के लिए, Android पर Vulkan शेडर कंपाइलर देखें.
स्क्रिप्ट के ग्लोबल वैरिएबल में बदलाव करना
स्क्रिप्ट के ग्लोबल वैरिएबल की विशेषताओं के आधार पर, हमारा सुझाव है कि ग्लोबल वैरिएबल के लिए, स्पेशलाइज़ेशन कॉन्स्टेंट, पुश कॉन्स्टेंट या यूनिफ़ॉर्म बफ़र ऑब्जेक्ट का इस्तेमाल करें. ऐसा उन ग्लोबल वैरिएबल के लिए करें जिनमें शेडर में बदलाव नहीं किया जाता:
- स्पेशलाइज़ेशन कॉन्स्टेंट: इसका सुझाव उन स्क्रिप्ट ग्लोबल के लिए दिया जाता है जो आम तौर पर, कोर को शुरू करने के सभी तरीकों के लिए एक जैसे होते हैं. विशेषज्ञता के कॉन्स्टेंट की वैल्यू बदलने के लिए, आपको कंप्यूट पाइपलाइन को फिर से बनाना होगा.
- पॉश कॉन्स्टेंट:
इसका सुझाव, अक्सर बदले जाने वाले स्क्रिप्ट ग्लोबल के लिए दिया जाता है. इनका साइज़,
maxPushConstantsSize
से कम होना चाहिए (कम से कम 128 बाइट). - यूनिफ़ॉर्म बफ़र: इसका सुझाव, अक्सर बदलने वाली स्क्रिप्ट के उन ग्लोबल के लिए दिया जाता है जिनका साइज़, पुश कॉन्स्टेंट की सीमा से ज़्यादा होता है.
शेडर में बदले गए ग्लोबल वैरिएबल के लिए, Vulkan स्टोरेज इमेज या Vulkan स्टोरेज बफ़र में से किसी एक का इस्तेमाल किया जा सकता है.
कैलकुलेशन
जीपीयू आपके कंप्यूट शेडर को लागू कर सके, इसके लिए आपको Vulkan कंप्यूट पाइपलाइन बनानी होगी.
Vulkan कंप्यूट पाइपलाइन बनाना
सैंपल ऐप्लिकेशन में मौजूद ComputePipeline.h
फ़ाइल में, Vulkan कंप्यूट पाइपलाइन बनाने का तरीका बताया गया है.
Vulkan में कंपाइल किए गए SPIR-V शेडर का इस्तेमाल करने के लिए, Vulkan कंप्यूट पाइपलाइन को इस तरह बनाएं:
- कंपाइल किए गए SPIR-V शेडर की मदद से शेडर मॉड्यूल बनाएं.
- संसाधन बाइंडिंग की जानकारी देने वाला डिस्क्रिप्टर सेट लेआउट बनाएं. ज़्यादा जानकारी के लिए, बंटवारे देखें.
- डिस्क्रिप्टर सेट लेआउट से डिस्क्रिप्टर सेट बनाएं.
- डिस्क्रिप्टर सेट लेआउट से, पाइपलाइन लेआउट बनाएं.
- शेडर मॉड्यूल और पाइपलाइन लेआउट की मदद से, कंप्यूट पाइपलाइन बनाएं.
ज़्यादा जानकारी के लिए, Vulkan स्पेसिफ़िकेशन में कंप्यूट पाइपलाइन सेक्शन देखें.
कैलकुलेशन शुरू करना
कंप्यूट पाइपलाइन की मदद से कैलकुलेशन शुरू करने के लिए:
- Vulkan संसाधनों के साथ डिस्क्रिप्टर सेट को अपडेट करें.
- Vulkan कमांड बफ़र बनाएं और ये निर्देश रिकॉर्ड करें:
- पाइपलाइन और डिस्क्रिप्टर सेट को बांधें.
- कंप्यूट वर्कग्रुप डिस्पैच करें.
- कमांड बफ़र को कंप्यूट लाइन में सबमिट करें.
- सूची में इंतज़ार करें या सिंक फ़ेंस को वैकल्पिक तौर पर दिखाएं.
एक से ज़्यादा कर्नेल को एक साथ जोड़ने के लिए, उदाहरण के लिए, ScriptGroup
का इस्तेमाल करके कोड माइग्रेट करने के लिए, उन्हें एक ही कमांड बफ़र में रिकॉर्ड करें और मेमोरी बैरियर के साथ सिंक करें.
सैंपल ऐप्लिकेशन में, दो कंप्यूट टास्क दिखाए गए हैं:
- ह्यू रोटेशन: एक कंप्यूट शेडर वाला आसान कंप्यूट टास्क. कोड सैंपल के लिए,
ImageProcessor::rotateHue
देखें. - धुंधला करना: यह एक ज़्यादा मुश्किल कंप्यूट टास्क है, जो दो कंप्यूट शेडर को क्रम से चलाता है. कोड सैंपल के लिए
ImageProcessor::blur
देखें.
कमांड बफ़र या मेमोरी बैरियर के बारे में ज़्यादा जानने के लिए, Vulkan स्पेसिफ़िकेशन में कमांड बफ़र और मेमोरी बैरियर सेक्शन देखें.