वल्कन को लागू करना

Vulkan एक कम भूमि के ऊपर, उच्च प्रदर्शन 3 डी ग्राफिक्स के लिए क्रॉस-प्लेटफ़ॉर्म API है। जैसा OpenGL ES (GLES) , Vulkan क्षुधा में उच्च गुणवत्ता, वास्तविक समय ग्राफिक्स बनाने के लिए उपकरण प्रदान करता है। Vulkan का उपयोग कर के लाभ के लिए CPU भूमि के ऊपर और समर्थन में कटौती शामिल SPIR-वी बाइनरी मध्यवर्ती भाषा।

वल्कन को सफलतापूर्वक लागू करने के लिए, एक उपकरण में शामिल होना चाहिए:

  • Android द्वारा प्रदान किया गया वल्कन लोडर।
  • एक Vulkan चालक, इस तरह के GPU IHVs, कि औजार के रूप में SoCs द्वारा प्रदान की Vulkan एपीआई । वल्कन कार्यक्षमता का समर्थन करने के लिए, एंड्रॉइड डिवाइस को वल्कन-सक्षम जीपीयू हार्डवेयर और संबंधित ड्राइवर की आवश्यकता होती है। GPU को GLES 3.1 और उच्चतर का भी समर्थन करना चाहिए। ड्राइवर समर्थन का अनुरोध करने के लिए अपने एसओसी विक्रेता से परामर्श लें।

एक डिवाइस एक Vulkan चालक भी शामिल है, तो डिवाइस की जरूरत है की घोषणा करने के FEATURE_VULKAN_HARDWARE_LEVEL और FEATURE_VULKAN_HARDWARE_VERSION प्रणाली सुविधाओं, संस्करणों को सटीक ढंग से डिवाइस की क्षमताओं को प्रतिबिंबित के साथ। यह सुनिश्चित करना है कि डिवाइस के अनुपालन में है में मदद करता है संगतता परिभाषा दस्तावेज़ (CDD)।

वल्कन लोडर

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

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

चालक गणना और लोडिंग

जब सिस्टम छवि बनाई जाती है, तो एंड्रॉइड सिस्टम को यह जानने की उम्मीद करता है कि कौन से जीपीयू उपलब्ध हैं। लोडर में मौजूदा एचएएल तंत्र का उपयोग करता है hardware.h को खोजने और उनके ड्राइवर लोड करने के लिए। 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

एंड्रॉयड 7.0 और बाद में, Vulkan hw_module_t व्युत्पन्न एक भी लपेटता hw_module_t struct; केवल एक ड्राइवर समर्थित है और निरंतर स्ट्रिंग HWVULKAN_DEVICE_0 को पारित कर दिया है open()

Vulkan hw_device_t एक भी ड्राइवर जो एक से अधिक भौतिक उपकरणों का समर्थन कर सकते करने के लिए व्युत्पन्न मेल खाती है। hw_device_t संरचना निर्यात करने के लिए विस्तार कर सकते हैं vkGetGlobalExtensionProperties() , vkCreateInstance() , और vkGetInstanceProcAddr() काम करता है। लोडर अन्य सभी पा सकते हैं VkInstance() , VkPhysicalDevice() , और vkGetDeviceProcAddr() को फोन करके कार्यों hw_device_t संरचना के vkGetInstanceProcAddr()

परत की खोज और लोडिंग

वल्कन लोडर एन्यूमरेटिंग और लोडिंग लेयर्स का समर्थन करता है जो अतिरिक्त एक्सटेंशन को उजागर कर सकता है और ड्राइवर के रास्ते में कोर एपीआई कॉल को इंटरसेप्ट कर सकता है। Android में सिस्टम छवि पर परतें शामिल नहीं हैं; हालांकि, ऐप्स अपने एपीके में परतें शामिल कर सकते हैं।

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

परतों के लिए उपयोग के मामलों में शामिल हैं:

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

Nondebuggable ऐप के लिए, केवल एप्लिकेशन की देशी पुस्तकालय निर्देशिका और प्रयास में परतों के लिए लोडर खोजें एक खास पैटर्न (उदाहरण के लिए, मिलान एक नाम के साथ किसी भी पुस्तकालय लोड करने के लिए libVKLayer_foo.so )।

डीबग एप्लिकेशन के लिए, में परतों के लिए लोडर खोज /data/local/debug/vulkan और प्रयास किसी भी एक खास पैटर्न मिलान पुस्तकालय लोड करने के लिए।

एंड्रॉइड परतों को एंड्रॉइड और अन्य प्लेटफॉर्म के बीच बिल्ड-एनवायरनमेंट परिवर्तनों के साथ पोर्ट करने में सक्षम बनाता है। परतों और लोडर के बीच इंटरफेस पर जानकारी के लिए, Vulkan लोडर इंटरफेस की वास्तुकला । Khronos से बनाए रखा सत्यापन परतों में होस्ट किए गए हैं Vulkan मान्यता परतें

वल्कन एपीआई संस्करण और क्षमताएं

एंड्रॉइड 9 और उच्चतर वल्कन एपीआई संस्करण 1.1 का समर्थन करते हैं। एंड्रॉइड 7 से एंड्रॉइड 9 वल्कन एपीआई संस्करण 1.0 का समर्थन करते हैं। Vulkan 1.1 एपीआई के बारे में अधिक जानकारी के लिए, Vulkan 1.1 एपीआई कल्पना

वल्कन 1.1 समर्थन सिंहावलोकन

वल्कन 1.1 में मेमोरी/सिंक्रनाइज़ेशन इंटरऑप के लिए समर्थन शामिल है, जो ओईएम को उपकरणों पर वल्कन 1.1 का समर्थन करने में सक्षम बनाता है। इसके अतिरिक्त, मेमोरी/सिंक्रोनाइज़ेशन इंटरऑप डेवलपर्स को यह निर्धारित करने में सक्षम बनाता है कि क्या वल्कन 1.1 डिवाइस पर समर्थित है, और जब यह प्रभावी हो तो इसका प्रभावी ढंग से उपयोग करें। वल्कन 1.1 में वल्कन 1.0 जैसी ही हार्डवेयर आवश्यकताएं हैं, लेकिन अधिकांश कार्यान्वयन एसओसी-विशिष्ट ग्राफिक्स ड्राइवर में है, ढांचे में नहीं।

Android के लिए सबसे महत्वपूर्ण वल्कन 1.1 विशेषताएं हैं:

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

वल्कन 1.1 में कई छोटी विशेषताएं और एपीआई उपयोगिता संवर्द्धन भी शामिल हैं।

वल्कन को लागू करना 1.1

Android उपकरणों को Vulkan 1.1 का समर्थन करना चाहिए यदि वे:

  • Android 10 के साथ लॉन्च करें।
  • 64-बिट एबीआई का समर्थन करें।
  • कम स्मृति नहीं हैं।

अन्य डिवाइस वैकल्पिक रूप से वल्कन 1.1 का समर्थन कर सकते हैं।

वल्कन 1.1 को लागू करने के लिए:

  1. एक Vulkan ड्राइवर कि Vulkan 1.1 प्लस अतिरिक्त Android 1.1 का समर्थन करता है जोड़े CDD आवश्यकताओं , या मौजूदा Vulkan 1.0 ड्राइवर का अद्यतन।
  2. सुनिश्चित करें कि PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000) रिटर्न true में इस तरह के एक उचित करने के लिए निम्नलिखित के रूप में एक नियम जोड़कर device.mk फ़ाइल:
    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
    

विंडो सिस्टम इंटीग्रेशन (WSI)

में libvulkan.so , ड्राइवर औजार निम्नलिखित विंडो सिस्टम इंटीग्रेशन (WSI) एक्सटेंशन:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties , एंड्रॉयड 10 में Vulkan 1.1 के लिए लागू केवल
  • VK_GOOGLE_display_timing , एंड्रॉयड 10 में किसी भी Vulkan संस्करण के लिए लागू किया

VkSurfaceKHR और VkSwapchainKHR वस्तुओं और के सभी क्रियाकलापों को ANativeWindow मंच द्वारा नियंत्रित किया जाता है और ड्राइवरों के संपर्क में नहीं कर रहे हैं। WSI कार्यान्वयन पर निर्भर करता है VK_ANDROID_native_buffer विस्तार है, जो ड्राइवर द्वारा समर्थित होना चाहिए; यह एक्सटेंशन केवल WSI कार्यान्वयन द्वारा उपयोग किया जाता है और ऐप्स के संपर्क में नहीं आता है।

ग्रालोक उपयोग झंडे

वल्कन कार्यान्वयन को कार्यान्वयन-परिभाषित निजी ग्रैलोक उपयोग झंडे के साथ आवंटित करने के लिए स्वैपचैन बफ़र्स की आवश्यकता हो सकती है। स्वैपचैन बनाते समय, एंड्रॉइड ड्राइवर को अनुरोधित प्रारूप और छवि उपयोग झंडे को ग्रैलोक उपयोग झंडे में अनुवाद करने के लिए कहता है:

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 के पिछले संस्करण कॉल VkSwapchainImageUsageFlagsANDROID() , नामित vkGetSwapchainGrallocUsageANDROID() । एंड्रॉयड 8.0 और उच्चतर deprecates vkGetSwapchainGrallocUsageANDROID() , लेकिन अभी भी कॉल vkGetSwapchainGrallocUsageANDROID() यदि vkGetSwapchainGrallocUsage2ANDROID() चालक द्वारा प्रदान नहीं की है:

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

vkGetSwapchainGrallocUsageANDROID() swapchain उपयोग झंडे या विस्तारित Gralloc उपयोग झंडे का समर्थन नहीं करता।

ग्रैलोक-समर्थित छवियां

VkNativeBufferANDROID एक है vkCreateImage एक छवि एक Gralloc बफर द्वारा समर्थित बनाने के लिए विस्तार संरचना। VkNativeBufferANDROID प्रदान की जाती है vkCreateImage() में VkImageCreateInfo संरचना श्रृंखला। पर आने वाले कॉल vkCreateImage() के साथ VkNativeBufferANDROID करने के लिए पहली कॉल के दौरान भी हो vkGetSwapChainInfoWSI(.. VK_SWAP_CHAIN_INFO_TYPE_IMAGES_WSI ..) । 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;

जब एक 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               = VkSwapChainCreateInfoWSI::imageUsageFlags
  .flags               = 0
  .sharingMode         = VkSwapChainCreateInfoWSI::sharingMode
  .queueFamilyCount    = VkSwapChainCreateInfoWSI::queueFamilyCount
  .pQueueFamilyIndices = VkSwapChainCreateInfoWSI::pQueueFamilyIndices

एंड्रॉयड 8.0 और उच्चतर में, मंच एक प्रदान करता है VkSwapchainImageCreateInfo में विस्तार संरचना VkImageCreateInfo के लिए प्रदान की श्रृंखला vkCreateImage जब किसी भी swapchain छवि उपयोग झंडे swapchain लिए आवश्यक हैं। विस्तार संरचना में स्वैपचैन छवि उपयोग झंडे शामिल हैं:

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

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

एंड्रॉयड 10 और उच्च में, मंच का समर्थन करता है VK_KHR_swapchain , V70 तो Vulkan अनुप्रयोग एक बनाने में सक्षम है VkImage swapchain स्मृति द्वारा समर्थित। एप्लिकेशन पहले कॉल 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 एप्लिकेशन द्वारा प्रदान की वस्तुओं (हालांकि, दोनों सेमाफोर और बाड़ वस्तुओं इस कॉल में वैकल्पिक हैं)। ड्राइवर इस अवसर का उपयोग ग्रेलोक बफर स्थिति में किसी बाहरी परिवर्तन को पहचानने और संभालने के लिए भी कर सकता है; कई ड्राइवरों को यहां कुछ भी करने की आवश्यकता नहीं होगी। इस कॉल डालता VkSemaphore और VkFence के रूप में ही लंबित स्थिति में नहीं vkQueueSignalSemaphore और 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

कई ड्राइवर छवि पैरामीटर को अनदेखा कर सकते हैं, लेकिन कुछ को बाहरी छवि उपभोक्ताओं द्वारा उपयोग के लिए ग्रैलोक बफर से जुड़े सीपीयू-साइड डेटा संरचनाएं तैयार करने की आवश्यकता हो सकती है। बाहरी उपभोक्ताओं द्वारा उपयोग के लिए तैयार कर रहा है बफर सामग्री के लिए छवि परिवर्तित करने के भाग के रूप एसिंक्रोनस रूप से किया जाना चाहिए VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

यदि छवि के साथ बनाया गया था VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID , तो ड्राइवर की अनुमति देनी चाहिए vkQueueSignalReleaseImageANDROID() के लिए कॉल हस्तक्षेप के बिना बार-बार कहे जाने के vkAcquireImageANDROID()

साझा प्रस्तुत करने योग्य छवि समर्थन

विलंबता को कम करने के लिए कुछ डिवाइस डिस्प्ले पाइपलाइन और वल्कन कार्यान्वयन के बीच एकल छवि के स्वामित्व को साझा कर सकते हैं। एंड्रॉयड 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

मान्यकरण

ओईएम सीटीएस का उपयोग करके अपने वल्कन कार्यान्वयन का परीक्षण कर सकते हैं, जिसमें शामिल हैं:

  • Khronos Vulkan अनुरूपता परीक्षण में CtsDeqpTestCases मॉड्यूल है, जो Vulkan 1.0 और 1.1 के लिए कार्यात्मक एपीआई परीक्षण शामिल हैं।
  • CtsGraphicsTestCases मॉड्यूल है, जो परीक्षण है कि डिवाइस Vulkan क्षमताओं इसके समर्थन के लिए सही ढंग से किया गया है।

वल्कन फीचर फ्लैग

जो उपकरण का समर्थन करता है एंड्रॉयड 11 या उसके बाद और उस का समर्थन करता है Vulkan एपीआई एक विशेषता ध्वज का पर्दाफाश करने, आवश्यक है android.software.vulkan.deqp.level । इस फ़ीचर फ़्लैग का मान एक दिनांक है, जिसे पूर्णांक मान के रूप में एन्कोड किया गया है। यह वल्कन डीईक्यूपी परीक्षणों से जुड़ी तारीख को निर्दिष्ट करता है जिसे डिवाइस पास करने का दावा करता है।

YYYY-MM-DD फॉर्म की तारीख को 32-बिट पूर्णांक के रूप में निम्नानुसार एन्कोड किया गया है:

  • बिट्स 0-15 वर्ष स्टोर करें
  • बिट्स 16-23 महीने में स्टोर करें
  • बिट्स 24-31 दिन में स्टोर करें

सुविधा ध्वज के लिए न्यूनतम स्वीकृत मूल्य है 0x07E30301 , जो तारीख 2019/03/01, जो एंड्रॉयड से 10 तो सुविधा झंडा कम से कम यह मान, इस उपकरण का दावा करने के लिए है के लिए Vulkan dEQP परीक्षण के साथ जुड़े तारीख है से मेल खाती है सभी Android 10 Vulkan dEQP परीक्षण पास करें।

मूल्य 0x07E40301 तारीख 2020/03/01, जो एंड्रॉयड 11 के लिए Vulkan dEQP परीक्षण के साथ जुड़े तारीख है सुविधा झंडा यह मान कम से कम है, तो से मेल खाती है, इस उपकरण का दावा एंड्रॉयड 11 Vulkan dEQP परीक्षण के सभी पारित करने के लिए।

यदि यह सुविधा ध्वज मूल्य है कम से कम 0x07E30301 लेकिन कम से कम 0x07E40301 , इस का मतलब है कि डिवाइस का दावा एंड्रॉयड 10 Vulkan dEQP परीक्षण के सभी लेकिन पारित करने के लिए Vulkan dEQP परीक्षण है कि एंड्रॉयड 11 के लिए जोड़ा गया था पारित करने के लिए गारंटी नहीं है।

वल्कन डीईक्यूपी एंड्रॉइड सीटीएस का हिस्सा है। एंड्रॉयड 11 से, सीटीएस की dEQP परीक्षण धावक घटक के बारे में पता है android.software.vulkan.deqp.level सुविधा झंडा, और किसी भी Vulkan dEQP परीक्षण है कि छोड़ देता है - इस सुविधा ध्वज के अनुसार - डिवाइस समर्थन का दावा नहीं करता है। इस तरह के परीक्षणों को तुच्छ रूप से पारित होने की सूचना दी जाती है।