Donanım Oluşturucu (HWC) HAL kompozit katmanlarının SurfaceFlinger, OpenGL ES (GLES) ve GPU'nun bileşim miktarını azaltır.
HWC, bindirmeler ve 2D kameralar gibi nesneleri soyutlayarak birleşik veriler oluşturur. özel pencere bileşimi donanımıyla haber verir. Böylece, kompozit pencerelerdir. HWC kullanarak pencereleri birleştirmek yerine GPU ile SurfaceFlinger bileşeni. Çoğu GPU, şunun için optimize edilmemiştir: katman oluşturduğunda ve GPU'nun SurfaceFlinger, uygulamalar kendi oluşturma işlemleri için GPU'yu kullanamaz.
HWC uygulamaları şunları desteklemelidir:
- En az dört yer paylaşımı:
- Durum çubuğu
- Sistem çubuğu
- Uygulama
- Duvar kağıdı/arka plan
- Ekrandan daha büyük katmanlar (örneğin, duvar kağıdı)
- Eş zamanlı önceden çarpımlı piksel başına alfa karıştırma ve düzlem başına alfa karıştırma
- Korunan video oynatma için donanım yolu
- RGBA paketleme sırası, YUV biçimleri ve döşeme, kaydırma ve adım adım ilerleme mülkler
HWC'yi uygulamak için:
- Operasyonel olmayan bir HWC uygulayın ve tüm beste çalışmalarını GLES.
- HWC'ye beste yetkisini artımlı olarak vermek için bir algoritma uygulayın. Örneğin, yer paylaşımına yalnızca ilk üç veya dört yüzey için yetki verin. donanımına sahip olmamızı sağlar.
- HWC'yi optimize edin. Bu, şunları içerebilir:
- GPU'dan alınan yükü en üst düzeye çıkaran ve HWC'ye gönderilir.
- Ekranın güncellenip güncellenmediği algılanıyor. Doğru değilse başka bir bileşimini HWC yerine GLES olarak kullanabilirsiniz. Ekran tekrar güncellendiğinde, besteyi HWC'ye boşaltmaya devam edin.
- Aşağıdakiler gibi yaygın kullanım alanlarına hazırlanma:
- Durum çubuğunu, sistem çubuğunu, uygulamayı içeren ana ekran pencere ve animasyonlu duvar kağıtları
- Dikey ve yatay modda tam ekran oyunlar
- Altyazılı ve oynatma özellikli tam ekran video kontrol
- Korumalı video oynatma
- Bölünmüş çoklu pencere
HWC temel bileşenleri
HWC, şunları sağlamak için iki temel öğe (katmanlar ve ekranlar) sağlar. kompozisyonu ve bunun ekran donanımıyla etkileşimini temsil eder. İlgili içeriği oluşturmak için kullanılan HWC ayrıca VSYNC üzerinde kontrol ve SurfaceFlinger'a geri çağırma da sağlar bir VSYNC etkinliği oluştuğunda bildirim gönderir.
HIDL arayüzü
Android 8.0 ve sonraki sürümler
için Composer HAL adlı HIDL arayüzü
iki türetilmiş bir IPC oluşturmaktır. Besteci HAL,
eski hwcomposer2.h
arayüzü. Satıcılar Composer HAL'si sağlıyorsa
HWC'nin uygulanmasından sonra, Composer HAL,
SurfaceFlinger'ı kullanabilirsiniz. Tedarikçi firmalar HWC'nin eski bir uygulamasını sağlıyorsa Composer, Composer
HAL, hwcomposer2.h
işlevindeki işlev işaretçilerini yükler,
HIDL çağrılarını işlev işaretçi çağrılarına yönlendirme.
HWC, belirli bir ekranın özelliklerini belirleyen işlevler sağlar; - farklı ekran yapılandırmaları (4k veya 1080p gibi) arasında geçiş yapın çözünürlük) ve renk modları (doğal renk veya gerçek sRGB gibi) ve sonra destekleniyorsa ekranı açar, kapatır veya düşük güç moduna geçirir.
İşlev işaretçileri
Tedarikçiler Composer HAL'yi doğrudan uyguluyorsa SurfaceFlinger işlevlerini çağırır
HIDL IPC aracılığıyla öğrenebilirsiniz. Örneğin, bir katman oluşturmak için SurfaceFlinger
Composer HAL'sinde createLayer()
.
Satıcılar hwcomposer2.h
arayüzünü uyguluyorsa Composer HAL
çağrılarını hwcomposer2.h
işlev işaretçilerine çağırır. hwcomposer2.h
yorumda,
HWC arayüz işlevleri
arayüzde bulunmayan küçükCamelCase adlarıyla adlandırılır
alan olarak ayarlayabilirsiniz. Neredeyse her işlev bir istekle yüklenir.
işlev işaretçisini (getFunction
) sağlayan
hwc2_device_t
. Örneğin, createLayer
fonksiyonu
olan HWC2_PFN_CREATE_LAYER
türünde bir işlev işaretçisi
Numaralı HWC2_FUNCTION_CREATE_LAYER
değeri şu olduğunda döndürülür:
getFunction
içerisine aktarıldı.
Composer HAL işlevleri ve HWC işlevi geçişi hakkında ayrıntılı belgeler için
işlevleri için bkz. composer
. Ayrıntılı belgeler için
HWC işlevi işaretçileri için
hwcomposer2.h
.
Katman ve görüntüleme herkese açık kullanıcı adları
Katmanlar ve ekranlar, HWC tarafından oluşturulan herkese açık kullanıcı adları ile değiştirilir. Tutma yerleri SurfaceFlinger'da opaktır.
SurfaceFlinger yeni bir katman oluşturduğunda createLayer
çağırır.
Bu, doğrudan için Layer
türünü döndüren bir
uygulamaları veya geçiş uygulamaları için hwc2_layer_t
. Zaman
SurfaceFlinger bu katmanın bir özelliğini değiştirir. SurfaceFlinger,
hwc2_layer_t
değerini uygun değişiklik işlevine aktarın
ve değişikliği yapmak için gereken diğer bilgileri içermelidir. İlgili içeriği oluşturmak için kullanılan
hwc2_layer_t
türü, bir işaretçi veya
dizin.
Fiziksel ekranlar hotspot'a eklenerek oluşturulur. Fiziksel bir ekran
çalışır durumda olduğunda, HWC bir herkese açık kullanıcı adı oluşturur ve bu tutma yerini SurfaceFlinger'a iletir.
geçici olarak devre dışı bırakabilirsiniz. Sanal ekranlar SurfaceFlinger tarafından oluşturulur
createVirtualDisplay()
aranıyor. HWC
sanal görüntü bileşimini destekliyorsa bir herkese açık kullanıcı adı döndürür. Ardından, SurfaceFlinger
Serginin bestesini HWC'ye delege eder. HWC, sanal makineyi desteklemiyorsa
SurfaceFlinger, herkese açık kullanıcı adını oluşturur ve ekranı birleştirir.
Görüntüleme bileşimi işlemleri
SurfaceFlinger, yeni bir içeriğe sahip olduğunda VSYNC başına bir defa uyanır: birleşimdir. Bu yeni içerik, uygulamalardan alınan yeni resim arabellekleri olabilir veya Bir veya daha fazla katmanın özelliklerinde bir değişiklik. SurfaceFlinger olduğunda onu uyandırır:
- Mevcut olan işlemleri gerçekleştirir.
- Varsa yeni grafik arabellekleri kilitler.
- 1. veya 2. adımın bir değişiklikle sonuçlanması durumunda yeni bir beste yapar değişiklik gösterir.
SurfaceFlinger yeni bir beste yapmak için,
uygun şekilde, katmanları yok eden veya katman durumlarını değiştiren. Ayrıca,
katmanlarını mevcut içerikleriyle birlikte kullanarak,
setLayerBuffer
veya setLayerColor
. Tüm katmanlar
SurfaceFlinger'ın validateDisplay
çağrısı yaptığı bu aramada
HWC’ye başvurarak katmanların durumunu inceleyebilir ve bileşimin nasıl
devam edebilir. SurfaceFlinger varsayılan olarak her katmanı yapılandırmaya çalışır
katman HWC tarafından birleştirilir. bazı durumlarda
SurfaceFlinger, GPU yedeği aracılığıyla katmanları birleştirir.
validateDisplay
numaralı telefona yapılan aramadan sonra, SurfaceFlinger aramaları
HWC'nin olup olmadığını görmek için getChangedCompositionTypes
işlemini gerçekleştirmeden önce katman bileşimi türlerinden herhangi birinin değiştirilmesini
bileşimi. SurfaceFlinger, değişiklikleri kabul etmek için
acceptDisplayChanges
Herhangi bir katman SurfaceFlinger kompozisyonu için işaretlenmişse SurfaceFlinger
hedef arabellekte birleştirir. SurfaceFlinger ve ardından çağrılar
setClientTarget
işlevinden yararlanarak arabelleği,
arabellek ekranda görüntülenebilir veya şimdiki
SurfaceFlinger kompozisyonu için işaretlenmemiş. Herhangi bir katman işaretli değilse
SurfaceFlinger bileşimi, SurfaceFlinger beste adımını atlar.
Son olarak, SurfaceFlinger presentDisplay
numarasını arayarak
HWC'ye eklemeniz gerekir.
Birden çok ekran
Android 10, birden fazla fiziksel ekranı destekler. Android 7.0 ve sonraki sürümlerde kullanılmak üzere tasarlanmış bir HWC uygulaması tasarlarken HWC tanımında yer almayan bazı kısıtlamalar da vardır:
- Tam olarak bir dahili ekran olduğu varsayılır. Dahili ekranı, başlatma sırasındaki ilk hotspot'un bildirdiği ekrandır. başlatın. Dahili ekran takılıp takıldıktan sonra bağlantıları iptal edebilir.
- Dahili ekrana ek olarak herhangi bir sayıda harici ekran da hotspot olarak takılabilir
cihazın normal çalışma esnasında gösterilebilir. Çerçeve, tüm çalışanların
ilk dahili ekrandan sonraki hotspot'lar harici ekrandır, yani daha fazla
dahili ekranlar eklendiğinde, bunlar yanlış bir şekilde
-
Display.TYPE_HDMI
Display.TYPE_BUILT_IN
.
Yukarıda açıklanan SurfaceFlinger işlemleri gerçekleştirilirken bu reklamlar tüm etkin ekranlarda sırayla gösterilir. yalnızca bir ekranın içeriği güncellendiğinden emin olun.
Örneğin, harici ekran güncellenirse sıra şu şekilde olur:
// In Android 9 and lower: // Update state for internal display // Update state for external display validateDisplay(<internal display>) validateDisplay(<external display>) presentDisplay(<internal display>) presentDisplay(<external display>) // In Android 10 and higher: // Update state for internal display // Update state for external display validateInternal(<internal display>) presentInternal(<internal display>) validateExternal(<external display>) presentExternal(<external display>)
Sanal görüntü bileşimi
Sanal görüntü bileşimi, harici ekrana benziyor bileşimi. Sanal görüntü bileşimi ile fiziksel arasındaki fark görüntü bileşimi, sanal görüntülerin çıktıyı bir Gralloc arabelleğine göndermesidir. bir alan vardır. Donanım Oluşturucu (HWC), çıkışı bir arabelleğe yazar, tamamlama çitini sağlar ve tamponu tüketiciye (örneğin, video kodlayıcı, GPU, CPU vb.) kullanabilirsiniz. Sanal ekranlar 2D/sesli veya görüntü ardışık düzeni belleğe yazarsa yer paylaşımlı reklamlar oluşturur.
Modlar
SurfaceFlinger, aşağıdakileri çağırdıktan sonra her kare üç moddan birinde olur:
validateDisplay()
HWC yöntemi:
- GLES: GPU, tüm katmanları birleştirerek çıkış arabelleğine aktarmanızı sağlar. HWC, beste sürecine dahil değildir.
- KARMA - GPU, bazı katmanları framebuffer ve HWC, framebuffer'ı ve kalan katmanları bir araya getirir yazmanızı sağlar.
- HWC: HWC, tüm katmanları birleştirir ve doğrudan yazma işlemleri yapar ekleyeceğim.
Çıkış biçimi
Sanal görüntü arabelleği çıkış biçimleri, modlarına bağlıdır:
- GLES modu: EGL sürücüsü, çıkış arabelleğini ayarlar
biçimi
dequeueBuffer()
olur (genellikleRGBA_8888
). Tüketici, sürücünün ayarladığı çıkış biçimini veya arabellek okunamıyor. - KARMA ve HWC modları: Tüketicinin CPU'ya ihtiyacı varsa
biçimi tüketici belirler. Aksi halde biçim
IMPLEMENTATION_DEFINED
ve Gralloc, kullanıma sunuyoruz. Örneğin Gralloc, video kodlayıcı ve HWC, biçimi verimli bir şekilde yazabilir.
Senkronizasyon duvarları
Senkronizasyon (senkronizasyon) sınırları, Android grafiklerinin önemli bir bileşenidir. bahsedeceğim. Raptiyeler, CPU'nun eşzamanlı GPU çalışmalarından bağımsız olarak çalışmasını sağlar. yalnızca gerçek bir bağımlılık olduğunda engelleme yapar.
Örneğin bir uygulama, aynı zamanda bir bir senkronizasyon çiti nesnesi gönderir. Bu çit, müşterinin ne zaman GPU, arabelleğe yazmayı bitirdi.
HWC, arabellekler sonlandırılmadan önce GPU bitirme yazma arabelleklerinin görüntülenir. Senkronizasyon sınırları, arabelleklerle grafik ardışık düzeninden geçer ve tamponlar yazıldığında sinyal gönderir. Bir tampon görüntülenmeden önce, HWC senkronizasyon bölmesinin sinyal verip vermediğini kontrol eder, varsa arabellek.
Sınırları senkronize etme hakkında daha fazla bilgi için Donanım Oluşturucu Entegrasyon.