Vulkan'ı Uygulama

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 yükü azaltma ve SPIR-V Binary Intermediate dili desteği yer alır.

Vulkan'ın başarıyla uygulanabilmesi için cihazın şunları içermesi gerekir:

  • Android tarafından sağlanan Vulkan yükleyici.
  • Vulkan API'yi uygulayan, GPU IHV gibi SoC'ler tarafından sağlanan bir Vulkan sürücüsü. Vulkan işlevini desteklemek için Android cihazın Vulkan özellikli GPU donanımına ve ilgili sürücüye ihtiyacı vardır. GPU, GLES 3.1 ve sonraki sürümleri de desteklemelidir. Sürücü desteği istemek için SoC tedarikçinizle iletişime geçin.

Bir cihazda Vulkan sürücüsü varsa cihazın, FEATURE_VULKAN_HARDWARE_LEVEL ve FEATURE_VULKAN_HARDWARE_VERSION sistem özelliklerini, cihazın özelliklerini doğru yansıtan sürümlerle bildirmesi gerekir. Bu, cihazın Uyumluluk Tanımlama Belgesi'ne (CDD) uygun olmasını sağlar.

Vulkan yükleyici

Vulkan yükleyici platform/frameworks/native/vulkan, Vulkan uygulamaları ile cihazın Vulkan sürücüsü arasındaki birincil arayüzdür. Vulkan yükleyicisi /system/lib[64]/libvulkan.so'e yüklenir. Yükleyici, temel Vulkan API giriş noktalarını, Android CDD tarafından zorunlu kılınan uzantıların giriş noktalarını ve birçok ek isteğe bağlı uzantı sağlar. Pencere Sistemi Entegrasyonu (WSI) uzantıları, yükleyici tarafından dışa aktarılır ve öncelikli olarak sürücü yerine yükleyiciye uygulanır. Yükleyici, ek uzantılar gösterebilen ve sürücüye giderken temel API çağrılarını engelleyebilecek katmanların listelenmesini ve yüklenmesini de destekler.

NDK, bağlama yönelik bir libvulkan.so kitaplığı içerir. Kitaplık, yükleyiciyle aynı sembolleri dışa aktarır. Uygulamalar, gerçek libvulkan.so kitaplığından dışa aktarılan işlevleri çağırarak yükleyiciye trampolin işlevleri girer. Bu işlevler, ilk bağımsız değişkenlerine göre uygun katmana veya sürücüye dağıtılır. vkGet*ProcAddr() çağrısı, trambolinlerin dağıttığı işlev işaretçilerini döndürür (yani doğrudan temel API kodunu çağırır). Dışa aktarılan semboller yerine işlev işaretçilerini çağırmak, trambolini ve dağıtım işlemini 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ü bulup 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 sonraki sürümlerde Vulkan hw_module_t türevi tek bir hw_module_t yapısını sarmalar; yalnızca bir sürücü desteklenir ve sabit dize HWVULKAN_DEVICE_0, open()'ye iletilir.

Vulkan hw_device_t türevi, birden fazla fiziksel cihazı destekleyebilecek 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() öğesini ç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 sunabilen ve sürücüye giden temel API çağrılarını engelleyebilecek katmanların listelenmesini ve yüklenmesini destekler. Android, sistem resminde katman içermez. Ancak uygulamalar APK'larına katman ekleyebilir.

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 cihazlarında (rootlanmamış) hata ayıklama yapılamayan bir sürece harici kod yüklenmesine izin vermez. Ayrıca harici kodun, sürecin belleğini, durumunu vb. incelemesine veya kontrol etmesine izin vermez. Buna, daha sonra incelenmek üzere çekirdek dökümleri, API izlemeleri vb. dosyaların diske kaydedilmesinin yasaklanması da dahildir. Üretim cihazlarında yalnızca hata ayıklanamayan uygulamaların bir parçası olarak sağlanan katmanlar etkinleştirilir ve sürücüler, bu politikaları ihlal eden işlevler sunmamalıdır.

Katmanların kullanım alanları şunlardır:

  • Geliştirme aşamasındaki katmanlar: İzleme/profil oluşturma/hata ayıklama araçları için doğrulama katmanları ve ara katmanlar, üretim cihazlarının sistem resmine yüklenmemelidir. İzleme/profil oluşturma/hata ayıklama araçları için doğrulama katmanları ve ara katmanlar, sistem görüntüsü olmadan güncellenebilir olmalıdır. Geliştirme sırasında bu katmanlardan birini kullanmak isteyen geliştiriciler, uygulama paketini değiştirebilir (ör. yerel kitaplıklar dizinine dosya ekleyerek). Değiştirilemeyen uygulamaların dağıtımındaki 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ışı (rootlu) derlemelerine erişimi olduğu varsayılır. Daha fazla bilgi için Android'de Vulkan doğrulama katmanları başlıklı makaleyi inceleyin.
  • Yardımcı program katmanları: Bu katmanlar, cihaz belleği için bellek yöneticisi uygulayan bir katman gibi uzantıları gösterir. Geliştiriciler, uygulamalarında kullanacakları 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 hangi katmanların gönderileceğini seçer.
  • Yerleştirilen (örtülü) katmanlar: Uygulamanın bilgisi veya izni olmadan kullanıcı ya da başka bir uygulama tarafından sağlanan kare hızı, sosyal ağ ve oyun başlatıcı yer paylaşımları gibi katmanları içerir. Bunlar Android'in güvenlik politikalarını ihlal ettiğinden desteklenmez.

Hata ayıklama yapılamayan uygulamalarda yükleyici, katmanları yalnızca uygulamanın yerel kütüphane dizininde arar ve adı belirli bir kalıpla (örneğin, libVKLayer_foo.so) eşleşen tüm kütüphaneleri yüklemeye çalışır.

Hata ayıklama yapılabilir uygulamalarda yükleyici, /data/local/debug/vulkan içinde katmanlar arar ve belirli bir kalıpla eşleşen tüm kitaplıkları yüklemeye çalışır.

Android, katmanların Android ile diğer platformlar arasında derleme ortamı değişiklikleriyle taşınmasını sağlar. Katmanlar ile yükleyici arasındaki arayüz hakkında ayrıntılı bilgi için Vulkan Yükleyici Arayüzlerinin Mimarisi başlıklı makaleyi inceleyin. Khronos tarafından yönetilen doğrulama katmanları Vulkan Doğrulama Katmanları'nda barındırılır.

Vulkan API sürümleri ve özellikleri

Aşağıdaki tabloda, çeşitli Android sürümleri için Vulkan API sürümleri listelenmektedir.
Android Sürümü Vulkan sürümü
Android 13 Vulkan 1.3
Android 9 Vulkan 1.1
Android 7 Vulkan 1.0

Vulkan 1.3 işlevlerine genel bakış

Vulkan 1.3, daha önce isteğe bağlı olan bazı uzantıları Vulkan'ın temel işlevlerine dahil etti. Bu işlevlerin çoğu, Vulkan programlama arayüzü üzerinde kontrol ve ayrıntı düzeyini artırmak amacıyla eklenmiştir. Tek geçişli oluşturma geçişi örnekleri, artık oluşturma geçişi nesnelerine veya framebuffer'lara ihtiyaç duymuyor. Toplam ardışık düzen durum nesnesi sayısı azaltılabilir ve API'deki senkronizasyon tamamen yenilenir. Vulkan 1.3, Vulkan 1.2, 1.1 ve 1.0 ile aynı donanım gereksinimlerine sahiptir. Uygulamanın büyük kısmı çerçevede değil, SoC'ye özel grafik sürücüsündedir.

Android için Vulkan 1.3'ün en önemli özellikleri şunlardır:

  • Tek geçişli oluşturma geçişi örnekleri için destek
  • Gölgelendirici çağrısının hemen sonlandırılması için destek
  • Ardışık düzen oluşturma, paylaşma ve kontrol üzerinde daha ayrıntılı düzeyde denetim

Vulkan 1.3, birkaç küçük özellik ve API kullanılabilirliğiyle ilgili iyileştirmeler de içerir. Temel Vulkan API'de küçük revizyon 1.3 ile yapılan tüm değişiklikler Core Revisions (Vulkan 1.3) bölümünde bulunabilir.

Vulkan 1.2 işlevlerine genel bakış

Vulkan 1.2, API yüzeyini basitleştiren çeşitli özellikler ve uzantılar ekler. Buna birleşik bir Bellek Modeli ve cihaz sürücüsünden sorgulanabilir 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 özel grafik sürücüsündedir.

Android için en önemli Vulkan 1.2 özelliği, 8 bit depolama desteğidir.

Vulkan 1.2, birkaç küçük özellik ve API kullanılabilirliğiyle ilgili iyileştirmeler de içerir. Temel Vulkan API'de küçük revizyon 1.2 ile yapılan tüm değişiklikler Core Revisions (Vulkan 1.2) bölümünde bulunabilir.

Vulkan 1.1 işlevlerine genel bakış

Vulkan 1.1, OEM'lerin cihazlarda Vulkan 1.1'i desteklemesine olanak tanıyan bellek/senkronizasyon birlikte çalışabilirliği desteği içerir. Ayrıca, bellek/senkronizasyon birlikte çalışabilirliği, geliştiricilerin Vulkan 1.1'in bir cihazda desteklenip desteklenmediğini belirlemesine ve destekleniyorsa 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 özel grafik sürücüsündedir.

Android için en önemli Vulkan 1.1 özellikleri şunlardır:

  • Vulkan dışından bellek arabelleklerinin ve senkronizasyon nesnelerinin içe ve dışa aktarılması desteği (kamera, codec'ler ve GLES ile birlikte çalışabilirlik için)
  • YCbCr biçimleri için destek

Vulkan 1.1, birkaç küçük özellik ve API kullanılabilirliğiyle ilgili geliştirmeler de içerir. 1.1 küçük düzeltmesi ile temel Vulkan API'sinde yapılan tüm değişiklikleri Temel Düzeltmeler (Vulkan 1.1) bölümünde bulabilirsiniz.

Vulkan desteğini seçme

Android cihazlar, 64 bit ABI'yi desteklemeleri ve düşük bellek kapasitesine sahip olmamaları koşuluyla mevcut en gelişmiş Vulkan özellik grubunu desteklemelidir.

Android 13 ve sonraki sürümlerin yüklü olduğu cihazlar Vulkan 1.3'ü desteklemelidir.

Android 10 ile kullanıma sunulan 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

Aşağıdaki koşullar karşılanıyorsa Android cihazlar Vulkan sürümlerini destekler:

  1. Android sürümünün ek CDD şartlarını yerine getirmek için, istenen Vulkan sürümünü (Vulkan 1.3, 1.1 veya 1.0 sürümlerinden 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.
  2. 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 değerini döndürdüğünden emin olun.
    • Vulkan 1.3 için bu özellik PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000) şeklindedir.
    • Vulkan 1.1 için bu özellik PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000) olarak ayarlanır.
    Paket yöneticisi, uygun bir device.mk dosyasına aşağıdaki gibi gösterilen bir kural ekleyerek Vulkan 1.3 ve Vulkan 1.1 için true 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
      

Android temel profili (ABP)

Tüm Android cihazların, Android Baseline profil kılavuzunda belirtildiği gibi en son Android Baseline 2022 profiline uymasını öneririz.

Android 14 veya sonraki sürümleri 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 belirtilmiştir 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 uzaylarını kullanın.
  • sampleRateShading aracılığıyla örnek gölgeleme ve çok örnekli kesme

Pencere sistem entegrasyonu (WSI)

libvulkan.so sürücüsü 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 uygulanır
  • VK_GOOGLE_display_timing, Android 10'daki tüm Vulkan sürümleri için uygulanır

VkSurfaceKHR ve VkSwapchainKHR nesneleri ile ANativeWindow ile tüm etkileşimler platform tarafından işlenir ve sürücülere gösterilmez. WSI uygulaması, sürücü tarafından desteklenmesi gereken VK_ANDROID_native_buffer uzantısını kullanır. Bu uzantı yalnızca WSI uygulaması tarafından kullanılır ve uygulamalara gösterilmez.

Gralloc kullanım işaretleri

Vulkan uygulamalarında, takas zinciri arabelleklerinin uygulama tanımlı özel Gralloc kullanım işaretleriyle ayrılması gerekebilir. Android, takas zinciri oluştururken sürücüden aşağıdakileri çağırarak istenen biçim ve resim kullanım işaretlerini Gralloc kullanım işaretlerine ç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 değerlerini biçim ve kullanım için gereken Gralloc kullanım işaretleriyle doldurmalıdır. Sürücü tarafından döndürülen kullanım işaretleri, arabellek ayırırken takas zinciri tüketicisi tarafından istenen kullanım işaretleriyle birleştirilir.

Android 7.x, VkSwapchainImageUsageFlagsANDROID() uygulamasının vkGetSwapchainGrallocUsageANDROID() adlı önceki bir sürümünü çağırır. Android 8.0 ve sonraki sürümler vkGetSwapchainGrallocUsageANDROID() vkGetSwapchainGrallocUsageANDROID() özelliğini kullanımdan kaldırır ancak vkGetSwapchainGrallocUsage2ANDROID() sürücü tarafından sağlanmıyorsa vkGetSwapchainGrallocUsageANDROID() işlevini çağırmaya devam eder:

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

vkGetSwapchainGrallocUsageANDROID(), takas zinciri kullanım işaretlerini veya genişletilmiş Gralloc kullanım işaretlerini desteklemez.

Gralloc destekli resimler

VkNativeBufferANDROID, Gralloc arabelleği tarafından desteklenen bir resim oluşturmak için kullanılan bir vkCreateImage uzantı yapısıdır. VkNativeBufferANDROID, VkImageCreateInfo yapı zincirinde vkCreateImage() için sağlanır. VkNativeBufferANDROID ile vkCreateImage() numaralı telefona yapılan aramalar, vkCreateSwapchainKHR numaralı telefona yapılan arama sırasında gerçekleşir. WSI uygulaması, takas zinciri için istenen yerel arabellek sayısını ayırır 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 resim 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 resim kullanım işareti gerektiğinde vkCreateImage'ye sağlanan VkImageCreateInfo zincirinde bir VkSwapchainImageCreateInfoKHR uzantı yapısı sağlar. Uzantı yapısı, takas zinciri resim kullanım işaretlerini 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, önce VkImageCreateInfo yapısına zincirlenmiş bir VkImageSwapchainCreateInfoKHR yapısıyla vkCreateImage işlevini çağırır. Ardından uygulama, VkBindImageMemoryInfo yapısına zincirlenmiş bir VkBindImageMemorySwapchainInfoKHR yapısıyla vkBindImageMemory2(KHR)'ü çağırır. VkBindImageMemorySwapchainInfoKHR yapısında belirtilen imageIndex, geçerli bir takas zinciri resim dizini olmalıdır. Bu sırada 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 öğesini hangi Gralloc arabelleğine bağlayacağını bilir.

Görüntü edinme

vkAcquireImageANDROID, bir takas zinciri resminin sahipliğini alır ve harici olarak sinyalize edilen yerel bir ç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 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ü, Gralloc arabellek durumundaki harici değişiklikleri tanımak ve işlemek için de bu fırsattan yararlanabilir. Birçok sürücünün burada herhangi bir işlem yapması gerekmez. Bu çağrı, VkSemaphore ve VkFence cihazlarını vkQueueSubmit sinyaliyle gönderilenle aynı bekleme durumuna geçirir. Böylece sıralar semaforda bekleyebilir ve uygulama, sınır tanımaz.

Temel yerel çit sinyal gönderdiğinde her iki nesne de sinyal alır. Yerel çit zaten sinyal göndermişse bu işlev döndürüldüğünde semafor sinyallenmiş durumda olur. Sürücü, çit dosya tanımlayıcısının sahipliğini alır ve artık gerekli olmadığında çit dosya tanımlayıcısını kapatır. Sürücü, semafor veya çit nesnesi sağlanmasa bile veya vkAcquireImageANDROID başarısız olup hata döndürse bile bunu yapmalıdır. fenceFd -1 ise yerel çit zaten sinyallenmiş gibidir.

Resimleri yayınlama

vkQueueSignalReleaseImageANDROID; harici kullanım için bir değişim zinciri görüntüsü hazırlar, yerel bir çit oluşturur ve giriş semaforları sinyal aldıktan sonra yerel çitin sinyalini planlar:

VkResult VKAPI vkQueueSignalReleaseImageANDROID(
    VkQueue             queue,
    uint32_t            waitSemaphoreCount,
    const VkSemaphore*  pWaitSemaphores,
    VkImage             image,
    int*                pNativeFenceFd
);

Sağlanan sırada vkQueuePresentKHR() vkQueueSignalReleaseImageANDROID() araması Sürücü, pWaitSemaphores sinyalindeki tüm waitSemaphoreCount semaforlar görünene kadar sinyal vermeyen yerel bir çit üretmeli ve image projesini sunum tamamlanmak üzere hazırlamak için gereken ek çalışmalar yapmalıdır.

Bekleme semaforları (varsa) zaten sinyal verdiyse ve queue zaten boştaysa sürücü, *pNativeFenceFd değerini gerçek bir yerel çit dosya tanımlayıcısı yerine -1 olarak ayarlayarak bekleyecek bir şey olmadığını gösterir. *pNativeFenceFd içinde döndürülen dosya tanımlayıcısının sahibi ve kapatıcısı arayan olur.

Birçok sürücü, resim parametresini yoksayabilir ancak bazı sürücülerin, harici resim tüketicileri tarafından kullanılmak üzere Gralloc arabelleğiyle ilişkili CPU taraflı veri yapılarını hazırlaması gerekebilir. Arabellek içeriklerinin harici tüketiciler tarafından kullanılması için hazırlanması, resmin VK_IMAGE_LAYOUT_PRESENT_SRC_KHR'e 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şturulduysa sürücü, vkAcquireImageANDROID() çağrıları olmadan vkQueueSignalReleaseImageANDROID()'ın tekrar tekrar çağrılmasına izin vermelidir.

Paylaşılan, sunulacak resim desteği

Bazı cihazlar, gecikmeyi en aza indirmek için tek bir resmin sahipliğini ekran ardışık düzeni ile Vulkan uygulaması arasında 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 bağlı olarak VK_KHR_shared_presentable_image uzantısının reklamını koşullu olarak yapar.

Sürücü, Vulkan 1.1 veya VK_KHR_physical_device_properties2 uzantısını desteklemiyorsa yükleyici, paylaşılan sunuma yönelik resimleri desteklemez. Aksi takdirde, yükleyici vkGetPhysicalDeviceProperties2() yöntemini çağırıp aşağıdaki yapıyı VkPhysicalDeviceProperties2::pNext zincirine ekleyerek 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 resmin sahipliğini ekran sistemiyle paylaşabiliyorsa sharedImage üyesini VK_TRUE olarak ayarlar.

Doğrulama

OEM'ler, Vulkan uygulamalarını CTS'yi kullanarak test edebilir. CTS aşağıdakileri içerir:

  • Vulkan 1.0, 1.1, 1.2 ve 1.3 için işlevsel API testlerini içeren CtsDeqpTestCases modülündeki Khronos Vulkan Uygunluk testleri.
  • Cihazın desteklediği Vulkan özellikleri için doğru şekilde yapılandırıldığını test eden CtsGraphicsTestCases modülü.

Vulkan özellik bayrağı

Android 11 veya sonraki sürümleri ve Vulkan API'yi destekleyen bir cihazın, android.software.vulkan.deqp.level özellik işaretini göstermesi gerekir. Bu özellik işaretinin değeri, tam sayı değeri olarak kodlanmış bir tarihtir. Cihazın geçtiğini iddia ettiği Vulkan dEQP testleriyle ilişkili tarihi belirtir.

YYYY-AA-GG biçimindeki tarihler 32 bitlik bir tam sayı olarak aşağıdaki şekilde kodlanır:

  • 0-15 bitleri yılı saklar.
  • Aylık 16-23 arası bitler depolanıyor
  • 24-31 bitleri günü saklar.

Özellik işareti için izin verilen minimum değer 0x07E30301'tür. Bu değer, Android 10 için Vulkan dEQP testleriyle ilişkili tarih olan 01.03.2019'a karşılık gelir. Özellik işareti en az bu değerdeyse cihaz, Android 10 Vulkan dEQP testlerinin tümünü geçtiğini iddia eder.

0x07E40301 değeri, 01.03.2020 tarihine karşılık gelir. Bu, Android 11 için Vulkan dEQP testleriyle ilişkilendirilen tarihtir. Özellik işareti en az bu değerdeyse 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 01.03.2022 tarihine karşılık gelir. Özellik işareti en az bu değerdeyse cihaz, Android 13 Vulkan dEQP testlerinin tümünü geçtiğini iddia eder.

Belirli bir özellik işaretini (ör. 0x07E30301, 0x07E40301, 0x07E60301) gösteren bir cihaz, söz konusu özellik işaretiyle ilgili 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ünün Vulkan dEQP testlerini geçebilir.

Vulkan dEQP, Android CTS'nin bir parçasıdır. CTS'nin dEQP test koşusu bileşeni, Android 11'den itibaren android.software.vulkan.deqp.level özellik işaretini biliyor ve bu özellik işaretine göre cihazın desteklediğini iddia etmediği tüm Vulkan dEQP testlerini atlar. Bu tür testler, basit bir şekilde geçiyor olarak raporlanır.