Vulkan'ı Uygulama

Vulkan düşük bir genel giderdir. Yüksek performanslı 3D için platformlar arası API gösterir. OpenGL ES (GLES) gibi, Vulkan, yüksek kaliteli, çok çeşitli gerçek zamanlı grafiklere sahip oluyorsunuz. Vulkan kullanmanın avantajları arasında CPU kullanımındaki düşüşler SPIR-V İkili Program Orta Düzey dili için ek yük ve destek.

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

  • Android tarafından sağlanan Vulkan yükleyici.
  • GPU IHV'ler gibi SoC'ler tarafından sağlanan bir Vulkan sürücüsü, , Vulkan API'si. Android, Vulkan işlevselliğini desteklemek için cihazın, Vulkan özellikli GPU donanımına ve ilişkili sürücüye ihtiyacı vardır. GPU GLES 3.1 ve sonraki sürümleri de desteklemelidir. Aşağıdaki işlemler için SoC tedarikçi firmanıza danışın: sürücü desteği isteyin.

Bir cihaz Vulkan sürücüsü içeriyorsa cihazın, FEATURE_VULKAN_HARDWARE_LEVEL ve Şu sürümleri içeren FEATURE_VULKAN_HARDWARE_VERSION sistem özelliği: özelliklerini doğru bir şekilde yansıtması gerekir. Böylece ekip üyeleri bununla uyumlu olup olmadığını Uyumluluk Tanımlama Belgesi (CDD)

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ükleyici /system/lib[64]/libvulkan.so adresine yüklendi. Yükleyici temel Vulkan API giriş noktalarını, yani uzantıların giriş noktalarını ve isteğe bağlı birçok ek uzantı ile birlikte uygulanabilir. Pencere Sistem Entegrasyonu (WSI) uzantıları, yükleyici tarafından dışa aktarılır ve yükleyicide uygulanması gerekir. Yükleyici ayrıca şunları da destekler: ek uzantıları ve kesişimleri gösterebilen katmanları numaralandırma ve yükleme asıl API çağrıları sürücüye doğru ilerler.

NDK'da şu konular için bir libvulkan.so kütüphanesi bulunmaktadır: bağlanıyor. Kitaplık, yükleyiciyle aynı simgeleri dışa aktarır. Uygulamalar, işlevleri gerçek libvulkan.so kitaplığından yükleyiciye trambolin fonksiyonlarını girin, bu fonksiyonlar uygun katman veya sürücüye göre test edilir. vkGet*ProcAddr() çağrısı, trambolinlerin dağıttığı fonksiyon işaretçilerini (yani . İşlev aracılığıyla çağrı yapma kullanmak, dışa aktarılan simgeler yerine işaretçileri ve trambolini atlar.

Sürücü numaralandırması ve yükleniyor

Sistem görüntüsü oluşturulduğunda Android, sistemin hangi GPU'ları bilmesini bekler. kullanılabilir. Yükleyici, mevcut HAL mekanizmasını kullanır hardware.h. sürücüyü bulup yüklemek için. 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 struct'ı sarmalar; yalnızca tek bir sürücü desteklenir ve sabit dize HWVULKAN_DEVICE_0, open() adlı yapıya geçirildi.

Vulkan hw_device_t türevi tek bir değere karşılık gelir birden fazla fiziksel cihazı destekleyebilen bir sürücünün eklenmesidir. İlgili içeriği oluşturmak için kullanılan hw_device_t yapısı, dışa aktarma işlemi için genişletilebilir vkGetGlobalExtensionProperties(), vkCreateInstance() ve vkGetInstanceProcAddr() işlev. Yükleyici diğer tüm VkInstance(), VkPhysicalDevice() ve Çağrı yaparak vkGetDeviceProcAddr() işlevleri hw_device_t yapısının vkGetInstanceProcAddr().

Katman bulma ve yükleme

Vulkan yükleyici, ortaya çıkarabilecek katmanların numaralandırılmasını ve yüklenmesini destekler. ek uzantılar ve çekirdek API çağrılarına müdahale gerekir. Android, sistem görüntüsünde katman 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ı. Özellikle Android, üretimde (rootlanmamış) hata ayıklaması mümkün olmayan bir işleme harici kod yükleme harici kodun, sürecin durumunu denetlemesine veya kontrol etmesine izin vermez. bellek, durum vb. Buna, temel dökümlerin, API'lerin ve izler vb. bunları daha sonra incelemek üzere diske kaydeder. Yalnızca kapsamında yayınlanan katmanlar Hata ayıklanamayan uygulamalar üretim cihazlarında etkinleştirilir ve sürücüler, bu politikaları ihlal eden diğer işlevler.

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

  • Geliştirme zamanı katmanları: Doğrulama İzleme/profil çıkarma/hata ayıklama araçları için katmanlar ve dolgular üretim cihazlarının sistem görüntüsü. Şunun için doğrulama katmanları ve dolgular: İzleme/profil çıkarma/hata ayıklama araçları sistem kullanılmadan güncellenebilir olmalıdır görüntüsüdür. Uygulama kullanmak isteyen geliştiriciler katmandan biri, uygulama paketini değiştirebilir. Örneğin, yerel kitaplık dizinine dosya ekleyerek. IHV ve OEM mühendisleri ile değiştirilemeyen uygulamaların gönderimindeki hataları teşhis etmek isteyen kişilerin sistem görüntüsünün üretim dışı (rootlanmış) derlemelerine erişim (bu uygulamalar hata ayıklaması yapılabilir. Daha fazla bilgi için Android'de Vulkan doğrulama katmanları bölümüne bakın.
  • Yardımcı program katmanları: Bu katmanlar, uzantılar (ör. cihaz belleği için bellek yöneticisi uygulayan bir katman). Geliştiriciler, kendi çalışmalarında kullanmak üzere bu katmanların katmanlarını ve sürümlerini uygulama aynı katmanı kullanan farklı uygulamalar farklı versiyonları var. Bu katmanlardan hangilerinin kendi uygulama paketi.
  • Yerleştirilen (örtülü) katmanlar: Kullanıcı veya kullanıcı tarafından sağlanan kare hızı, sosyal ağ ve oyun başlatıcı yer paylaşımları uygulamanın bilgisi veya onayı olmadan başka bir uygulamaya. Bu Android'in güvenlik politikalarını ihlal eden ve desteklenmeyen uygulamalar.

Hata ayıklanamayan uygulamalar için, yükleyici yalnızca uygulamanın yerel kitaplık dizinini başlatır ve ada sahip herhangi bir kitaplığı yüklemeye çalışır belirli bir kalıpla eşleşiyor (örneğin, libVKLayer_foo.so).

Hata ayıklaması yapılabilecek uygulamalar için yükleyici, şurada katmanları arar: /data/local/debug/vulkan ve kitaplıkla eşleşen içerikleri yüklemeye çalışır görebilirsiniz.

Android, katmanların taşınmasını ve aynı zamanda Android ve diğer platformlar. Katmanlar ve yükleyici, bkz. Vulkan Yükleyici Arayüzlerinin Mimarisi. Khronos'un bakımı doğrulama katmanlarının Vulkan Doğrulama Katmanları.

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 birkaç uzantıyı Vulkan'ın temel işlevinde birleştiriyor. Bu işlevin büyük bölümü, kontrol ve ayrıntı düzeyini artırmak amacıyla, Vulkan programlama arayüzü. Tek geçişli oluşturma geçişi örneklerine artık ihtiyaç duyulmadı oluşturma geçişi nesneleri veya çerçeve arabellekleri. Ardışık düzen durumu nesnelerinin toplam sayısı azaltılabilir. senkronizasyonu yenilendi. Vulkan 1.3, Vulkan 1.2, 1.1 ve 1.0'a özeldir. Uygulamanın büyük bir kısmı SoC'ye özel grafik sürücüsünde var.

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

  • Tek geçişli oluşturma geçişi örnekleri için destek
  • Gölgelendirici çağrısını hemen sonlandırma desteği
  • Ardışık düzen oluşturma, paylaşma ve kontrolde daha hassas ayrıntı düzeyi

Vulkan 1.3 ayrıca birçok küçük özellik ve API kullanılabilirliği geliştirmesi içerir. Tüm değişiklikler temel Vulkan API'sinde küçük bir revizyon 1.3 ile yapılmış olan değişiklikleri şu adreste bulabilirsiniz: Temel Düzeltmeler (Vulkan 1.3).

Vulkan 1.2 işlevlerine genel bakış

Vulkan 1.2, API yüzeyini basitleştiren bir dizi özellik ve uzantı ekler. Buna şunlar dâhildir: Birleştirilmiş bir Bellek Modeli ve cihaz sürücüsünden sorgulanabilecek ek bilgiler. Vulkan 1.2, Vulkan 1.0 ve 1.1 ile aynı donanım gereksinimlerine sahiptir; tümünün uygulaması SoC'ye özel grafik sürücüsündedir, çerçevede değil.

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

Vulkan 1.2 ayrıca çeşitli daha küçük özellikler ve API kullanılabilirliği geliştirmeleri de içerir. Tüm değişiklikler temel Vulkan API'sinde küçük bir revizyon 1.2 ile yapılmış olan değişiklikleri şu adreste bulabilirsiniz: Temel Düzeltmeler (Vulkan 1.2).

Vulkan 1.1 işlevlerine genel bakış

Vulkan 1.1'de, tek bir sistem kullanarak zamandan ve OEM'lerin cihazlarda Vulkan 1.1'i desteklemesini sağlar. Ayrıca, bellek/senkronizasyon birlikte çalışabilirliği, geliştiricilerin Vulkan 1.1'in bir cihazda desteklenip desteklenmediğini belirlemek ve etkili bir şekilde kullanmak olduğu zamandır. Vulkan 1.1, Vulkan 1.0 ile aynı donanım gereksinimlerine sahiptir ancak çoğu zaman uygulama, SOC'ye özel grafik sürücüsündedir, çerçevede değildir.

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

  • Bellek arabelleklerini ve senkronizasyonu içe ve dışa aktarma desteği Vulkan dışından nesneler (kamera, codec'ler ve GLES ile birlikte çalışmak için)
  • YCbCr biçimleri için destek

Vulkan 1.1, birçok küçük özellik ve API kullanılabilirliği geliştirmesi de içerir. Tüm değişiklikler temel Vulkan API'sinde küçük bir revizyon 1.1 ile yapılmış olan değişiklikleri şu adreste bulabilirsiniz: Temel Düzeltmeler (Vulkan 1.1).

Vulkan desteğini seçin

Android cihazlar, piyasadaki en gelişmiş Vulkan özellik grubunu desteklemelidir. Bunun için 64 bit ABI'yı destekler ve düşük belleğe sahip değildir.

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

Android 10 ile 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

Aşağıdaki koşullar karşılanıyorsa bir Android cihaz Vulkan sürümünü destekler:

  1. İlgili Vulkan sürümünü destekleyen bir Vulkan sürücüsü ekleyin (bu, Vulkan sürümünden biri olmalıdır) Ek CDD şartlarına ek olarak Android sürümü. 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 geri döndüğünden emin olun Doğru vulkan sürümü için true.
    • Vulkan 1.3'te özellik, PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • Vulkan 1.1'de özellik, PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    ziyaret edin. Paket yöneticisi, bir kural ekleyerek Vulkan 1.3 ve Vulkan 1.1 için true değerini döndürür. aşağıdaki gibi gösterilen bir dosyayı uygun bir device.mk dosyasına kopyalayın.
    • Vulkan 1.3 için aşağıdakini 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ğıdakini 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
      
ziyaret edin.

Android Temel profili (ABP)

Tüm Android cihazların en son Android Baseline 2022 profiline uymasını öneririz. bu kılavuzda Android Baseline profil kılavuzu.

Android 14 veya sonraki sürümleri ve Vulkan API'yi destekleyen tüm cihazlar burada tanımlanan tüm işlevleri yerine Android Baseline 2021 profili. Gerekli işlevlerin tam listesi Vulkan profili json dosyasında numaralanmıştır, ancak gerekli işlevsellik şunları içerir:

  • ASTC ve ETC aracılığıyla sıkıştırılmış dokular.
  • VK_EXT_swapchain_colorspace tarihine kadar değişken renk alanları.
  • Örnek gölgelendirme ve çoklu örnek interpolasyonu sampleRateShading

Pencere sistem entegrasyonu (WSI)

libvulkan.so ürününde sürücü aşağıdaki işlemleri uygular pencere sistemi entegrasyonu (WSI) uzantıları:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties, Vulkan 1.1 için uygulandı. Yalnızca Android 10
  • VK_GOOGLE_display_timing, herhangi bir Vulkan sürümü için uygulanır Android 10'da

VkSurfaceKHR ve VkSwapchainKHR nesneleri ve tümü ANativeWindow ile olan etkileşimler platform tarafından işlenir ve sürücülere maruz kalıyor. WSI'nın uygulanması VK_ANDROID_native_buffer uzantısı, Sürücü tarafından desteklendiğinde; bu uzantı yalnızca WSI uygulaması tarafından kullanılır ve uygulamalara maruz kalmamasını sağlar.

Gralloc kullanım işaretleri

Vulkan uygulamaları için değişim zinciri arabelleklerinin tanımlanmış özel Gralloc kullanım işaretlerine sahiptir. Takas zinciri oluştururken Android, sürücüden istenen biçimi ve resim kullanımını çevirmesini ister aşağıdaki kodu çağırarak Gralloc kullanım işaretlerine kaydeder:

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ını seçin. Sürücü, *grallocConsumerUsage ve *grallocProducerUsage biçim için gerekli Gralloc kullanım işaretleri daha iyi anlamanızı sağlar. Sürücü tarafından döndürülen kullanım işaretleri, kullanım işaretleri flag'leri değiştirebilirsiniz.

Android 7.x, VkSwapchainImageUsageFlagsANDROID() uygulamasının önceki bir sürümünü çağırır. vkGetSwapchainGrallocUsageANDROID() adlı. Android 8.0 ve sonraki sürümler kullanımdan kaldırılıyor vkGetSwapchainGrallocUsageANDROID() ancak aramaya devam ediyor Şu durumda vkGetSwapchainGrallocUsageANDROID() vkGetSwapchainGrallocUsage2ANDROID(), sürücü tarafından sağlanmadı:

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

vkGetSwapchainGrallocUsageANDROID(), takas zinciri kullanımını desteklemiyor veya genişletilmiş Gralloc kullanım işaretleri.

Gralloc destekli resimler

VkNativeBufferANDROID, vkCreateImage uzantısıdır arka planla desteklenen bir görüntü oluşturma yapısıdır. VkNativeBufferANDROID VkImageCreateInfo içinde vkCreateImage() adlı kullanıcıya sağlanır yapı zinciridir. vkCreateImage() numaralı telefona VkNativeBufferANDROID üzerinden arama yapılıyor vkCreateSwapchainKHR numaralı telefona yapılan arama sırasında. WSI uygulaması, takas zinciri için istenen yerel arabelleklerin sayısını belirler, daha sonra Her biri için VkImage:

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 veriler:

  .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, VkSwapchainImageCreateInfoKHR uzantısı yapısı vkCreateImage adresine VkImageCreateInfo zincir sağlandı . 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;

Platform, Android 10 ve sonraki sürümlerde VK_KHR_swapchain v70, dolayısıyla Vulkan uygulaması VkImage değişim zinciri belleği ile destekleniyor. Uygulama ilk çağrıyı yapar VkImageSwapchainCreateInfoKHR ile vkCreateImage ve VkImageCreateInfo yapısına bağlı. Ardından Uygulama, şunu kullanarak vkBindImageMemory2(KHR) çağırıyor: Şuna bağlı VkBindImageMemorySwapchainInfoKHR yapı: VkBindImageMemoryInfo yapısı. imageIndex VkBindImageMemorySwapchainInfoKHR yapısında belirtilen geçerli bir takas zinciri resim dizini olmalıdır. Aynı zamanda platform, VkNativeBufferANDROID uzantı yapısı ve VkBindImageMemoryInfo zincirine Gralloc arabellek bilgisi, dolayısıyla sürücü, VkImage öğesini hangi Gralloc arabelleğine bağlayacağını bilir.

Resim edinme

vkAcquireImageANDROID, bir takas zinciri görüntüsünün sahipliğini aldı ve harici olarak sinyal almış bir yerel çiti hem mevcut VkSemaphore nesnesi ve mevcut bir VkFence nesnesi:

VkResult VKAPI vkAcquireImageANDROID(
    VkDevice            device,
    VkImage             image,
    int                 nativeFenceFd,
    VkSemaphore         semaphore,
    VkFence             fence
);

vkAcquireImageANDROID() şu çağrı sırasında arandı: içe aktarmak için vkAcquireNextImageKHR VkSemaphore ve VkFence nesnelerine yerel sınır uygulama tarafından sağlanır (ancak hem semafor hem de çit nesneleri isteğe bağlı olarak kullanabilirsiniz. Sürücü bu fırsatı fark etmeksizin, ve Gralloc arabellek durumundaki harici değişiklikleri yönetme; birçok sürücü herhangi bir şey yapmanız gerekmiyor. Bu çağrı, VkSemaphore ve VkFence, vkQueueSubmit sinyaliyle aynı bekleme durumuna geçirilir. Böylece sıralar semaforda bekleyebilir ve uygulama da plansızca bekleyebilir.

Temeldeki yerel sınır sinyalleri olduğunda her iki nesne de sinyal alır; eğer zaten sinyal vermişse semaforun da bu işlev geri döndüğünde geçerli olan bir durumdur. Sürücü gizli dosyanın sahipliğini alır tanımlayıcıyı açar ve artık ihtiyaç duyulmadığında telsiz dosyası tanımlayıcısını kapatır. Sürücü bir semafor ya da çit nesnesi sağlanmasa bile, vkAcquireImageANDROID başarısız olur ve hata döndürür. Eğer fenceFd -1, sanki yerel parmaklık zaten yapılmış gibi işaret eder.

Resimleri yayınlayın

vkQueueSignalReleaseImageANDROID, şunun için bir değişim zinciri görüntüsü hazırlıyor: yerel bir çit oluşturur ve yerel çitin sonradan sinyal verilmesini planlar giriş semaforları şu sinyalleri veriyor:

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

vkQueuePresentKHR(), vkQueueSignalReleaseImageANDROID() araması yapıyor görebilirsiniz. Sürücü, sinyal vermeyen yerel bir çit üretmelidir şuradaki waitSemaphoreCount semaforun tümüne kadar pWaitSemaphores sinyali ve image için sunum hazırlama.

Bekleme semaforları (varsa) zaten işaret edilmişse ve queue zaten boşta, sürücü *pNativeFenceFd ayarlayabilir öğesini -1 değerine ayarlayın. Bu da bir şey yok. Arayan, dosya tanımlayıcısının sahibi olur ve dosyayı kapatır *pNativeFenceFd içinde iade edildi.

Birçok sürücü resim parametresini yok sayabilir, ancak bazılarının hazırlanması gerekebilir Harici kullanıcılar tarafından kullanılan Gralloc arabelleğiyle ilişkilendirilmiş CPU tarafı veri yapıları görsel tüketicileri. Tampon içerikleri harici tüketicilerin kullanımı için hazırlarken geçişin bir parçası olarak eş zamansız olarak yapılır. VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

Resim VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID, ardından sürücünün vkQueueSignalReleaseImageANDROID() e-posta adresinin tekrar tekrar çağrılmasına izin ver ve vkAcquireImageANDROID() için yapılan aramalara müdahale etmez.

Paylaşılan sunum desteği

Bazı cihazlar tek bir resmin sahipliğini görüntü ardışık düzeni ve Vulkan uygulaması ile gecikmeyi en aza indirmek. Android 9 ve sonraki sürümlerde, yükleyici koşullu olarak Sürücüye bağlı olarak VK_KHR_shared_presentable_image uzantı vkGetPhysicalDeviceProperties2 numaralı telefona yapılan çağrıya yanıt.

Sürücü, Vulkan 1.1'i veya VK_KHR_physical_device_properties2 uzantısı, yükleyici paylaşılan sunum desteği vermek. Aksi takdirde, yükleyici vkGetPhysicalDeviceProperties2() arayarak sürücüye sunulan özelliklerden ve aşağıdaki yapıyı “ VkPhysicalDeviceProperties2::pNext zincir:

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

Sürücü, ekranla bir resmin sahipliğini paylaşabiliyor mu? sharedImage üyesini VK_TRUE olarak ayarlar.

Doğrulama

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

  • Khronos Vulkan Uygunluk testleri CtsDeqpTestCases modülünde Vulkan 1.0, 1.1, 1.2 ve 1.3 için işlevsel API testlerini içerir.
  • Cihazın özelliklerini test eden CtsGraphicsTestCases modülü doğru yapılandırıldığından emin olun.

Vulkan özellik bayrağı

Android 11 veya sonraki sürümleri ve Vulkan API'yi destekleyen bir cihaz bir özellik bayrağını göstermek için gereklidir. android.software.vulkan.deqp.level Bu özellik işaretinin değeri tam sayı olarak kodlanan bir tarihtir. Bu sütun, cihazın başarılı olduğunu iddia ettiği Vulkan dEQP testleri.

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

  • Yılda 0-15 arası bitler var
  • Aylık 16-23 arası bitler
  • 24-31 arasındaki bitler gün içinde saklanır

Özellik bayrağı için izin verilen minimum değer 0x07E30301. Bu, Android 10 için Vulkan dEQP testleri. Özellik bayrağı en azından bu değerse Cihaz, Android 10 Vulkan dEQP testlerinin tümünü geçtiğini iddia ediyor.

0x07E40301 değeri, 01.03.2020 tarihine karşılık gelir. Android 11 için Vulkan dEQP testleriyle ilişkilendirilen tarih. Özellik flag'i en azından bu değer olarak ayarlarsa cihaz, Android 11 sürümünün tüm sürümlerinden geçtiğini iddia eder. Vulkan dEQP testleri.

0x07E60301 değeri, 01.03.2022 tarihine karşılık gelir. için Vulkan dEQP testleriyle ilişkili tarih Android 13. Özellik bayrağı en azından bu değerse cihaz Android 13 Vulkan'ın tüm sürümlerinden geçtiğini iddia ediyor dEQP testleri.

Belirli bir özellik bayrağı (ör. 0x07E30301, 0x07E40301, 0x07E60301) Bu özellik bayrağının tüm Android Vulkan dEQP testlerini geçtiğini iddia ediyor (Android 10, Android 11, Android 13). Bu cihaz Daha sonraki bir Android sürümünde bulunan Vulkan dEQP testlerini geçebilir.

Vulkan dEQP, Android CTS'nin bir parçasıdır. Android 11'den itibaren dEQP test çalıştırıcısı bileşeninin android.software.vulkan.deqp.level farkındalığı vardır ve bu özelliğe göre özellik bayrağı: cihaz desteklediğini iddia etmiyor. Bu tür testler, üzerinden geçildi.