Vulkan , yüksek performanslı 3D grafikler için düşük maliyetli, platformlar arası bir API'dir. OpenGL ES (GLES) gibi, Vulkan da uygulamalarda yüksek kaliteli, gerçek zamanlı grafikler oluşturmak için araçlar sağlar. Vulkan kullanmanın avantajları arasında CPU ek yükünün azaltılması ve SPIR-V İkili Orta Düzey dili desteği yer alır.
Vulkan'ı başarılı bir şekilde uygulamak için bir cihaz şunları içermelidir:
- Android tarafından sağlanan Vulkan yükleyici.
- Vulkan API'sini uygulayan GPU IHV'ler gibi SoC'ler tarafından sağlanan bir Vulkan sürücüsü. Vulkan işlevselliğini desteklemek için Android cihazının Vulkan özellikli GPU donanımına ve ilgili sürücüye ihtiyacı vardır. GPU ayrıca GLES 3.1 ve üstünü desteklemelidir. Sürücü desteği istemek için SoC satıcınıza danışın.
Bir cihaz bir Vulkan sürücüsü içeriyorsa, cihazın FEATURE_VULKAN_HARDWARE_LEVEL
ve FEATURE_VULKAN_HARDWARE_VERSION
sistem özelliklerini, cihazın özelliklerini doğru bir şekilde yansıtan sürümlerle bildirmesi gerekir. Bu, cihazın Uyumluluk Tanımlama Belgesi (CDD) ile uyumlu olmasını sağlamaya yardımcı olur.
Vulkan yükleyici
Vulkan yükleyici platform/frameworks/native/vulkan
, Vulkan uygulamaları ile bir cihazın Vulkan sürücüsü arasındaki birincil arabirimdir. Vulkan yükleyici, /system/lib[64]/libvulkan.so
adresinde kuruludur. Yükleyici, temel Vulkan API giriş noktalarını, Android CDD'nin gerektirdiği uzantıların giriş noktalarını ve birçok ek isteğe bağlı uzantıyı sağlar. Pencere Sistem Entegrasyonu (WSI) uzantıları yükleyici tarafından dışa aktarılır ve öncelikle sürücü yerine yükleyicide uygulanır. Yükleyici ayrıca ek uzantıları açığa çıkarabilen ve sürücüye giden yolda çekirdek API çağrılarını durdurabilen numaralandırma ve yükleme katmanlarını da destekler.
NDK, bağlantı için bir saplama libvulkan.so
kitaplığı içerir. Kitaplık, yükleyiciyle aynı sembolleri dışa aktarır. Uygulamalar, yükleyiciye ilk argümanlarına göre uygun katmana veya sürücüye gönderilen trambolin işlevlerini girmek için gerçek libvulkan.so
kitaplığından dışa aktarılan işlevleri çağırır. vkGet*ProcAddr()
çağrısı, trambolinlerin gönderdiği işlev işaretçilerini döndürür (yani, doğrudan çekirdek API koduna çağrı yapar). Dışa aktarılan semboller yerine işlev işaretçileri aracılığıyla çağrı yapmak, trambolini ve göndermeyi atladığından daha verimlidir.
Sürücü numaralandırma ve yükleme
Sistem görüntüsü oluşturulduğunda Android, sistemin hangi GPU'ların kullanılabilir olduğunu bilmesini bekler. Yükleyici, sürücüyü keşfetmek ve yüklemek için hardware.h
içindeki mevcut HAL mekanizmasını kullanır. 32 bit ve 64 bit Vulkan sürücüleri için tercih edilen yollar şunlardır:
/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 ve sonraki sürümlerde, Vulkan hw_module_t
türevi tek bir hw_module_t
yapısını sarar; yalnızca bir sürücü desteklenir ve HWVULKAN_DEVICE_0
sabit dizesi open()
öğesine iletilir.
Vulkan hw_device_t
türevi, birden çok fiziksel aygıtı destekleyebilen tek bir sürücüye karşılık gelir. hw_device_t
yapısı, vkGetGlobalExtensionProperties()
, vkCreateInstance()
ve vkGetInstanceProcAddr()
işlevlerini dışa aktaracak şekilde genişletilebilir. Yükleyici, hw_device_t
yapısının vkGetInstanceProcAddr()
() işlevini çağırarak diğer tüm VkInstance()
, VkPhysicalDevice()
ve vkGetDeviceProcAddr()
işlevlerini bulabilir.
Katman keşfi ve yükleme
Vulkan yükleyici, ek uzantıları açığa çıkarabilen ve sürücüye giden yolda çekirdek API çağrılarını engelleyebilen numaralandırma ve yükleme katmanlarını destekler. Android, sistem görüntüsünde katmanlar içermez; ancak uygulamalar APK'larında katmanlar içerebilir.
Katmanları kullanırken, Android'in güvenlik modelinin ve politikalarının diğer platformlardan önemli ölçüde farklı olduğunu unutmayın. Özellikle Android, üretim (rootsuz) cihazlarda hata ayıklanamayan bir sürece harici kodun yüklenmesine ve harici kodun işlemin belleğini, durumunu vb. incelemesine veya kontrol etmesine izin vermez. Bu, çekirdek dökümlerini, API izlerini vb. daha sonra incelenmek üzere diske kaydetme yasağını içerir. Üretim cihazlarında yalnızca hata ayıklanamayan uygulamaların parçası olarak sunulan katmanlar etkinleştirilir ve sürücüler bu ilkeleri ihlal eden işlevler sağlamamalıdır.
Katmanlar için kullanım durumları şunları içerir:
- Geliştirme zamanı katmanları — İzleme/profil oluşturma/hata ayıklama araçları için doğrulama katmanları ve şimler, üretim cihazlarının sistem görüntüsüne kurulmamalıdır. İzleme/profil oluşturma/hata ayıklama araçları için doğrulama katmanları ve şimler, bir sistem görüntüsü olmadan güncellenebilir olmalıdır. Geliştirme sırasında bu katmanlardan birini kullanmak isteyen geliştiriciler, örneğin yerel kitaplıklar dizinine bir dosya ekleyerek uygulama paketini değiştirebilir. Değiştirilemeyen uygulamaların sevkiyatındaki arızaları teşhis etmek isteyen IHV ve OEM mühendislerinin, bu uygulamalarda hata ayıklanabilir olmadıkça, sistem görüntüsünün üretim dışı (köklü) yapılarına erişimi olduğu varsayılır. Daha fazla bilgi için Android'deki Vulkan doğrulama katmanlarına bakın.
- Yardımcı katmanlar — Bu katmanlar, aygıt belleği için bir bellek yöneticisi uygulayan bir katman gibi uzantıları ortaya çıkarır. Geliştiriciler, uygulamalarında kullanmak üzere katmanları ve bu katmanların sürümlerini seçer; aynı katmanı kullanan farklı uygulamalar yine de farklı sürümler kullanabilir. Geliştiriciler, uygulama paketlerinde bu katmanlardan hangisinin gönderileceğini seçer.
- Enjekte edilmiş (örtük) katmanlar - Kullanıcı veya başka bir uygulama tarafından, uygulamanın bilgisi veya onayı olmadan sağlanan kare hızı, sosyal ağ ve oyun başlatıcı katmanları gibi katmanları içerir. Bunlar, Android'in güvenlik politikalarını ihlal eder ve desteklenmez.
Hata ayıklanamayan uygulamalar için yükleyici, yalnızca uygulamanın yerel kitaplık dizinindeki katmanları arar ve belirli bir modelle eşleşen bir adla (örneğin, libVKLayer_foo.so
) herhangi bir kitaplığı yüklemeye çalışır.
Hata ayıklanabilir uygulamalar için yükleyici, /data/local/debug/vulkan
içindeki katmanları arar ve belirli bir modelle eşleşen herhangi bir kitaplığı yüklemeye çalışır.
Android, katmanların Android ve diğer platformlar arasında yapı ortamı değişiklikleriyle taşınmasını sağlar. Katmanlar ve yükleyici arasındaki arabirim hakkında ayrıntılar için, bkz . Vulkan Yükleyici Arayüzlerinin Mimarisi . Khronos tarafından korunan doğrulama katmanları, Vulkan Doğrulama Katmanlarında barındırılır.
Vulkan API sürümleri ve yetenekleri
Aşağıdaki tablo, çeşitli Android sürümleri için Vulkan API sürümlerini listeler.Android Sürümü | Vulkan Versiyonu |
---|---|
Android 13 | Volkan 1.3 |
Android 9 | Volkan 1.1 |
Android 7 | Volkan 1.0 |
Vulkan 1.3 İşlevselliğe Genel Bakış
Vulkan 1.3, önceden isteğe bağlı bir dizi uzantıyı Vulkan çekirdek işlevselliğine uygun hale getirir. Bu işlevselliğin çoğu, Vulkan programlama arabirimi üzerindeki denetimi ve ayrıntı düzeyini artırma amacıyla dahil edilmiştir. Tek geçişli oluşturma geçişi örnekleri, artık oluşturma geçişi nesnelerine veya çerçeve arabelleklerine ihtiyaç duymaz. Toplam işlem hattı durumu nesnesi sayısı azaltılabilir ve API içindeki senkronizasyon elden geçirilir. Vulkan 1.3, Vulkan 1.2, 1.1 ve 1.0 ile aynı donanım gereksinimlerine sahiptir ve uygulamanın çoğu çerçevede değil, SoC'ye özgü grafik sürücüsündedir.
Android için en önemli Vulkan 1.3 özellikleri şunlardır:
- Tek geçişli işleme geçiş örnekleri için destek
- Bir gölgelendirici çağrısını hemen sonlandırma desteği
- İşlem hattı oluşturma, paylaşma ve kontrol üzerinde daha ince ayrıntı düzeyi
Vulkan 1.3 ayrıca birkaç küçük özellik ve API kullanılabilirlik geliştirmeleri içerir. Küçük revizyon 1.3 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Çekirdek Revizyonlarında (Vulkan 1.3) bulunabilir.
Vulkan 1.2 İşlevselliğe Genel Bakış
Vulkan 1.2, API yüzeyini basitleştiren bir dizi özellik ve uzantı ekler. Buna birleşik bir Bellek Modeli ve bir aygıt sürücüsünden sorgulanabilecek ek bilgiler dahildir. Vulkan 1.2, Vulkan 1.0 ve 1.1 ile aynı donanım gereksinimlerine sahiptir; tüm uygulama, çerçevede değil, SoC'ye özgü grafik sürücüsündedir.
Android için en önemli Vulkan 1.2 özelliği, 8 bit depolama desteğidir.
Vulkan 1.2 ayrıca birkaç küçük özellik ve API kullanılabilirlik geliştirmesi içerir. Küçük revizyon 1.2 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Çekirdek Revizyonlarında (Vulkan 1.2) bulunabilir.
Vulkan 1.1 İşlevselliğe Genel Bakış
Vulkan 1.1, OEM'lerin cihazlarda Vulkan 1.1'i desteklemesini sağlayan bellek/senkronizasyon birlikte çalışması desteği içerir. Ek olarak, bellek/senkronizasyon birlikte çalışması, geliştiricilerin bir cihazda Vulkan 1.1'in desteklenip desteklenmediğini belirlemesine ve desteklendiğinde onu etkin bir şekilde kullanmasına olanak tanır. Vulkan 1.1, Vulkan 1.0 ile aynı donanım gereksinimlerine sahiptir, ancak uygulamanın çoğu çerçevede değil, SOC'ye özgü grafik sürücüsündedir.
Android için en önemli Vulkan 1.1 özellikleri şunlardır:
- Vulkan dışından bellek arabelleklerini ve senkronizasyon nesnelerini içe ve dışa aktarma desteği (kamera, kodekler ve GLES ile birlikte çalışma için)
- YCbCr formatları için destek
Vulkan 1.1 ayrıca birkaç küçük özellik ve API kullanılabilirlik geliştirmeleri içerir. Küçük revizyon 1.1 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Çekirdek Revizyonlarında (Vulkan 1.1) bulunabilir.
Vulkan Desteğini Seçme
Android cihazlar, 64 bit ABI'yi desteklemeleri ve düşük bellek olmaması koşuluyla, mevcut en gelişmiş Vulkan özellik setini desteklemelidir.
Android 13 ve üzeri sürümlerle başlatılan cihazlar Vulkan 1.3'ü desteklemelidir.
Android 10 üzerinden başlatılan cihazlar Vulkan 1.1'i desteklemelidir.
Diğer cihazlar isteğe bağlı olarak Vulkan 1.3, 1.2 ve 1.1'i destekleyebilir.
Vulkan Sürümünü Destekleme
Bir Android cihaz, aşağıdaki koşullar yerine getirildiğinde Vulkan sürümünü destekler:
- Android sürümünün ek CDD gereksinimlerinin yanı sıra ilgilenilen Vulkan sürümünü destekleyen bir Vulkan sürücüsü ekleyin (bu, Vulkan sürüm 1.3, 1.1 veya 1.0'dan biri olmalıdır). Alternatif olarak, daha düşük bir vulkan sürüm numarasına sahip mevcut bir Vulkan sürücüsünü güncelleyin.
- Vulkan 1.3 veya 1.1 için, paket yöneticisi tarafından döndürülen sistem özelliğinin doğru vulkan sürümü için
true
döndürdüğünden emin olun.- Vulkan 1.3 için özellik
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
. - Vulkan 1.1 için özellik
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
.
device.mk
dosyasına aşağıda gösterilen bir kuralı ekleyerek Vulkan 1.3 ve Vulkan 1.1 içintrue
değerini döndürür.- Vulkan 1.3 için aşağıdakileri ekleyin:
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 için aşağıdakileri ekleyin:
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.3 için özellik
Pencere Sistem Entegrasyonu (WSI)
libvulkan.so
, sürücü aşağıdaki Pencere Sistem Entegrasyonu (WSI) uzantılarını uygular:
-
VK_KHR_surface
-
VK_KHR_android_surface
-
VK_KHR_swapchain
-
VK_KHR_driver_properties
, yalnızca Android 10'da Vulkan 1.1 için uygulandı - Android 10'daki herhangi bir Vulkan sürümü için uygulanan
VK_GOOGLE_display_timing
VkSurfaceKHR
ve VkSwapchainKHR
nesneleri ve ANativeWindow
ile tüm etkileşimler platform tarafından işlenir ve sürücülere açık değildir. WSI uygulaması, sürücü tarafından desteklenmesi gereken VK_ANDROID_native_buffer
uzantısına dayanır; bu uzantı yalnızca WSI uygulaması tarafından kullanılır ve uygulamalara açık değildir.
Gralloc kullanım bayrakları
Vulkan uygulamaları, uygulama tanımlı özel Gralloc kullanım bayraklarıyla tahsis edilecek takas zinciri arabelleklerine ihtiyaç duyabilir. Bir takas zinciri oluştururken Android, sürücüden aşağıdakileri arayarak istenen formatı ve görüntü kullanım bayraklarını Gralloc kullanım bayraklarına çevirmesini ister:
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
ve imageUsage
parametreleri VkSwapchainCreateInfoKHR
yapısından alınmıştır. Sürücü, *grallocConsumerUsage
ve *grallocProducerUsage
biçim ve kullanım için gereken Gralloc kullanım bayraklarıyla doldurmalıdır. Sürücü tarafından döndürülen kullanım bayrakları, arabellek tahsis edilirken takas zinciri tüketicisi tarafından talep edilen kullanım bayraklarıyla birleştirilir.
Android 7.x, VkSwapchainImageUsageFlagsANDROID() vkGetSwapchainGrallocUsageANDROID()
VkSwapchainImageUsageFlagsANDROID()
adlı önceki bir sürümünü çağırır. Android 8.0 ve sonraki sürümleri vkGetSwapchainGrallocUsageANDROID()
kullanımdan kaldırır, ancak sürücü tarafından vkGetSwapchainGrallocUsage2ANDROID()
sağlanmıyorsa yine de vkGetSwapchainGrallocUsageANDROID()
çağırır:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage );
vkGetSwapchainGrallocUsageANDROID()
, takas zinciri kullanım bayraklarını veya genişletilmiş Gralloc kullanım bayraklarını desteklemez.
Gralloc destekli görüntüler
VkNativeBufferANDROID
, Gralloc arabelleği tarafından desteklenen bir görüntü oluşturmak için bir vkCreateImage
uzantı yapısıdır. VkNativeBufferANDROID
, VkImageCreateInfo
yapı zincirinde vkCreateImage()
öğesine sağlanır. VkNativeBufferANDROID ile VkNativeBufferANDROID
vkCreateImage()
çağrıları, vkCreateSwapchainKHR
çağrısı sırasında gerçekleşir. WSI uygulaması, takas zinciri için istenen yerel arabellek sayısını tahsis eder ve ardından her biri için bir VkImage
oluşturur:
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 destekli bir görüntü oluştururken, VkImageCreateInfo
aşağıdaki verilere sahiptir:
.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 ve sonraki sürümlerde platform, takas zinciri için herhangi bir takas zinciri görüntü kullanım bayrağı gerektiğinde vkCreateImage
sağlanan VkImageCreateInfo
zincirinde bir VkSwapchainImageCreateInfoKHR
uzantı yapısı sağlar. Uzantı yapısı, takas zinciri görüntü kullanım bayraklarını içerir:
typedef struct { VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID const void* pNext; VkSwapchainImageUsageFlagsANDROID usage; } VkSwapchainImageCreateInfoANDROID;
Android 10 ve sonraki sürümlerde, platform VK_KHR_swapchain
v70'i destekler, bu nedenle Vulkan uygulaması, takas zinciri belleği tarafından desteklenen bir VkImage
oluşturabilir. Uygulama ilk olarak, VkImageCreateInfo yapısına zincirlenmiş bir VkImageSwapchainCreateInfoKHR
yapısıyla vkCreateImage
VkImageCreateInfo
. Ardından uygulama, VkBindImageMemoryInfo yapısına zincirlenmiş bir VkBindImageMemorySwapchainInfoKHR
yapısıyla vkBindImageMemory2(KHR)
'yi VkBindImageMemoryInfo
. imageIndex
yapısında belirtilen VkBindImageMemorySwapchainInfoKHR
, geçerli bir takas zinciri görüntü dizini olmalıdır. Bu arada platform, VkBindImageMemoryInfo
zincirine karşılık gelen Gralloc arabellek bilgileriyle bir VkNativeBufferANDROID
uzantı yapısı sağlar, böylece sürücü VkImage'ı hangi VkImage
arabelleğiyle bağlayacağını bilir.
Görüntü alma
vkAcquireImageANDROID
, bir takas zinciri görüntüsünün sahipliğini alır ve hem mevcut bir VkSemaphore
nesnesine hem de mevcut bir VkFence
nesnesine harici olarak sinyallenmiş bir yerel çit içe aktarır:
VkResult VKAPI vkAcquireImageANDROID( VkDevice device, VkImage image, int nativeFenceFd, VkSemaphore semaphore, VkFence fence );
vkAcquireImageANDROID()
, uygulama tarafından sağlanan VkSemaphore
ve VkFence
nesnelerine yerel bir çit içe aktarmak için vkAcquireNextImageKHR
sırasında çağrılır (ancak bu çağrıda hem semafor hem de çit nesneleri isteğe bağlıdır). Sürücü bu fırsatı Gralloc arabellek durumundaki herhangi bir harici değişikliği tanımak ve işlemek için de kullanabilir; birçok sürücünün burada bir şey yapmasına gerek kalmayacak. Bu çağrı, VkSemaphore
ve VkFence
, vkQueueSubmit tarafından işaretlenmiş gibi aynı bekleme durumuna sokar, böylece kuyruklar vkQueueSubmit
bekleyebilir ve uygulama çitin üzerinde bekleyebilir.
Temeldeki yerel çit sinyal verdiğinde her iki nesne de sinyallenir; yerel çit zaten sinyal vermişse, bu işlev döndüğünde semafor sinyallenmiş durumdadır. Sürücü, çit dosyası tanımlayıcısının sahipliğini alır ve artık gerekmediğinde çit dosyası tanımlayıcısını kapatır. Sürücü, semafor veya çit nesnesi sağlanmasa veya vkAcquireImageANDROID
başarısız olup bir hata döndürse bile bunu yapmalıdır. Eğer fenceFd
-1 ise, yerel çit zaten işaretlenmiş gibidir.
Görüntüleri serbest bırakma
vkQueueSignalReleaseImageANDROID
, harici kullanım için bir takas zinciri görüntüsü hazırlar, yerel bir çit oluşturur ve giriş semaforları sinyal verdikten sonra yerel çitin sinyallenmesini programlar:
VkResult VKAPI vkQueueSignalReleaseImageANDROID( VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd );
vkQueuePresentKHR()
vkQueueSignalReleaseImageANDROID()
sağlanan kuyrukta vkQueueSignalReleaseImageANDROID() öğesini çağırır. Sürücü, pWaitSemaphores
içindeki tüm waitSemaphoreCount
semaforları sinyal verene ve image
sunuma hazırlamak için gereken ek işler tamamlanana kadar sinyal vermeyen yerel bir çit oluşturmalıdır.
Bekleme semaforları (varsa) zaten sinyal vermişse ve queue
zaten boşsa, sürücü beklenecek bir şey olmadığını belirten gerçek bir yerel çit dosyası tanımlayıcısı yerine *pNativeFenceFd
-1
ayarlayabilir. Arayan, *pNativeFenceFd
içinde döndürülen dosya tanıtıcısının sahibidir ve bu tanımlayıcıyı kapatır.
Birçok sürücü görüntü parametresini yok sayabilir, ancak bazılarının harici görüntü tüketicileri tarafından kullanılmak üzere bir Gralloc arabelleğiyle ilişkili CPU tarafı veri yapılarını hazırlaması gerekebilir. Harici tüketiciler tarafından kullanılmak üzere arabellek içeriğinin hazırlanması, görüntünün VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
geçişinin bir parçası olarak eşzamansız olarak yapılmalıdır.
Görüntü VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID
ile oluşturulmuşsa, sürücü, vkQueueSignalReleaseImageANDROID()
çağrılarına müdahale etmeden vkAcquireImageANDROID()
tekrar tekrar çağrılmasına izin vermelidir.
Paylaşılan prezentabl görüntü desteği
Bazı cihazlar, gecikmeyi en aza indirmek için görüntüleme ardışık düzeni ve Vulkan uygulaması arasında tek bir görüntünün sahipliğini paylaşabilir. Android 9 ve sonraki sürümlerde, yükleyici, sürücünün vkGetPhysicalDeviceProperties2 çağrısına verdiği yanıta göre VK_KHR_shared_presentable_image
uzantısını koşullu olarak vkGetPhysicalDeviceProperties2
.
Sürücü, Vulkan 1.1'i veya VK_KHR_physical_device_properties2
uzantısını desteklemiyorsa, yükleyici, paylaşılan sunulabilir görüntüler için desteğin reklamını yapmaz. Aksi takdirde, yükleyici vkGetPhysicalDeviceProperties2()
çağırarak ve VkPhysicalDeviceProperties2::pNext
zincirine aşağıdaki yapıyı dahil ederek sürücü özelliklerini sorgular:
typedef struct { VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID const void* pNext; VkBool32 sharedImage; } VkPhysicalDevicePresentationPropertiesANDROID;
Sürücü bir görüntünün sahipliğini görüntüleme sistemiyle paylaşabiliyorsa, paylaşılanImage üyesini sharedImage
olarak VK_TRUE
.
doğrulama
OEM'ler, aşağıdakileri içeren CTS'yi kullanarak Vulkan uygulamalarını test edebilir:
- Vulkan 1.0, 1.1, 1.2 ve 1.3 için işlevsel API testleri içeren
CtsDeqpTestCases
modülündeki Khronos Vulkan Uygunluk testleri . - Cihazın desteklediği Vulkan yetenekleri için doğru yapılandırıldığını test eden
CtsGraphicsTestCases
modülü.
Vulkan özelliği bayrağı
Android 11 veya üstünü destekleyen ve Vulkan API'sini destekleyen bir cihazın, android.software.vulkan.deqp.level
özellik bayrağını göstermesi gerekir. Bu özellik bayrağının değeri, bir tamsayı değeri olarak kodlanmış bir tarihtir. Cihazın geçtiğini iddia ettiği Vulkan dEQP testleri ile ilişkili tarihi belirtir.
YYYY-AA-GG biçimindeki bir tarih, aşağıdaki gibi 32 bit tam sayı olarak kodlanır:
- 0-15 bitleri yılı saklar
- 16-23 arasındaki bitler ayı saklar
- 24-31 bitleri günü saklar
Özellik bayrağı için izin verilen minimum değer, Android 10 için Vulkan dEQP testleri ile ilişkili tarih olan 0x07E30301
tarihine karşılık gelen 0x07E30301'dir. Özellik bayrağı en azından bu değerdeyse, cihaz şunları iddia eder: tüm Android 10 Vulkan dEQP testlerini geçin.
0x07E40301
değeri, Android 11 için Vulkan dEQP testleri ile ilişkili tarih olan 2020-03-01 tarihine karşılık gelir. Özellik bayrağı en az bu değer ise, cihaz tüm Android 11 Vulkan dEQP testlerini geçtiğini iddia eder.
0x07E60301
değeri, Android 13 için Vulkan dEQP testleri ile ilişkili tarih olan 2022-03-01 tarihine karşılık gelir. Özellik bayrağı en az bu değerdeyse, cihaz tüm Android 13 Vulkan dEQP testlerini geçtiğini iddia eder.
Belirli bir özellik bayrağını ( yani 0x07E30301
, 0x07E40301
, 0x07E60301
) ortaya çıkaran bir cihaz, o özellik bayrağının (sırasıyla Android 10, Android 11, Android 13) tüm Android Vulkan dEQP testlerini geçtiğini iddia eder. Bu cihaz , daha sonraki bir Android sürümünden Vulkan dEQP testlerini geçebilir.
Vulkan dEQP, Android CTS'nin bir parçasını oluşturur. Android 11'den itibaren, CTS'nin dEQP test çalıştırıcısı bileşeni, android.software.vulkan.deqp.level
özellik işaretinin farkındadır ve - bu özellik işaretine göre - cihazın desteklediğini iddia etmediği tüm Vulkan dEQP testlerini atlar. Bu tür testler önemsiz derecede başarılı olarak rapor edilir.