Vulkan'ı uygulamak

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:

  1. 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.
  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 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) .
    Paket yöneticisi, uygun bir device.mk dosyasına aşağıda 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
      

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.