Vulkan , yüksek performanslı 3D grafiklere yönelik düşük maliyetli, çapraz platformlu bir API'dir. OpenGL ES (GLES) gibi Vulkan da uygulamalarda yüksek kaliteli, gerçek zamanlı grafikler oluşturmaya yönelik araçlar sağlar. Vulkan kullanmanın avantajları arasında CPU yükünün azaltılması ve SPIR-V Binary Intermediate dilinin desteklenmesi yer alır.
Vulkan'ı başarıyla uygulamak için bir cihazın şunları içermesi gerekir:
- 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'nun ayrıca GLES 3.1 ve üstünü desteklemesi gerekir. 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 yeteneklerini doğru şekilde yansıtan sürümlerle beyan etmesi 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 arayüzdür. Vulkan yükleyici /system/lib[64]/libvulkan.so
adresine kurulur. 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 Sistemi 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 çıkarabilecek ve sürücüye giden çekirdek API çağrılarını engelleyebilecek katmanların numaralandırılmasını ve yüklenmesini de 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ükleyicideki trambolin işlevlerini girmek için gerçek libvulkan.so
kitaplığından dışa aktarılan işlevleri çağırır ve bu işlevler, ilk argümanlarına göre uygun katmana veya sürücüye gönderilir. vkGet*ProcAddr()
çağrısı, trambolinlerin gönderdiği işlev işaretçilerini döndürür (yani, doğrudan çekirdek API kodunu çağırır). Dışa aktarılan semboller yerine işlev işaretçileri aracılığıyla çağrı yapmak, trambolini ve gönderimi atladığı için 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ü bulmak ve yüklemek için hardware.h
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 üzeri 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 dizisi open()
öğesine iletilir.
Vulkan hw_device_t
türevi, birden fazla fiziksel cihazı 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 çekirdek API çağrılarını engelleyebilen katmanların numaralandırılmasını ve yüklenmesini destekler. Android, sistem görüntüsüne katmanlar eklemez; 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 (köklendirilmemiş) cihazlarda hata ayıklanamayan bir işleme harici kod yüklenmesine izin vermez ve harici kodun sürecin belleğini, durumunu vb. incelemesine veya kontrol etmesine izin vermez. Bu, çekirdek dökümlerinin, API izlerinin ve benzerlerinin daha sonra incelenmek üzere diske kaydedilmesine ilişkin yasağı da içerir. Üretim cihazlarında yalnızca hata ayıklaması yapılamayan uygulamaların parçası olarak sunulan katmanlar etkinleştirilir ve sürücüler bu politikaları ihlal eden işlevler sağlamamalıdır.
Katmanlara yönelik kullanım örnekleri şunları içerir:
- Geliştirme zamanı katmanları — İzleme/profil oluşturma/hata ayıklama araçlarına yönelik doğrulama katmanları ve dolgular, üretim cihazlarının sistem görüntüsüne kurulmamalıdır. İzleme/profil oluşturma/hata ayıklama araçlarına yönelik doğrulama katmanları ve dolgular, 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 kendi yerel kütüphaneler dizinine bir dosya ekleyerek uygulama paketini değiştirebilir. Değiştirilemeyen uygulamaların gönderilmesindeki hataları teşhis etmek isteyen IHV ve OEM mühendislerinin, bu uygulamalarda hata ayıklama yapılamadığı sürece sistem görüntüsünün üretim dışı (köklü) yapılarına erişime sahip oldukları varsayılır. Daha fazla bilgi için Android'deki Vulkan doğrulama katmanlarına bakın.
- Yardımcı program katmanları — Bu katmanlar, cihaz belleği için bir bellek yöneticisi uygulayan bir katman gibi uzantıları açığa çı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ümleri kullanabilir. Geliştiriciler bu katmanlardan hangilerinin uygulama paketlerinde gönderileceğini seçer.
- Enjekte edilen (örtük) katmanlar — Uygulamanın bilgisi veya izni olmadan kullanıcı veya başka bir uygulama tarafından 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 desenle eşleşen bir adla herhangi bir kitaplığı yüklemeye çalışır (örneğin, libVKLayer_foo.so
).
Hata ayıklanabilir uygulamalar için yükleyici, /data/local/debug/vulkan
içindeki katmanları arar ve belirli bir kalıpla eşleşen herhangi bir kitaplığı yüklemeye çalışır.
Android, katmanların Android ile diğer platformlar arasındaki yapı ortamı değişiklikleriyle taşınmasına olanak tanır. Katmanlar ve yükleyici arasındaki arayüz 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 tabloda çeşitli Android sürümleri için Vulkan API sürümleri listelenmektedir.Android Sürümü | Vulkan Versiyonu |
---|---|
Android 13 | Vulkan 1.3 |
Android 9 | Vulkan 1.1 |
Android7 | Vulkan 1.0 |
Vulkan 1.3 işlevselliğine genel bakış
Vulkan 1.3, önceden isteğe bağlı olan bir dizi uzantıyı Vulkan'ın temel işlevlerine dahil eder. Bu işlevselliğin çoğu, Vulkan programlama arayüzü üzerinde kontrolü ve ayrıntı düzeyini artırmak amacıyla dahil edilmiştir. Tek geçişli işleme geçişi örnekleri artık işleme geçiş nesnelerine veya çerçeve arabelleklerine ihtiyaç duymuyor. İşlem hattı durumu nesnelerinin toplam sayısı azaltılabilir ve API içindeki senkronizasyon elden geçirilebilir. Vulkan 1.3, Vulkan 1.2, 1.1 ve 1.0 ile aynı donanım gereksinimlerine sahiptir; 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şi örnekleri için destek
- Gölgelendirici çağrısının anında sonlandırılması desteği
- İşlem hattı oluşturma, paylaşma ve kontrol konusunda daha ayrıntılı ayrıntı düzeyi
Vulkan 1.3 ayrıca birçok küçük özellik ve API kullanılabilirliği geliştirmeleri içeriyor. Küçük revizyon 1.3 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Temel Revizyonlar (Vulkan 1.3) adresinde bulunabilir.
Vulkan 1.2 işlevselliğine 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.
Vulkan 1.2'nin Android için en önemli özelliği 8 bit depolama desteğidir.
Vulkan 1.2 ayrıca birçok küçük özellik ve API kullanılabilirliği geliştirmeleri içeriyor. Küçük revizyon 1.2 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Temel Revizyonlar (Vulkan 1.2) adresinde bulunabilir.
Vulkan 1.1 işlevselliğine genel bakış
Vulkan 1.1, OEM'lerin cihazlarda Vulkan 1.1'i desteklemesine olanak tanıyan bellek/senkronizasyon birlikte çalışma desteğini içerir. Ek olarak, bellek/senkronizasyon birlikte çalışması, geliştiricilerin Vulkan 1.1'in bir cihazda desteklenip desteklenmediğini belirlemesine ve desteklendiğinde bunu etkili 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:
- Bellek arabelleklerini ve senkronizasyon nesnelerini Vulkan dışından içe ve dışa aktarma desteği (kamera, kodlayıcılar ve GLES ile birlikte çalışma için)
- YCbCr formatları desteği
Vulkan 1.1 ayrıca birkaç küçük özellik ve API kullanılabilirliği geliştirmeleri içeriyor. Küçük revizyon 1.1 ile çekirdek Vulkan API'sinde yapılan tüm değişiklikler Temel Revizyonlar (Vulkan 1.1) adresinde bulunabilir.
Vulkan desteğini seçin
Android cihazlar, 64 bit ABI'yi desteklemeleri ve belleğin düşük olmaması koşuluyla, mevcut en gelişmiş Vulkan özellik setini desteklemelidir.
Android 13 ve sonraki sürümlerle başlatılan cihazların Vulkan 1.3'ü desteklemesi gerekir.
Android 10 ile başlatılan cihazların Vulkan 1.1'i desteklemesi gerekiyor.
Diğer cihazlar isteğe bağlı olarak Vulkan 1.3, 1.2 ve 1.1'i destekleyebilir.
Vulkan sürümünü destekleyin
Bir Android cihazı, aşağıdaki koşulların karşılanması durumunda Vulkan sürümünü destekler:
- Android sürümünün ek CDD gereksinimlerinin yanı sıra ilgilenilen Vulkan sürümünü (bu, Vulkan sürüm 1.3, 1.1 veya 1.0'dan biri olmalıdır) destekleyen bir Vulkan sürücüsü ekleyin. Alternatif olarak mevcut bir Vulkan sürücüsünü daha düşük bir Vulkan sürüm numarasına güncelleyin.
- Vulkan 1.3 veya 1.1 için, paket yöneticisinin döndürdüğü 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)
şeklindedir.
device.mk
dosyasına bir kural ekleyerek Vulkan 1.3 ve Vulkan 1.1 içintrue
döndürecektir.- Vulkan 1.3 için şunu 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 şunu 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
Android Baseline profili (ABP)
Tüm Android cihazlarının, Android Baseline profil kılavuzunda belirtildiği gibi en son Android Baseline 2022 profiline uymasını öneririz.
Android 14 veya üstünü ve Vulkan API'yi destekleyen tüm cihazlar, Android Baseline 2021 profilinde tanımlanan tüm işlevleri karşılamalıdır. Gerekli işlevlerin tam listesi Vulkan profili json
dosyasında sıralanmıştır, ancak gerekli işlevlerin önemli bir alt kümesi şunları içerir:
- ASTC ve ETC aracılığıyla sıkıştırılmış dokular.
-
VK_EXT_swapchain_colorspace
aracılığıyla değişken renk alanları. -
sampleRateShading
aracılığıyla örnek gölgeleme ve çoklu örnek enterpolasyonu.
Pencere sistemi entegrasyonu (WSI)
libvulkan.so
sürücü aşağıdaki pencere sistemi 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ı -
VK_GOOGLE_display_timing
, Android 10'daki tüm Vulkan sürümleri için uygulandı
VkSurfaceKHR
ve VkSwapchainKHR
nesneleri ve ANativeWindow
ile olan tüm etkileşimler platform tarafından yönetilir 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ğıdaki çağrıyı yaparak 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ınır. Sürücü, *grallocConsumerUsage
ve *grallocProducerUsage
alanlarını format ve kullanım için gerekli Gralloc kullanım bayraklarıyla doldurmalıdır. Sürücü tarafından döndürülen kullanım bayrakları, arabellekler tahsis edilirken takas zinciri tüketicisi tarafından talep edilen kullanım bayraklarıyla birleştirilir.
Android 7.x, VkSwapchainImageUsageFlagsANDROID()
öğesinin vkGetSwapchainGrallocUsageANDROID()
adlı önceki bir sürümünü çağırır. Android 8.0 ve üzeri, vkGetSwapchainGrallocUsageANDROID()
işlevini kullanımdan kaldırır ancak sürücü tarafından vkGetSwapchainGrallocUsageANDROID()
sağlanmadıysa yine de vkGetSwapchainGrallocUsage2ANDROID()
) öğesini çağırır:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage );
vkGetSwapchainGrallocUsageANDROID()
swapchain kullanım bayraklarını veya genişletilmiş Gralloc kullanım bayraklarını desteklemez.
Gralloc destekli görseller
VkNativeBufferANDROID
Gralloc arabelleği tarafından desteklenen bir görüntü oluşturmaya yönelik bir vkCreateImage
uzantı yapısıdır. VkNativeBufferANDROID
VkImageCreateInfo
yapı zincirindeki vkCreateImage()
işlevine sağlanır. VkNativeBufferANDROID
ile vkCreateImage()
çağrıları, vkCreateSwapchainKHR
çağrısı sırasında gerçekleşir. WSI uygulaması, takas zinciri için talep edilen 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 üzeri 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örseli 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, böylece Vulkan uygulaması takas zinciri belleğiyle desteklenen bir VkImage
oluşturabilir. Uygulama ilk önce VkImageSwapchainCreateInfoKHR
yapısıyla VkImageCreateInfo
yapısına zincirlenmiş olarak vkCreateImage
çağırır. Daha sonra uygulama, VkBindImageMemoryInfo
yapısına zincirlenmiş bir VkBindImageMemorySwapchainInfoKHR
yapısıyla vkBindImageMemory2(KHR)
öğesini çağırır. VkBindImageMemorySwapchainInfoKHR
yapısında belirtilen imageIndex
geçerli bir swapchain görüntü dizini olmalıdır. Bu arada platform, VkBindImageMemoryInfo
zincirine karşılık gelen Gralloc arabellek bilgilerini içeren bir VkNativeBufferANDROID
uzantı yapısı sağlar, böylece sürücü VkImage
hangi Gralloc arabelleğiyle bağlayacağını bilir.
Görüntüleri edinin
vkAcquireImageANDROID
bir takas zinciri görüntüsünün sahipliğini alır ve harici olarak sinyallenen yerel çiti hem mevcut bir VkSemaphore
nesnesine hem de mevcut bir VkFence
nesnesine 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 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ü ayrıca 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 hiçbir şey yapmasına gerek kalmayacak. Bu çağrı, VkSemaphore
ve VkFence
vkQueueSubmit
tarafından sinyal verilmiş gibi aynı bekleme durumuna sokar, böylece kuyruklar semaforda bekleyebilir ve uygulama çitte bekleyebilir.
Her iki nesne de, alttaki doğal çit sinyali verdiğinde sinyal alır; yerel çit zaten sinyal vermişse, bu fonksiyon geri döndüğünde semafor sinyal verilmiş durumdadır. Sürücü, çit dosyası tanımlayıcısının sahipliğini alır ve artık ihtiyaç duyulmadığında çit dosyası tanımlayıcısını kapatır. Bir semafor veya çit nesnesi sağlanmasa veya vkAcquireImageANDROID
başarısız olup bir hata döndürse bile sürücünün bunu yapması gerekir. Eğer fenceFd
-1 ise, sanki yerel çit zaten sinyallenmiş gibi olur.
Resimleri yayınla
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 planlar:
VkResult VKAPI vkQueueSignalReleaseImageANDROID( VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd );
vkQueuePresentKHR()
sağlanan kuyrukta vkQueueSignalReleaseImageANDROID()
öğesini çağırır. Sürücünün, pWaitSemaphores
sinyalindeki tüm waitSemaphoreCount
semaforları sinyalini verene ve image
sunuma hazırlamak için gereken ek çalışmalar tamamlanana kadar sinyal vermeyen yerel bir çit üretmesi gerekir.
Bekleme semaforları (varsa) zaten sinyal verdiyse ve queue
zaten boşsa, sürücü gerçek bir yerel çit dosyası tanımlayıcısı yerine *pNativeFenceFd
-1
olarak ayarlayabilir, bu da beklenecek bir şey olmadığını gösterir. Arayan, *pNativeFenceFd
içinde döndürülen dosya tanımlayıcının sahibidir ve onu kapatır.
Çoğu sürücü görüntü parametresini göz ardı edebilir, ancak bazılarının harici görüntü tüketicileri tarafından kullanılmak üzere Gralloc arabelleğiyle ilişkili CPU tarafı veri yapılarını hazırlaması gerekebilir. Arabellek içeriklerinin harici tüketiciler tarafından kullanılmak üzere hazırlanması, görüntünün VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
geçirilmesinin 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ünün vkQueueSignalReleaseImageANDROID()
çağrılarına müdahale etmeden vkAcquireImageANDROID()
çağrılarına müdahale etmeden tekrar tekrar çağrılmasına izin vermesi gerekir.
Paylaşılan prezantabl görüntü desteği
Bazı cihazlar, gecikmeyi en aza indirmek için ekran hattı ile 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 tanıtır.
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ülere yönelik desteğin reklamını yapmaz. Aksi takdirde yükleyici, vkGetPhysicalDeviceProperties2()
çağırarak ve aşağıdaki yapıyı VkPhysicalDeviceProperties2::pNext
zincirine dahil ederek sürücü yeteneklerini 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, sharedImage
üyesini VK_TRUE
olarak ayarlar.
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 testlerini içeren
CtsDeqpTestCases
modülündeki Khronos Vulkan Uyumluluk testleri . - Cihazın desteklediği Vulkan özelliklerine göre doğru şekilde 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 işaretini göstermesi gerekir. Bu özellik bayrağının değeri, tamsayı değeri olarak kodlanmış bir tarihtir. Cihazın geçtiğini iddia ettiği Vulkan dEQP testleriyle ilişkili tarihi belirtir.
YYYY-AA-GG formundaki bir tarih, 32 bitlik bir tamsayı olarak aşağıdaki şekilde kodlanır:
- 0-15 arası bitler yılı saklar
- 16-23 arası bitler ayı saklar
- Bit 24-31 günü saklar
Özellik bayrağı için izin verilen minimum değer 0x07E30301
ve bu, Android 10 için Vulkan dEQP testleriyle ilişkili tarih olan 2019-03-01 tarihine karşılık gelir. Özellik bayrağı en azından bu değerse cihaz, Android 10 Vulkan dEQP testlerinin tümünü geçin.
0x07E40301
değeri, Android 11 için Vulkan dEQP testleriyle ilişkili tarih olan 2020-03-01 tarihine karşılık gelir. Özellik bayrağı en azından bu değerse cihaz, Android 11 Vulkan dEQP testlerinin tümünü geçtiğini iddia eder.
0x07E60301
değeri, Android 13 için Vulkan dEQP testleriyle ilişkili tarih olan 2022-03-01 tarihine karşılık gelir. Özellik bayrağı en azından bu değerse cihaz, Android 13 Vulkan dEQP testlerinin tümünü geçtiğini iddia eder.
Belirli bir özellik işaretini ( yani 0x07E30301
, 0x07E40301
, 0x07E60301
) açığa çıkaran bir cihaz, bu özellik işaretinin tüm Android Vulkan dEQP testlerini (sırasıyla Android 10, Android 11, Android 13) geçtiğini iddia eder. Bu cihaz, daha sonraki bir Android sürümüne ait Vulkan dEQP testlerini geçebilir .
Vulkan dEQP, Android CTS'nin bir parçasını oluşturur. Android 11'den itibaren, CTS'nin dEQP testi çalıştırma 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 testlerin önemsiz derecede başarılı olduğu bildiriliyor.