Vulkan'ı uygulayın

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:

  1. 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.
  2. 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.
    Paket yöneticisi, aşağıda gösterilen şekilde uygun bir device.mk dosyasına bir kural ekleyerek Vulkan 1.3 ve Vulkan 1.1 için true 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
      

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.