Composer HAL'de çalışırken takma işlemi

Ekran özellikleri (görüntüleme modları ve desteklenen HDR türleri gibi), Android TV set üstü kutuları (STB) ve over-the-top (OTT) gibi harici olarak bağlı ekranlara (HDMI veya DisplayPort aracılığıyla) sahip cihazlarda dinamik olarak değişebilir. cihazlar. Bu değişiklik, örneğin kullanıcı bir ekrandan diğerine geçtiğinde veya bağlı bir ekran olmadan cihazı başlattığında olduğu gibi, HDMI çalışırken takılabilir sinyalinin bir sonucu olarak gerçekleşebilir. Android 12'den itibaren, çalışırken takma ve dinamik görüntüleme özelliklerini işlemek için çerçevede değişiklikler yapılmıştır.

Bu sayfa, Composer HAL uygulamasında görüntüleme çalışırken takma işlemlerinin ve görüntüleme yeteneklerindeki değişikliklerin nasıl ele alınacağını kapsar. Ek olarak, ilişkili çerçeve arabelleğinin nasıl yönetileceğini ve bu durumlarda yarış koşullarının nasıl önleneceğini tartışır.

Görüntüleme yeteneklerinin güncellenmesi

Bu bölüm, Android çerçevesinin Composer HAL tarafından başlatılan görüntüleme yeteneklerindeki değişiklikleri nasıl ele aldığını açıklar.

Android düzgün görüntüleme yetenekleri değişiklikleri işlemek için önce OEM bir kullandığı şekilde Besteci HAL uygulamalıdır onHotplug(display, connection=CONNECTED) yeteneklerini göstermesi değişiklikleri çerçevesini bildirmek için. Bu bir kez uygulandıktan sonra, Android, görüntüleme yeteneklerindeki değişiklikleri aşağıdaki gibi işler:

  1. Görüntüleme yetenekleri bir değişiklik tespit, çerçeve bir alır onHotplug(display, connection=CONNECTED) bildirimi.
  2. Bildirim alır almaz, çerçeve görüntüleme durumunu düşer ve kullanarak HAL'ye yeni yetenekleri ile yeniden üretiyor getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities ve getDisplayCapabilities yöntemleri.
  3. Çerçeve yeni görüntüleme durumunu yeniden sonra, gönderdiği onDisplayChanged böyle olaylar için dinlerken uygulamalara geri arama.

Çerçeve daha sonra ilgili framebuffers yeniden düzenleyecektir onHotplug(display, connection=CONNECTED) etkinlikleri. Bkz karetamponu hafızasını yönetme Bu nasıl ele alınacağı üzerinde daha fazla bilgi için.

Ortak bağlantı senaryolarını işleme

Bu bölüm, birincil ekran bağlandığında ve bağlantısı kesildiğinde uygulamalarınızdaki çeşitli bağlantı senaryolarının nasıl düzgün bir şekilde ele alınacağını açıklar.

Mobil cihazlar için oluşturulmuş olan Android çerçevesi, bağlantısı kesilmiş bir birincil ekran için yerleşik desteğe sahip değildir. Bunun yerine HAL, birincil ekranın fiziksel olarak bağlantısının kesilmesi durumunda çerçeve ile etkileşimlerinde birincil ekranı bir yer tutucu ekranla değiştirmelidir.

Aşağıdaki senaryolar, bağlantısı kesilebilen harici olarak bağlı ekranlara sahip set üstü kutularda ve TV dongle'larında meydana gelebilir. Bu senaryolar için destek uygulamak için aşağıdaki tablodaki bilgileri kullanın:

Senaryo Taşıma
Önyükleme sırasında bağlı ekran yok
  • Bir gönderin onHotplug(display, connection=CONNECTED) çerçeveye Besteci HAL'ye sinyali.
  • Composer HAL içindeki fiziksel görüntüleme durumunu bir yer tutucu görüntüleme durumuyla değiştirin.

    Not: Bu görüntüleme modu çoğu uygulama tarafından desteklendiğinden, yer tutucu ekranın 1080x1920 çözünürlüğe ve 60 hz yenileme hızına sahip tek bir desteklenen moda sahip olmasını öneririz.

Birincil ekran fiziksel olarak bağlı
Birincil ekranın fiziksel olarak bağlantısı kesildi
  • Başka gönder onHotplug(display, connection=CONNECTED) çerçeveye Besteci HAL'ye olayı.
  • Composer HAL içindeki fiziksel görüntüleme durumunu bir yer tutucu görüntüleme durumuyla değiştirin. Yer tutucu ekran çerçevesi gönderir böylece, tek bir görüntü modu olmalıdır onDisplayChanged (desteklenen modların seti değişti beri) uygulamalara geri arama. Bu tek görüntü modu uygulamalar almıyor böylece, kopukluk önce fiziksel ekranın son etkin modu aynı olmalıdır yapılandırma değişikliği olayları .

Çerçeve arabelleği belleğini yönetme

Bağlı bir ekran, bir sonraki aldığında onHotplug(display, connection=CONNECTED) bildirimi olayı, çerçeve bu ekran ile ilişkili framebuffers yeniden düzenleyecektir. Aygıt uygulamalarının bu davranışı öngörmesi ve çerçeve arabelleği belleğini uygun şekilde yönetmesi gerekir. Uygulamanızda aşağıdaki yönergeleri kullanın:

  • Sonraki göndermeden önce onHotplug(display, connection=CONNECTED) bildirim olayları, sistemin düzgün onları yeniden tahsis önce, onları ayırması böylece framebuffers için kolları serbest bırakmak için emin olun. Serbest bırakma başarılı olmazsa, bellek yetersizliği nedeniyle yeniden tahsis başarısız olabilir.

  • Çerçeve arabellekleri için grafik bellek arabelleğinin geri kalanından ayrı bir ayrılmış bellek havuzu ayırmanızı öneririz.

Bu önemlidir, çünkü çerçeve arabelleklerinin serbest bırakılması ve yeniden tahsisi arasında, bir üçüncü taraf işlemi grafik belleğini tahsis etmeye çalışabilir. Çerçeve arabelleği tarafından aynı grafik belleği havuzu kullanılıyorsa ve grafik belleği doluysa, üçüncü taraf işlemi, daha önce bir çerçeve arabelleği tarafından tahsis edilen grafik belleğini işgal edebilir, böylece çerçeve arabelleğinin yeniden tahsisi (veya muhtemelen bellek alanını parçalama) için yetersiz bellek bırakır. .

Yarış koşullarını önlemek için sıralı yapılandırma kimliklerini kullanma

Besteci HAL çağırarak çerçeve ile eş zamanlı olarak desteklenen ekran yapılandırmaları günceller eğer yarışı koşulları ortaya çıkabilir setActiveConfig veya setActiveConfigWithConstraints . Çözüm, sıralı kimlikleri kullanmak ve bu sorunu önlemek için Composer HAL'ı uygulamaktır.

Bu bölüm, yarış koşullarının nasıl oluşabileceğini açıklar ve ardından Composer HAL'ın bu tür koşulları önlemek için sıralı kimlikleri kullanması için nasıl uygulanacağına ilişkin ayrıntılar gelir.

Yeni ekran yapılandırmalarına yeni, sıralı kimlikler ATANMADIĞINDA, bir yarış durumuna neden olan aşağıdaki olay dizisini göz önünde bulundurun:

  1. Desteklenen ekran yapılandırma kimlikleri şunlardır:

    • id = 1, 1080x1920 60Hz
    • id = 2, 50 Hz 1080x1920
  2. Çerçeve çağırır setActiveConfig(display, config=1) .

  3. Eşzamanlı olarak, Composer HAL bir ekran yapılandırması değişikliğini işler ve dahili durumunu aşağıdaki şekilde gösterilen yeni bir ekran yapılandırması kümesine günceller:

    • id = 1, 2160x3840 60Hz
    • id = 2, 50 Hz 2160x3840
    • id = 3, 60 Hz 1080x1920
    • id = 4, 50 Hz 1080x1920
  4. Besteci HAL bir gönderir onHotplug desteklenen modların kümesi değiştiğini bildirmek için, çerçeveye olayı.

  5. Besteci HAL alır setActiveConfig(display, config=1) (Adım 2'den).

  6. Çerçeve gerçeklik 1080x1920 60hz de olsa, 2160x3840 60hz için bir yapılandırma değişikliği istedi HAL yorumlayıp istenilen edildi.

Sıralı olmayan kimlik atamalarını kullanan süreç, burada istenen yapılandırma değişikliğinin yanlış yorumlanmasıyla sona erer.

Composer HAL'yi sıralı kimlikleri kullanacak şekilde yapılandırma

Bu tür yarış koşullarından kaçınmak için OEM, Composer HAL'ı aşağıdaki şekilde uygulamalıdır:

  • Composer HAL, desteklenen görüntü yapılandırmalarını güncellediğinde, yeni görüntü yapılandırmalarına yeni, sıralı kimlikler atar.
  • Çerçeve çağırdığında setActiveConfig veya setActiveConfigWithConstraints geçersiz yapılandırma kimliğiyle, Besteci HAL çağrıyı dikkate almaz.

Bu adımlar, aşağıdaki tartışmada gösterildiği gibi yarış koşullarını önlemeye hizmet eder.

Yeni görüntü yapılandırmalarına yeni, sıralı kimlikler atandığında aşağıdaki olay dizisini göz önünde bulundurun:

  1. Desteklenen ekran yapılandırma kimlikleri şunlardır:

    • id = 1, 1080x1920 60Hz
    • id = 2, 50 Hz 1080x1920
  2. Çerçeve çağırır setActiveConfig(display, config=1) .

  3. Bir ekran yapılandırması değişikliği işlendiğinde, bir sonraki kullanılmayan tamsayıdan başlayarak bir sonraki yapılandırma kimlikleri kümesi atanır ve aşağıdaki gibi gösterilir:

    • id = 3, 60 Hz 2160x3840

    • id = 4, 50 Hz 2160x3840

    • id = 5, 1080x1920 60hz

    • id = 6, 50 Hz 1080x1920

  4. Besteci HAL bir gönderir onHotplug desteklenen modların kümesi değiştiğini bildirmek için, çerçeveye olayı.

  5. Besteci HAL alır setActiveConfig(display, config=1) (Adım 2'den).

  6. Kimlik artık geçerli olmadığı için Besteci HAL aramayı yok sayar.

  7. Çerçeve alır ve işler onHotplug Bu fonksiyonlar kullanılarak Besteci HAL içine çağıran 4. adımdan olayı getDisplayConfigs ve getDisplayAttribute . Bu işlevlerle çerçeve, istenen çözünürlük ve 1080x1920 ve 60Hz yenileme hızı için yeni kimliği (5) tanımlar.

  8. Çerçeve başka gönderen setActiveConfig 5 güncelleştirilmiş kimliğine sahip olay.

  9. Besteci HAL alır setActiveConfig(display, config=5) basamak 5'ten elde edilen.

  10. HAL, çerçevenin 1080x1920 60hz olarak bir yapılandırma değişikliği istediğini doğru bir şekilde yorumlar.

Yukarıdaki örnekte gösterildiği gibi, sıralı kimlik atamalarını kullanan süreç, yarış durumunun önlenmesini ve doğru ekran yapılandırma değişikliğinin güncellenmesini sağlar.