Donanım Composer HAL'sini uygulama

Donanım Composer (HWC) HAL, SurfaceFlinger'dan alınan katmanları birleştirerek OpenGL ES (GLES) ve GPU'nun gerçekleştirdiği birleştirme miktarını azaltır.

HWC, yer paylaşımları ve 2D blitter'lar gibi nesneleri birleştirilmiş yüzeylere soyutlar ve pencereleri birleştirmek için özel pencere birleştirme donanımıyla iletişim kurar. SurfaceFlinger'ın GPU ile birleştirme yapması yerine, pencereleri birleştirmek için HWC'yi kullanın. Çoğu GPU, birleştirme için optimize edilmemiştir ve GPU, SurfaceFlinger'dan gelen katmanları birleştirdiğinde 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 (ör. duvar kağıdı)
  • Piksel başına alfa harmanlaması ve düzlem başına alfa harmanlaması ile aynı anda ön çarpma
  • Korunan video oynatma için donanım yolu
  • RGBA paketleme sırası, YUV biçimleri ve döşeme, karıştırma ve adım özelliklerini

HWC'yi uygulamak için:

  1. Çalışmayan bir HWC uygulayın ve tüm kompozisyon işlerini GLES'e gönderin.
  2. Kompozisyonu HWC'ye kademeli olarak devretmek için bir algoritma uygulayın. Örneğin, yalnızca ilk üç veya dört yüzeyi HWC'nin donanımına devredin.
  3. HWC'yi optimize edin. Bu bilgiler arasında şunlar yer alabilir:
    • GPU'nun yükünü en aza indiren yüzeyleri seçip HWC'ye gönderme
    • Ekranın güncellenip güncellenmediğini algılama Değilse güç tasarrufu için oluşturma işlemini HWC yerine GLES'e devredin. Ekran tekrar güncellendiğinde, oluşturma işlemini HWC'ye boşaltmaya devam edin.
    • Aşağıdakiler gibi yaygın kullanım alanlarına hazırlanma:
      • Durum çubuğu, sistem çubuğu, uygulama penceresi ve canlı duvar kağıtlarını içeren ana ekran
      • Dikey ve yatay modda tam ekran oyunlar
      • Altyazı ve oynatma kontrolü içeren tam ekran video
      • Korunan video oynatma
      • Bölünmüş ekran çoklu pencere

HWC temel öğeleri

HWC, kompozisyon çalışmasını ve ekran donanımıyla etkileşimini temsil etmek için iki temel öğe (katmanlar ve ekranlar) sağlar. HWC, VSync üzerinde kontrol sağlar ve bir VSync etkinliği gerçekleştiğinde SurfaceFlinger'ı bilgilendirmek için geri çağırma işlevi sunar.

HIDL arayüzü

Android 8.0 ve sonraki sürümlerde, HWC ile SurfaceFlinger arasında binderized IPC için Composer HAL adlı bir HIDL arayüzü kullanılır. Composer HAL, eski hwcomposer2.h arayüzünün yerini alır. Tedarikçiler HWC'nin Composer HAL uygulamasını sağlıyorsa Composer HAL, SurfaceFlinger'dan gelen HIDL çağrılarını doğrudan kabul eder. Tedarikçiler HWC'nin eski bir uygulamasını sağlıyorsa Composer HAL, hwcomposer2.h'dan işlev işaretçilerini yükler, HIDL çağrılarını işlev işaretçisi çağrılarına yönlendirir.

HWC, belirli bir ekranın özelliklerini belirleme, farklı ekran yapılandırmaları (ör. 4K veya 1080p çözünürlük) ve renk modları (ör. doğal renk veya gerçek sRGB) arasında geçiş yapma ve destekleniyorsa ekranı açma, kapatma veya düşük güç moduna geçirme işlevleri sağlar.

İşlev işaretçileri

Satıcılar Composer HAL'yi doğrudan uygularsa SurfaceFlinger, işlevlerini HIDL IPC aracılığıyla çağırır. Örneğin, bir katman oluşturmak için SurfaceFlinger, Composer HAL'de createLayer() çağrısı yapar.

Tedarikçiler hwcomposer2.h arayüzünü uygularsa Composer HAL, hwcomposer2.h işlev işaretçilerini çağırır. hwcomposer2.h yorumlarında, HWC arayüz işlevleri, arayüzde bulunmayan lowerCamelCase adlarıyla adlandırılmış alanlar olarak adlandırılır. Neredeyse her işlev, getFunction tarafından sağlanan hwc2_device_t kullanılarak bir işlev işaretçisi istenerek yüklenir. Örneğin, createLayer işlevi, HWC2_PFN_CREATE_LAYER türünde bir işlev işaretçisidir. Bu işaretçi, numaralandırılmış HWC2_FUNCTION_CREATE_LAYER değeri getFunction'ye iletildiğinde döndürülür.

Composer HAL işlevleri ve HWC işlev geçişi işlevleri hakkında ayrıntılı doküman için composer başlıklı makaleyi inceleyin. HWC işlev işaretçileriyle ilgili ayrıntılı dokümanlar için hwcomposer2.h bölümüne bakın.

Katman ve görüntü tutma noktaları

Katmanlar ve ekranlar, HWC tarafından oluşturulan tutma yerleriyle işlenir. Kullanıcı adları SurfaceFlinger için opak.

SurfaceFlinger yeni bir katman oluşturduğunda createLayer işlevini çağırır. Bu işlev, doğrudan uygulamalar için Layer türünde, geçiş uygulamaları için ise hwc2_layer_t türünde bir değer döndürür. SurfaceFlinger bu katmanın bir özelliğini değiştirdiğinde, SurfaceFlinger hwc2_layer_t değerini uygun değişiklik işlevine ve değişikliği yapmak için gereken diğer tüm bilgilerle birlikte iletir. hwc2_layer_t türü, işaretçi veya dizin tutacak kadar büyüktür.

Fiziksel ekranlar, çalışırken takılarak oluşturulur. Fiziksel bir ekran hotplugged olduğunda HWC bir tutma yeri oluşturur ve tutma yerini hotplug geri çağırma yoluyla SurfaceFlinger'a iletir. Sanal ekranlar, SurfaceFlinger tarafından createVirtualDisplay() çağrılarak ekran isteğinde bulunulduğunda oluşturulur. HWC, sanal ekran oluşturmayı destekliyorsa bir tutma yeri döndürür. Ardından, SurfaceFlinger ekranın bileşimini HWC'ye devreder. HWC, sanal ekran oluşturmayı desteklemiyorsa SurfaceFlinger, tutma yerini oluşturur ve ekranı birleştirir.

Bileşim işlemlerini görüntüleme

SurfaceFlinger, VSync başına bir kez olmak üzere birleştirilecek yeni içerik varsa uyanır. Bu yeni içerik, uygulamalardan gelen yeni resim arabellekleri veya bir ya da daha fazla katmanın özelliklerindeki bir değişiklik olabilir. SurfaceFlinger uyandırdığında:

  1. İşlemleri yönetir (varsa).
  2. Varsa yeni grafik arabelleklerini kilitler.
  3. 1. veya 2. adımda gösterilen içeriklerde değişiklik yapıldıysa yeni bir kompozisyon oluşturur.

SurfaceFlinger, yeni bir birleştirme işlemi gerçekleştirmek için katmanlar oluşturur ve yok eder ya da katman durumlarını değiştirir. Ayrıca, setLayerBuffer veya setLayerColor gibi çağrıları kullanarak katmanları mevcut içerikleriyle günceller. Tüm katmanlar güncellendikten sonra SurfaceFlinger, validateDisplay işlevini çağırır. Bu işlev, HWC'ye katmanların durumunu incelemesini ve kompozisyonun nasıl devam edeceğini belirlemesini söyler. Varsayılan olarak SurfaceFlinger, her katmanı HWC tarafından birleştirilecek şekilde yapılandırmaya çalışır. Ancak bazı durumlarda SurfaceFlinger, katmanları GPU geri dönüşü aracılığıyla birleştirir.

validateDisplay çağrısından sonra SurfaceFlinger, birleştirme işlemini gerçekleştirmeden önce HWC'nin katman birleştirme türlerinden herhangi birinin değiştirilmesini isteyip istemediğini görmek için getChangedCompositionTypes çağrısını yapar. Değişiklikleri kabul etmek için SurfaceFlinger, acceptDisplayChanges çağrısı yapar.

Herhangi bir katman SurfaceFlinger kompozisyonu için işaretlenirse SurfaceFlinger bunları hedef arabellekte birleştirir. Ardından SurfaceFlinger, arabelleği ekrana vermek için setClientTarget çağrısını yapar. Böylece arabellek ekranda gösterilebilir veya SurfaceFlinger kompozisyonu için işaretlenmemiş katmanlarla daha fazla birleştirilebilir. SurfaceFlinger birleştirme için katman işaretlenmemişse SurfaceFlinger, birleştirme adımını atlar.

Son olarak, SurfaceFlinger, HWC'ye birleştirme sürecini tamamlamasını ve nihai sonucu göstermesini söylemek için presentDisplay işlevini çağırır.

Çoklu görüntülü ağlar

Android 10, birden fazla fiziksel ekranı destekler. Android 7.0 ve sonraki sürümlerde kullanılmak üzere tasarlanan bir HWC uygulaması oluştururken HWC tanımında bulunmayan bazı kısıtlamalar vardır:

  • Tam olarak bir dahili ekran olduğu varsayılır. Dahili ekran, ilk tak ve çalıştır işlemi sırasında önyükleme sırasında bildirilen ekrandır. Dahili ekran, çalışırken takıldıktan sonra bağlantısı kesilemez.
  • Dahili ekrana ek olarak, cihazın normal çalışması sırasında herhangi bir sayıda harici ekran takılabilir. Çerçeve, ilk dahili ekrandan sonraki tüm hotplug'ların harici ekran olduğunu varsayar. Bu nedenle, başka dahili ekranlar eklenirse Display.TYPE_BUILT_IN yerine yanlışlıkla Display.TYPE_HDMI olarak sınıflandırılır.

Yukarıda açıklanan SurfaceFlinger işlemleri ekran başına gerçekleştirilirken yalnızca bir ekranın içeriği güncellense bile tüm etkin ekranlar için sırayla gerçekleştirilir.

Ö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 ekran kompozisyonu

Sanal ekran kompozisyonu, harici ekran kompozisyonuna benzer. Sanal ekran kompozisyonu ile fiziksel ekran kompozisyonu arasındaki fark, sanal ekranların çıkışı ekrana değil, bir Gralloc arabelleğine göndermesidir. Hardware Composer (HWC), çıkışı bir arabelleğe yazar, tamamlanma bariyerini sağlar ve arabelleği bir tüketiciye (ör. video kodlayıcı, GPU, CPU vb.) gönderir. Ekran işlem hattı belleğe yazıyorsa sanal ekranlar 2D/blitter veya katmanlar kullanabilir.

Modlar

SurfaceFlinger, validateDisplay() HWC yöntemini çağırdıktan sonra her çerçeve üç moddan birinde olur:

  • GLES: GPU, tüm katmanları birleştirerek doğrudan çıkış arabelleğine yazar. HWC, beste sürecine dahil değildir.
  • KARIŞIK: GPU, bazı katmanları çerçeve arabelleğine birleştirir. HWC ise çerçeve arabelleğini ve kalan katmanları birleştirerek doğrudan çıkış arabelleğine yazar.
  • HWC: HWC, tüm katmanları birleştirir ve doğrudan çıkış arabelleğine yazar.

Çıkış biçimi

Sanal ekran arabelleği çıkış biçimleri, modlarına bağlıdır:

  • GLES modu: EGL sürücüsü, çıkış arabelleği biçimini dequeueBuffer() olarak ayarlar. Bu biçim genellikle RGBA_8888 olur. Tüketici, sürücünün ayarladığı çıkış biçimini kabul edebilmelidir. Aksi takdirde arabellek okunamayabilir.
  • MIXED ve HWC modları: Tüketicinin CPU erişimine ihtiyacı varsa biçimi tüketici belirler. Aksi takdirde biçim IMPLEMENTATION_DEFINED olur ve Gralloc, kullanım işaretlerine göre en iyi biçimi ayarlar. Örneğin, tüketici video kodlayıcıysa ve HWC biçimi verimli bir şekilde yazabiliyorsa Gralloc, YCbCr biçimini ayarlar.

Senkronizasyon çitleri

Senkronizasyon (senk) çitleri, Android grafik sisteminin önemli bir parçasıdır. Çitler, CPU'nun eşzamanlı GPU çalışmasından bağımsız olarak çalışmasına olanak tanır ve yalnızca gerçek bir bağımlılık olduğunda engeller.

Örneğin, bir uygulama GPU'da üretilen bir arabelleği gönderdiğinde bir senkronizasyon sınırı nesnesi de gönderir. Bu bariyer, GPU'nun arabelleğe yazma işlemini tamamladığını bildirir.

HWC, arabelleklerin görüntülenmesinden önce GPU'nun arabellekleri yazma işlemini tamamlamasını gerektirir. Senkronizasyon bariyerleri, grafik ardışık düzeninden arabelleklerle geçirilir ve arabellekler yazıldığında sinyal gönderilir. Bir arabellek görüntülenmeden önce HWC, senkronizasyon çitinin sinyal verip vermediğini kontrol eder ve sinyal verildiyse arabelleği görüntüler.

Senkronizasyon engelleri hakkında daha fazla bilgi için Donanım Oluşturucu Entegrasyonu başlıklı makaleyi inceleyin.