Donanım Composer HAL'sini uygulama

Donanım Oluşturucu (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ı)
  • Eşzamanlı olarak piksel başına alfa harmanlama ve düzlem başına alfa harmanlama
  • Korunan video oynatma için donanım yolu
  • RGBA paketleme sırası, YUV biçimleri ve döşeme, karıştırma ve adım özellikleri

HWC'yi uygulamak için:

  1. Çalışmayan bir HWC uygulayın ve tüm kompozisyon çalışmalarını 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 durum aşağıdakileri içerebilir:
    • 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 kontrolleriyle tam ekran video
      • Korunan video oynatma
      • Bölünmüş ekran çoklu pencere

HWC öğ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. Satıcılar 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

Tedarikçiler 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'yi createLayer() kez çağırır.

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 tüm işlevler, hwc2_device_t tarafından sağlanan getFunction kullanılarak bir işlev işaretçisi istenerek yüklenir. Örneğin, createLayer işlevi, HWC2_FUNCTION_CREATE_LAYER numaralandırılmış değeri getFunction'e iletildiğinde döndürülen HWC2_PFN_CREATE_LAYER türünde bir işlev işaretçisidir.

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 yerleri

Katmanlar ve ekranlar, HWC tarafından oluşturulan tutma yerleriyle işlenir. Tutma yerleri 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, değişikliği yapmak için gereken diğer 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 bulunulmasıyla 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 özelliklerinde yapılan bir değişiklik olabilir. SurfaceFlinger uyandırdığında:

  1. Varsa işlemleri yönetir.
  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 birleştirme işleminin 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 yedeklemesi 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şaretlenmişse SurfaceFlinger bunları hedef arabellekte birleştirir. Ardından SurfaceFlinger, arabelleğin ekranda gösterilebilmesi veya SurfaceFlinger kompozisyonu için işaretlenmemiş katmanlarla daha fazla birleştirilebilmesi için arabelleği ekrana vermek üzere setClientTarget işlevini çağırır. SurfaceFlinger birleştirme için katman işaretlenmemişse SurfaceFlinger, birleştirme adımını atlar.

Son olarak, SurfaceFlinger, HWC'ye kompozisyon sürecini tamamlamasını ve nihai sonucu görüntülemesini 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şleminin başlatma sırasında bildirdiği 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 bileşimi

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. Donanım Composer (HWC), çıktıyı 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 arabellek gönderdiğinde bir senkronizasyon bariyeri nesnesi de gönderir. Bu bariyer, GPU'nun arabelleğe yazma işlemini tamamladığını bildirir.

HWC, arabelleklerin gösterilmesinden önce GPU'nun arabellekleri yazmayı bitirmesini gerektirir. Senkronizasyon bariyerleri, grafik işlem hattından arabelleklerle geçirilir ve arabellekler yazıldığında sinyal verir. HWC, arabellek gösterilmeden önce senkronizasyon çitinin sinyal verip vermediğini kontrol eder. Sinyal verildiyse arabelleği gösterir.

Senkronizasyon sınırları hakkında daha fazla bilgi için Hardware Composer Integration başlıklı makaleyi inceleyin.