ভুলকান হলো উচ্চ-পারফরম্যান্সের ৩ডি গ্রাফিক্সের জন্য একটি স্বল্প-ওভারহেড, ক্রস-প্ল্যাটফর্ম এপিআই। ওপেনজিএল ইএস (জিএলইএস) -এর মতো, ভুলকানও অ্যাপে উচ্চ-মানের, রিয়েল-টাইম গ্রাফিক্স তৈরির জন্য টুল সরবরাহ করে। ভুলকান ব্যবহারের সুবিধাগুলোর মধ্যে রয়েছে সিপিইউ ওভারহেড হ্রাস এবং এসপিআইআর-ভি বাইনারি ইন্টারমিডিয়েট ল্যাঙ্গুয়েজের জন্য সমর্থন।
Vulkan সফলভাবে প্রয়োগ করার জন্য একটি ডিভাইসে অবশ্যই নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত থাকতে হবে:
- অ্যান্ড্রয়েড কর্তৃক প্রদত্ত ভলকান লোডার।
- GPU IHV-এর মতো SoC দ্বারা সরবরাহকৃত একটি Vulkan ড্রাইভার, যা Vulkan API প্রয়োগ করে। Vulkan কার্যকারিতা সমর্থন করার জন্য, অ্যান্ড্রয়েড ডিভাইসটিতে Vulkan-সক্ষম GPU হার্ডওয়্যার এবং সংশ্লিষ্ট ড্রাইভার প্রয়োজন। GPU-টিকে অবশ্যই GLES 3.1 এবং তার উচ্চতর সংস্করণ সমর্থন করতে হবে। ড্রাইভার সমর্থনের জন্য অনুরোধ করতে আপনার SoC বিক্রেতার সাথে পরামর্শ করুন।
যদি কোনো ডিভাইসে ভলকান ড্রাইভার অন্তর্ভুক্ত থাকে, তবে ডিভাইসটিকে FEATURE_VULKAN_HARDWARE_LEVEL এবং FEATURE_VULKAN_HARDWARE_VERSION সিস্টেম ফিচারগুলো ঘোষণা করতে হবে, এবং এর ভার্সনগুলো ডিভাইসের সক্ষমতাকে সঠিকভাবে প্রতিফলিত করে। এটি নিশ্চিত করতে সাহায্য করে যে ডিভাইসটি কম্প্যাটিবিলিটি ডেফিনিশন ডকুমেন্ট (CDD)-এর সাথে সঙ্গতিপূর্ণ।
ভলকান লোডার
Vulkan লোডার platform/frameworks/native/vulkan হলো Vulkan অ্যাপ এবং একটি ডিভাইসের Vulkan ড্রাইভারের মধ্যে প্রধান ইন্টারফেস। Vulkan লোডারটি /system/lib[64]/libvulkan.so তে ইনস্টল করা হয়। লোডারটি কোর Vulkan API এন্ট্রি পয়েন্ট, Android CDD-এর জন্য প্রয়োজনীয় এক্সটেনশনগুলির এন্ট্রি পয়েন্ট এবং আরও অনেক ঐচ্ছিক এক্সটেনশন সরবরাহ করে। Window System Integration (WSI) এক্সটেনশনগুলি লোডার দ্বারা এক্সপোর্ট করা হয় এবং প্রধানত ড্রাইভারের পরিবর্তে লোডারেই প্রয়োগ করা হয়। লোডারটি এমন লেয়ারগুলি গণনা এবং লোড করাও সমর্থন করে যা অতিরিক্ত এক্সটেনশন প্রকাশ করতে পারে এবং ড্রাইভারের দিকে যাওয়ার পথে কোর API কলগুলিকে বাধা দিতে পারে।
লিঙ্কিংয়ের জন্য NDK-তে একটি স্টাব libvulkan.so লাইব্রেরি অন্তর্ভুক্ত রয়েছে। এই লাইব্রেরিটি লোডারের মতোই একই সিম্বলগুলো এক্সপোর্ট করে। অ্যাপগুলো লোডারের ট্রাম্পোলিন ফাংশনে প্রবেশ করার জন্য আসল libvulkan.so লাইব্রেরি থেকে এক্সপোর্ট করা ফাংশনগুলোকে কল করে, যা তাদের প্রথম আর্গুমেন্টের উপর ভিত্তি করে উপযুক্ত লেয়ার বা ড্রাইভারে ডিসপ্যাচ করে। vkGet*ProcAddr() কলটি সেই ফাংশন পয়েন্টারগুলো রিটার্ন করে যেখানে ট্রাম্পোলিনগুলো ডিসপ্যাচ হয় (অর্থাৎ, এটি সরাসরি কোর এপিআই কোডে কল করে)। এক্সপোর্ট করা সিম্বলের পরিবর্তে ফাংশন পয়েন্টারের মাধ্যমে কল করা আরও বেশি কার্যকর, কারণ এটি ট্রাম্পোলিন এবং ডিসপ্যাচকে এড়িয়ে যায়।
ড্রাইভার গণনা এবং লোডিং
যখন সিস্টেম ইমেজ তৈরি করা হয়, অ্যান্ড্রয়েড আশা করে যে সিস্টেমটি জানবে কোন GPU-গুলো উপলব্ধ আছে। লোডারটি ড্রাইভার খুঁজে বের করতে এবং লোড করতে hardware.h এ থাকা বিদ্যমান HAL মেকানিজম ব্যবহার করে। ৩২-বিট এবং ৬৪-বিট ভলকান ড্রাইভারের জন্য পছন্দের পাথগুলো হলো:
/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib/hw/vulkan.<ro.board.platform>.so /vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib64/hw/vulkan.<ro.board.platform>.so
অ্যান্ড্রয়েড ৭.০ এবং তার পরবর্তী সংস্করণগুলিতে, ভলকান hw_module_t ডেরিভেটিভটি একটি একক hw_module_t struct-কে র্যাপ করে; কেবল একটি ড্রাইভার সমর্থিত হয় এবং open() ফাংশনে HWVULKAN_DEVICE_0 নামক কনস্ট্যান্ট স্ট্রিংটি পাস করা হয়।
Vulkan-এর hw_device_t ডেরিভেটিভটি একটি একক ড্রাইভারের সাথে সঙ্গতিপূর্ণ, যা একাধিক ফিজিক্যাল ডিভাইস সমর্থন করতে পারে। hw_device_t স্ট্রাকচারটি vkGetGlobalExtensionProperties() , vkCreateInstance() , এবং vkGetInstanceProcAddr() ফাংশনগুলো এক্সপোর্ট করার জন্য সম্প্রসারিত হতে পারে। লোডারটি hw_device_t স্ট্রাকচারের vkGetInstanceProcAddr() ফাংশনটি কল করার মাধ্যমে অন্য সব VkInstance() , VkPhysicalDevice() , এবং vkGetDeviceProcAddr() ফাংশন খুঁজে নিতে পারে।
ro.vulkan.apex ভলকান APEX-এর নামে সেট করুন।স্তর আবিষ্কার এবং লোড করা
ভলকান লোডার এমন লেয়ার গণনা ও লোড করা সমর্থন করে, যা অতিরিক্ত এক্সটেনশন প্রকাশ করতে পারে এবং ড্রাইভারের দিকে যাওয়ার পথে কোর এপিআই কলগুলোকে বাধা দিতে পারে। অ্যাপগুলো তাদের APK-তে লেয়ার অন্তর্ভুক্ত করতে পারে। অ্যান্ড্রয়েড সিস্টেম ইমেজে লেয়ার অন্তর্ভুক্ত করে না।
লেয়ার ব্যবহার করার সময় মনে রাখবেন যে, অ্যান্ড্রয়েডের নিরাপত্তা মডেল এবং নীতিমালা অন্যান্য প্ল্যাটফর্ম থেকে উল্লেখযোগ্যভাবে ভিন্ন। বিশেষ করে, অ্যান্ড্রয়েড প্রোডাকশন (নন-রুটেড) ডিভাইসে কোনো নন-ডিবাগেবল প্রসেসে এক্সটার্নাল কোড লোড করার অনুমতি দেয় না, এবং এটি এক্সটার্নাল কোডকে প্রসেসটির মেমরি, স্টেট ইত্যাদি পরিদর্শন বা নিয়ন্ত্রণ করারও অনুমতি দেয় না। এর মধ্যে পরবর্তী পরিদর্শনের জন্য কোর ডাম্প, এপিআই ট্রেস ইত্যাদি ডিস্কে সংরক্ষণ করার উপর নিষেধাজ্ঞাও অন্তর্ভুক্ত। প্রোডাকশন ডিভাইসে শুধুমাত্র নন-ডিবাগেবল অ্যাপের অংশ হিসেবে সরবরাহ করা লেয়ারগুলোই সক্রিয় থাকে, এবং ড্রাইভারগুলো এমন কোনো কার্যকারিতা প্রদান করতে পারবে না যা এই নীতিমালা লঙ্ঘন করে।
লেয়ার ব্যবহারের ক্ষেত্রগুলোর মধ্যে রয়েছে:
- ডেভেলপমেন্ট-টাইম লেয়ার — ট্রেসিং/প্রোফাইলিং/ডিবাগিং টুলের জন্য ব্যবহৃত ভ্যালিডেশন লেয়ার এবং শিমগুলো প্রোডাকশন ডিভাইসের সিস্টেম ইমেজে ইনস্টল করা উচিত নয়। ট্রেসিং/প্রোফাইলিং/ডিবাগিং টুলের জন্য ব্যবহৃত ভ্যালিডেশন লেয়ার এবং শিমগুলো সিস্টেম ইমেজ ছাড়াই আপডেটযোগ্য হওয়া উচিত। যে ডেভেলপাররা ডেভেলপমেন্টের সময় এই লেয়ারগুলোর কোনো একটি ব্যবহার করতে চান, তারা অ্যাপ প্যাকেজটি পরিবর্তন করতে পারেন, উদাহরণস্বরূপ, তাদের নেটিভ লাইব্রেরি ডিরেক্টরিতে একটি ফাইল যোগ করার মাধ্যমে। যে IHV এবং OEM ইঞ্জিনিয়াররা শিপিংয়ের জন্য অপরিবর্তনীয় অ্যাপের ব্যর্থতা নির্ণয় করতে চান, তাদের কাছে সিস্টেম ইমেজের নন-প্রোডাকশন (রুটেড) বিল্ডের অ্যাক্সেস আছে বলে ধরে নেওয়া হয়, যদি না সেই অ্যাপগুলো ডিবাগযোগ্য হয়। আরও তথ্যের জন্য অ্যান্ড্রয়েডে ভলকান ভ্যালিডেশন লেয়ার দেখুন।
- ইউটিলিটি লেয়ার — এই লেয়ারগুলো বিভিন্ন এক্সটেনশন প্রকাশ করে, যেমন একটি লেয়ার যা ডিভাইস মেমরির জন্য একটি মেমরি ম্যানেজার বাস্তবায়ন করে। ডেভেলপাররা তাদের অ্যাপে ব্যবহারের জন্য লেয়ার এবং সেগুলোর বিভিন্ন সংস্করণ বেছে নেন; একই লেয়ার ব্যবহারকারী বিভিন্ন অ্যাপ ভিন্ন ভিন্ন সংস্করণ ব্যবহার করতে পারে। ডেভেলপাররা তাদের অ্যাপ প্যাকেজে এই লেয়ারগুলোর মধ্যে কোনটি অন্তর্ভুক্ত করবেন তা নির্বাচন করেন।
- ইনজেক্টেড (অন্তর্নিহিত) লেয়ার — এর মধ্যে ফ্রেম রেট, সোশ্যাল নেটওয়ার্ক এবং গেম লঞ্চার ওভারলে-র মতো লেয়ারগুলো অন্তর্ভুক্ত, যা ব্যবহারকারী বা অন্য কোনো অ্যাপ সেই অ্যাপের অজান্তে বা অনুমতি ছাড়াই প্রদান করে। এগুলো অ্যান্ড্রয়েডের নিরাপত্তা নীতি লঙ্ঘন করে এবং সমর্থিত নয়।
যেসব অ্যাপ ডিবাগ করা যায় না, সেগুলোর ক্ষেত্রে লোডার শুধুমাত্র অ্যাপটির নেটিভ লাইব্রেরি ডিরেক্টরিতে লেয়ার খোঁজে এবং একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে এমন নামের যেকোনো লাইব্রেরি লোড করার চেষ্টা করে (উদাহরণস্বরূপ, libVKLayer_foo.so )। এই লেয়ারগুলো অ্যাপটির নেমস্পেসে লোড করা হয়। তাই, এগুলো অবশ্যই NDK দিয়ে বিল্ড করতে হবে।
ডিবাগযোগ্য অ্যাপের জন্য, লোডার /data/local/debug/vulkan লেয়ারগুলো খোঁজে এবং একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে এমন যেকোনো লাইব্রেরি লোড করার চেষ্টা করে। অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) থেকে শুরু করে, ভলকান অন্য একটি এপিকে থেকে ডেভেলপমেন্ট-টাইম লেয়ারও লোড করতে পারে। উভয় ক্ষেত্রেই, লোডার সিস্টেম সেটিংস ব্যবহার করে প্রতিটি অ্যাপের জন্য আলাদাভাবে কোন লেয়ারগুলো সক্রিয় করবে তা নির্বাচন করে। এই লেয়ারগুলো vkEnumerateInstanceLayerProperties এ তালিকাভুক্ত থাকে (অর্থাৎ, অ্যাপটি এগুলি সম্পর্কে জানতে পারে), যদিও সেগুলি অ্যাপের অনুমতি ছাড়াই লোড হতে পারে।
অ্যান্ড্রয়েড অন্যান্য প্ল্যাটফর্মের সাথে বিল্ড-এনভায়রনমেন্ট পরিবর্তনের মাধ্যমে লেয়ার পোর্ট করার সুযোগ দেয়। লেয়ার এবং লোডারের মধ্যকার ইন্টারফেস সম্পর্কে বিস্তারিত জানতে, 'আর্কিটেকচার অফ দ্য ভলকান লোডার ইন্টারফেসেস' দেখুন। ক্রোনোস দ্বারা পরিচালিত ভ্যালিডেশন লেয়ারগুলো 'ভলকান ভ্যালিডেশন লেয়ারস' -এ হোস্ট করা থাকে।
ভুলকান এপিআই সংস্করণ এবং ক্ষমতা
নিচের সারণিতে বিভিন্ন অ্যান্ড্রয়েড রিলিজের ভলকান এপিআই সংস্করণগুলো তালিকাভুক্ত করা হয়েছে।| অ্যান্ড্রয়েড সংস্করণ | ভলকান সংস্করণ |
|---|---|
| অ্যান্ড্রয়েড ১৬ | ভুলকান ১.৪ |
| অ্যান্ড্রয়েড ১৩ | ভুলকান ১.৩ |
| অ্যান্ড্রয়েড ৯ | ভুলকান ১.১ |
| অ্যান্ড্রয়েড ৭ | ভুলকান ১.০ |
ভুলকান ১.৪ কার্যকারিতার সংক্ষিপ্ত বিবরণ
ভলকান ১.৪ পূর্বে ঐচ্ছিক থাকা বেশ কিছু এক্সটেনশনকে ভলকানের মূল কার্যকারিতার অন্তর্ভুক্ত করেছে। এই কার্যকারিতার বেশিরভাগই ভলকান প্রোগ্রামিং ইন্টারফেসের উপর নিয়ন্ত্রণ এবং সূক্ষ্মতা বাড়ানোর উদ্দেশ্যে অন্তর্ভুক্ত করা হয়েছে। ভলকান ১.৩-এর তুলনায় ভলকান ১.৪-এর জন্য হার্ডওয়্যারের প্রয়োজনীয়তা বৃদ্ধি পেয়েছে, যার বেশিরভাগ বাস্তবায়ন ফ্রেমওয়ার্কে নয়, বরং এসওসি-নির্দিষ্ট গ্রাফিক্স ড্রাইভারে করা হয়েছে।
ভুলকান ১.৩ কার্যকারিতার সংক্ষিপ্ত বিবরণ
ভলকান ১.৩ পূর্বে ঐচ্ছিক থাকা বেশ কিছু এক্সটেনশনকে ভলকানের মূল কার্যকারিতার অন্তর্ভুক্ত করেছে। এই কার্যকারিতার বেশিরভাগই ভলকান প্রোগ্রামিং ইন্টারফেসের উপর নিয়ন্ত্রণ এবং সূক্ষ্মতা বাড়ানোর উদ্দেশ্যে অন্তর্ভুক্ত করা হয়েছে। সিঙ্গেল-পাস রেন্ডার পাস ইনস্ট্যান্সগুলোর জন্য এখন আর রেন্ডার পাস অবজেক্ট বা ফ্রেমবাফারের প্রয়োজন নেই। পাইপলাইন স্টেট অবজেক্টের মোট সংখ্যা কমানো সম্ভব হয়েছে এবং এপিআই-এর মধ্যেকার সিনক্রোনাইজেশন ব্যবস্থাকে ঢেলে সাজানো হয়েছে। ভলকান ১.৩-এর জন্য প্রয়োজনীয় হার্ডওয়্যার ভলকান ১.২, ১.১ এবং ১.০-এর মতোই, তবে এর বেশিরভাগ বাস্তবায়ন ফ্রেমওয়ার্কে না থেকে এসওসি-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে করা হয়েছে।
অ্যান্ড্রয়েডের জন্য ভলকান ১.৩-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলো হলো:
- একক-পাস রেন্ডার পাস ইনস্ট্যান্সের জন্য সমর্থন
- শেডার আহ্বান অবিলম্বে বন্ধ করার জন্য সমর্থন
- পাইপলাইন তৈরি, শেয়ার এবং নিয়ন্ত্রণের ক্ষেত্রে আরও সূক্ষ্ম নিয়ন্ত্রণ
Vulkan 1.3-এ আরও বেশ কিছু ছোটখাটো ফিচার এবং API-এর ব্যবহারযোগ্যতার উন্নতি অন্তর্ভুক্ত রয়েছে। মাইনর রিভিশন 1.3-এর মাধ্যমে কোর Vulkan API-তে করা সমস্ত পরিবর্তন Core Revisions (Vulkan 1.3) -এ পাওয়া যাবে।
ভুলকান ১.২ কার্যকারিতার সংক্ষিপ্ত বিবরণ
Vulkan 1.2 বেশ কিছু ফিচার ও এক্সটেনশন যোগ করেছে যা API সারফেসকে সরল করে। এর মধ্যে রয়েছে একটি সমন্বিত মেমরি মডেল এবং অতিরিক্ত তথ্য যা একটি ডিভাইস ড্রাইভার থেকে কোয়েরি করা যায়। Vulkan 1.2-এর জন্য প্রয়োজনীয় হার্ডওয়্যার Vulkan 1.0 এবং 1.1-এর মতোই; এর সমস্ত ইমপ্লিমেন্টেশন ফ্রেমওয়ার্কে নয়, বরং SoC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে রয়েছে।
অ্যান্ড্রয়েডের জন্য ভলকান ১.২-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হলো ৮-বিট স্টোরেজের সমর্থন।
Vulkan 1.2-এ আরও বেশ কিছু ছোটখাটো ফিচার এবং API-এর ব্যবহারযোগ্যতার উন্নতি অন্তর্ভুক্ত রয়েছে। মাইনর রিভিশন 1.2-এর মাধ্যমে কোর Vulkan API-তে করা সমস্ত পরিবর্তন Core Revisions (Vulkan 1.2) -এ পাওয়া যাবে।
ভুলকান ১.১ কার্যকারিতার সংক্ষিপ্ত বিবরণ
ভুলকান ১.১-এ মেমরি/সিঙ্ক্রোনাইজেশন ইন্টারঅপের সমর্থন অন্তর্ভুক্ত রয়েছে, যা OEM-দের ডিভাইসগুলিতে ভুলকান ১.১ সমর্থন করতে সক্ষম করে। এছাড়াও, মেমরি/সিঙ্ক্রোনাইজেশন ইন্টারঅপ ডেভেলপারদেরকে কোনো ডিভাইসে ভুলকান ১.১ সমর্থিত কিনা তা নির্ধারণ করতে এবং সমর্থিত হলে তা কার্যকরভাবে ব্যবহার করতে সক্ষম করে। ভুলকান ১.১-এর জন্য প্রয়োজনীয় হার্ডওয়্যারের শর্তাবলী ভুলকান ১.০-এর মতোই, কিন্তু এর বেশিরভাগ বাস্তবায়ন ফ্রেমওয়ার্কে না থেকে SOC-নির্দিষ্ট গ্রাফিক্স ড্রাইভারের মধ্যে থাকে।
অ্যান্ড্রয়েডের জন্য ভলকান ১.১-এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলো হলো:
- Vulkan-এর বাইরে থেকে মেমরি বাফার এবং সিনক্রোনাইজেশন অবজেক্ট ইম্পোর্ট ও এক্সপোর্ট করার সুবিধা (ক্যামেরা, কোডেক এবং GLES-এর সাথে আন্তঃক্রিয়ার জন্য)।
- YCbCr ফরম্যাটের জন্য সমর্থন
Vulkan 1.1-এ আরও বেশ কিছু ছোটখাটো ফিচার এবং API-এর ব্যবহারযোগ্যতার উন্নতি অন্তর্ভুক্ত রয়েছে। মাইনর রিভিশন 1.1-এর মাধ্যমে কোর Vulkan API-তে করা সমস্ত পরিবর্তন Core Revisions (Vulkan 1.1) -এ পাওয়া যাবে।
ভলকান সমর্থন বেছে নিন
সকল অ্যান্ড্রয়েড ডিভাইসকে অবশ্যই উপলব্ধ সর্বাধুনিক ভলকান ফিচার সেট সমর্থন করতে হবে, তবে শর্ত হলো ডিভাইসগুলো ৬৪-বিট এবিআই সমর্থন করে এবং সেগুলোর মেমোরি কম থাকা চলবে না।
যেসব ডিভাইস অ্যান্ড্রয়েড ১৬ বা তার পরবর্তী সংস্করণ নিয়ে বাজারে আসে, সেগুলোতে অবশ্যই ভলকান ১.৪ সাপোর্ট থাকতে হবে।
যেসব ডিভাইস অ্যান্ড্রয়েড ১৩ বা তার পরবর্তী সংস্করণ নিয়ে বাজারে আসে, সেগুলোতে অবশ্যই ভলকান ১.৩ সাপোর্ট থাকতে হবে।
যেসব ডিভাইস অ্যান্ড্রয়েড ১০-এর মাধ্যমে চালু হবে, সেগুলোতে অবশ্যই ভলকান ১.১ সমর্থন থাকতে হবে।
অন্যান্য ডিভাইসগুলো ঐচ্ছিকভাবে ভলকান ১.৪, ১.৩, ১.২ এবং ১.১ সমর্থন করতে পারে।
ভলকান সংস্করণ সমর্থন করুন
একটি অ্যান্ড্রয়েড ডিভাইস ভলকান সংস্করণ সমর্থন করে, যদি নিম্নলিখিত শর্তগুলো পূরণ হয়:
- এমন একটি ভলকান ড্রাইভার যোগ করুন যা আপনার কাঙ্ক্ষিত ভলকান সংস্করণটিকে (এটি অবশ্যই ভলকান সংস্করণ ১.৪, ১.৩, ১.১, বা ১.০-এর মধ্যে একটি হতে হবে) অ্যান্ড্রয়েড সংস্করণের অতিরিক্ত সিডিডি প্রয়োজনীয়তার পাশাপাশি সমর্থন করে। বিকল্পভাবে, নিম্নতর ভলকান সংস্করণ নম্বরের একটি বিদ্যমান ভলকান ড্রাইভার আপডেট করুন।
- Vulkan 1.4, 1.3, বা 1.1-এর ক্ষেত্রে, যাচাই করুন যে প্যাকেজ ম্যানেজার দ্বারা ফেরত আসা সিস্টেম ফিচারটি সঠিক Vulkan সংস্করণের জন্য
trueরিটার্ন করে।- Vulkan 1.4-এর জন্য ফিচারটি হলো
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x404000)। - Vulkan 1.3-এর জন্য ফিচারটি হলো
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)। - Vulkan 1.1-এর জন্য ফিচারটি হলো
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)।
device.mkফাইলে নিম্নরূপ একটি নিয়ম যোগ করার মাধ্যমে প্যাকেজ ম্যানেজার Vulkan 1.4, 1.3 এবং 1.1-এর জন্যtrueরিটার্ন করবে।- Vulkan 1.4-এর জন্য নিম্নলিখিতটি যোগ করুন:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_4.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- 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
- Vulkan 1.4-এর জন্য ফিচারটি হলো
অ্যান্ড্রয়েড বেসলাইন প্রোফাইল (এবিপি)
আমরা সকল অ্যান্ড্রয়েড ডিভাইসকে অ্যান্ড্রয়েড বেসলাইন প্রোফাইল গাইডে বর্ণিত সর্বশেষ অ্যান্ড্রয়েড বেসলাইন ২০২২ প্রোফাইলটি অনুসরণ করতে উৎসাহিত করি।
যে কোনো ডিভাইস যা অ্যান্ড্রয়েড ১৪ বা তার উচ্চতর সংস্করণ এবং ভলকান এপিআই (Vulkan API) সমর্থন করে, তাকে অবশ্যই অ্যান্ড্রয়েড বেসলাইন ২০২১ প্রোফাইলে সংজ্ঞায়িত সমস্ত কার্যকারিতা পূরণ করতে হবে। প্রয়োজনীয় কার্যকারিতার সম্পূর্ণ তালিকাটি ভলকান প্রোফাইল 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, যা শুধুমাত্র Android 10-এ Vulkan 1.1-এর জন্য প্রয়োগ করা হয়েছে। -
VK_GOOGLE_display_timing, যা Android 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 প্যারামিটারগুলোকে ফরম্যাট এবং ব্যবহারের জন্য প্রয়োজনীয় গ্র্যালক ইউসেজ ফ্ল্যাগ দিয়ে পূরণ করা। বাফার বরাদ্দ করার সময়, ড্রাইভার দ্বারা ফেরত দেওয়া ইউসেজ ফ্ল্যাগগুলো সোয়াপচেইন কনজিউমারের অনুরোধ করা ইউসেজ ফ্ল্যাগগুলোর সাথে একত্রিত করা হয়।
Android 7.x, VkSwapchainImageUsageFlagsANDROID() এর একটি পূর্ববর্তী সংস্করণকে কল করে, যার নাম vkGetSwapchainGrallocUsageANDROID() । Android 8.0 এবং তার পরবর্তী সংস্করণগুলো vkGetSwapchainGrallocUsageANDROID() অপ্রচলিত ঘোষণা করলেও, যদি ড্রাইভার vkGetSwapchainGrallocUsage2ANDROID() প্রদান না করে, তবে এটি এখনও vkGetSwapchainGrallocUsageANDROID() কে কল করে।
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
VkDevice device,
VkFormat format,
VkImageUsageFlags imageUsage,
int* grallocUsage
);
vkGetSwapchainGrallocUsageANDROID() সোয়াপচেইন ব্যবহারের ফ্ল্যাগ বা বর্ধিত গ্র্যালক ব্যবহারের ফ্ল্যাগ সমর্থন করে না।
গ্র্যালক-সমর্থিত ছবি
VkNativeBufferANDROID হলো একটি vkCreateImage এক্সটেনশন স্ট্রাকচার, যা একটি Gralloc বাফার দ্বারা সমর্থিত ইমেজ তৈরি করার জন্য ব্যবহৃত হয়। VkNativeBufferANDROID VkImageCreateInfo স্ট্রাকচার চেইনের মধ্যে vkCreateImage() ফাংশনে সরবরাহ করা হয়। VkNativeBufferANDROID সহ vkCreateImage() ফাংশনের কলগুলো 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
অ্যান্ড্রয়েড ৮.০ এবং তার পরবর্তী সংস্করণগুলিতে, যখন সোয়াপচেইনের জন্য কোনো সোয়াপচেইন ইমেজ ব্যবহারের ফ্ল্যাগের প্রয়োজন হয়, তখন প্ল্যাটফর্মটি vkCreateImage প্রদত্ত VkImageCreateInfo চেইনের মধ্যে একটি VkSwapchainImageCreateInfoKHR এক্সটেনশন স্ট্রাকচার সরবরাহ করে। এই এক্সটেনশন স্ট্রাকচারটিতে সোয়াপচেইন ইমেজ ব্যবহারের ফ্ল্যাগগুলো থাকে:
typedef struct {
VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
const void* pNext;
VkSwapchainImageUsageFlagsANDROID usage;
} VkSwapchainImageCreateInfoANDROID;
অ্যান্ড্রয়েড ১০ এবং তার উপরের সংস্করণগুলিতে, প্ল্যাটফর্মটি VK_KHR_swapchain v70 সমর্থন করে, ফলে ভলকান অ্যাপটি সোয়াপচেইন মেমরি দ্বারা সমর্থিত একটি VkImage তৈরি করতে পারে। অ্যাপটি প্রথমে VkImageCreateInfo স্ট্রাকচারের সাথে চেইন করা একটি VkImageSwapchainCreateInfoKHR স্ট্রাকচার ব্যবহার করে vkCreateImage কল করে। এরপর অ্যাপটি VkBindImageMemoryInfo স্ট্রাকচারের সাথে চেইন করা একটি VkBindImageMemorySwapchainInfoKHR স্ট্রাকচার ব্যবহার করে vkBindImageMemory2(KHR) কল করে। VkBindImageMemorySwapchainInfoKHR স্ট্রাকচারে নির্দিষ্ট করা imageIndex অবশ্যই একটি বৈধ সোয়াপচেইন ইমেজ ইনডেক্স হতে হবে। একই সাথে, প্ল্যাটফর্মটি VkBindImageMemoryInfo চেইনে সংশ্লিষ্ট Gralloc বাফার তথ্যসহ একটি VkNativeBufferANDROID এক্সটেনশন স্ট্রাকচার সরবরাহ করে, ফলে ড্রাইভার জানতে পারে কোন Gralloc বাফারের সাথে VkImage বাইন্ড করতে হবে।
ছবি সংগ্রহ করুন
vkAcquireImageANDROID একটি সোয়াপচেইন ইমেজের মালিকানা অর্জন করে এবং একটি বাহ্যিকভাবে সংকেতযুক্ত নেটিভ ফেন্সকে একটি বিদ্যমান VkSemaphore অবজেক্ট এবং একটি বিদ্যমান VkFence অবজেক্ট উভয়ের মধ্যে ইম্পোর্ট করে:
VkResult VKAPI vkAcquireImageANDROID(
VkDevice device,
VkImage image,
int nativeFenceFd,
VkSemaphore semaphore,
VkFence fence
);
vkAcquireNextImageKHR চলাকালীন vkAcquireImageANDROID() কল করা হয় অ্যাপ দ্বারা প্রদত্ত 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() ফাংশনকে কল করে। ড্রাইভারকে অবশ্যই একটি নেটিভ ফেন্স তৈরি করতে হবে যা pWaitSemaphores এর মধ্যে থাকা সমস্ত waitSemaphoreCount সেমাফোর সিগন্যাল না দেওয়া পর্যন্ত এবং উপস্থাপনার জন্য image প্রস্তুত করতে প্রয়োজনীয় অতিরিক্ত কাজ সম্পন্ন না হওয়া পর্যন্ত সিগন্যাল দেবে না।
যদি ওয়েট সেমাফোরগুলো (যদি থাকে) ইতিমধ্যেই সিগন্যাল দিয়ে থাকে এবং queue নিষ্ক্রিয় থাকে, তাহলে ড্রাইভার একটি প্রকৃত নেটিভ ফেন্স ফাইল ডেসক্রিপ্টরের পরিবর্তে *pNativeFenceFd কে -1 সেট করতে পারে, যা নির্দেশ করে যে অপেক্ষা করার মতো কিছু নেই। কলার *pNativeFenceFd এ ফেরত আসা ফাইল ডেসক্রিপ্টরটির মালিকানা লাভ করে এবং সেটি বন্ধ করে দেয়।
অনেক ড্রাইভার ইমেজ প্যারামিটারটি উপেক্ষা করতে পারে, কিন্তু কিছু ড্রাইভারের বাহ্যিক ইমেজ ব্যবহারকারীদের ব্যবহারের জন্য গ্র্যালক বাফারের সাথে যুক্ত সিপিইউ-সাইড ডেটা স্ট্রাকচার প্রস্তুত করার প্রয়োজন হতে পারে। বাহ্যিক ব্যবহারকারীদের ব্যবহারের জন্য বাফারের বিষয়বস্তু প্রস্তুত করার কাজটি অবশ্যই অ্যাসিঙ্ক্রোনাসভাবে করতে হবে, যা ইমেজটিকে VK_IMAGE_LAYOUT_PRESENT_SRC_KHR এ স্থানান্তরের একটি অংশ।
যদি ইমেজটি VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID দিয়ে তৈরি করা হয়ে থাকে, তাহলে ড্রাইভারকে অবশ্যই vkAcquireImageANDROID vkQueueSignalReleaseImageANDROID() vkAcquireImageANDROID() -কে বারবার কল করার অনুমতি দিতে হবে।
শেয়ার করা উপস্থাপনযোগ্য ছবির সমর্থন
কিছু ডিভাইস ল্যাটেন্সি কমানোর জন্য ডিসপ্লে পাইপলাইন এবং ভলকান ইমপ্লিমেন্টেশনের মধ্যে একটিমাত্র ইমেজের মালিকানা শেয়ার করতে পারে। অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলোতে, vkGetPhysicalDeviceProperties2 কলের জবাবে ড্রাইভারের প্রতিক্রিয়ার উপর ভিত্তি করে লোডার শর্তসাপেক্ষে VK_KHR_shared_presentable_image এক্সটেনশনটি প্রচার করে।
যদি ড্রাইভারটি 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-রা CTS ব্যবহার করে তাদের Vulkan ইমপ্লিমেন্টেশন পরীক্ষা করতে পারে, যার মধ্যে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত রয়েছে:
-
CtsDeqpTestCasesমডিউলে Khronos Vulkan Conformance টেস্ট রয়েছে, যেগুলোতে Vulkan 1.0, 1.1, 1.2, 1.3, এবং 1.4-এর জন্য ফাংশনাল API টেস্ট অন্তর্ভুক্ত। -
CtsGraphicsTestCasesমডিউলটি পরীক্ষা করে দেখে যে, ডিভাইসটি তার সমর্থিত ভলকান সক্ষমতাগুলোর জন্য সঠিকভাবে কনফিগার করা আছে কি না।
ভুলকান বৈশিষ্ট্য পতাকা
যে ডিভাইস অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণ এবং ভলকান এপিআই (Vulkan API) সমর্থন করে, সেটিতে android.software.vulkan.deqp.level নামক একটি ফিচার ফ্ল্যাগ থাকা আবশ্যক। এই ফিচার ফ্ল্যাগের মান হলো একটি তারিখ, যা একটি পূর্ণসংখ্যা (integer) হিসেবে এনকোড করা থাকে। এটি সেই তারিখটিকে নির্দিষ্ট করে, যা ডিভাইসটির পাস করা ভলকান ডিইকিউপি (Vulkan dEQP) টেস্টগুলোর সাথে সম্পর্কিত।
YYYY-MM-DD ফর্ম্যাটের একটি তারিখকে নিম্নোক্তভাবে একটি ৩২-বিট পূর্ণসংখ্যা হিসাবে এনকোড করা হয়:
- ০-১৫ বিট বছরটি সংরক্ষণ করে
- ১৬-২৩ বিট মাসটি সংরক্ষণ করে
- বিট ২৪-৩১ দিনের জন্য সংরক্ষণ করে
ফিচার ফ্ল্যাগের জন্য সর্বনিম্ন অনুমোদিত মান হলো 0x07E30301 , যা 2019-03-01 তারিখটিকে নির্দেশ করে। এই তারিখটি অ্যান্ড্রয়েড 10-এর ভলকান dEQP টেস্টের সাথে সম্পর্কিত। যদি ফিচার ফ্ল্যাগের মান অন্তত এই পরিমাণ হয়, তবে ডিভাইসটি অ্যান্ড্রয়েড 10-এর সমস্ত ভলকান dEQP টেস্টে উত্তীর্ণ হয়েছে বলে দাবি করে।
0x07E40301 মানটি 2020-03-01 তারিখটিকে নির্দেশ করে, যা অ্যান্ড্রয়েড ১১-এর ভলকান ডিইকিউপি (Vulkan dEQP) পরীক্ষার সাথে সম্পর্কিত তারিখ। যদি ফিচার ফ্ল্যাগের মান অন্তত এই পরিমাণ হয়, তবে ডিভাইসটি অ্যান্ড্রয়েড ১১-এর সমস্ত ভলকান ডিইকিউপি পরীক্ষায় উত্তীর্ণ হয়েছে বলে দাবি করে।
0x07E60301 মানটি 2022-03-01 তারিখটিকে নির্দেশ করে, যা অ্যান্ড্রয়েড 13-এর জন্য ভলকান dEQP পরীক্ষার সাথে সম্পর্কিত তারিখ। যদি ফিচার ফ্ল্যাগের মান অন্তত এই পরিমাণ হয়, তবে ডিভাইসটি অ্যান্ড্রয়েড 13-এর সমস্ত ভলকান dEQP পরীক্ষায় উত্তীর্ণ হয়েছে বলে দাবি করে।
যে ডিভাইসটি একটি নির্দিষ্ট ফিচার ফ্ল্যাগ ( যেমন 0x07E30301 , 0x07E40301 , 0x07E60301 ) প্রকাশ করে, সেটি সেই ফিচার ফ্ল্যাগের (যথাক্রমে অ্যান্ড্রয়েড ১০, অ্যান্ড্রয়েড ১১, অ্যান্ড্রয়েড ১৩) সমস্ত অ্যান্ড্রয়েড ভলকান dEQP টেস্ট পাস করার দাবি করে। এই ডিভাইসটি পরবর্তী কোনো অ্যান্ড্রয়েড রিলিজের ভলকান dEQP টেস্টও পাস করতে পারে ।
ভলকান ডিইকিউপি (Vulkan dEQP) অ্যান্ড্রয়েড সিটিএস (Android CTS)-এর একটি অংশ। অ্যান্ড্রয়েড ১১ থেকে, সিটিএস-এর ডিইকিউপি টেস্ট রানার কম্পোনেন্টটি android.software.vulkan.deqp.level ফিচার ফ্ল্যাগটি সম্পর্কে অবগত থাকে এবং এমন যেকোনো ভলকান ডিইকিউপি টেস্ট এড়িয়ে যায়, যা এই ফিচার ফ্ল্যাগ অনুসারে ডিভাইসটি সমর্থন করে বলে দাবি করে না। এই ধরনের টেস্টগুলোকে স্বাভাবিকভাবেই পাস করেছে বলে রিপোর্ট করা হয়।