Senkronizasyon çerçevesi, korelasyon içindeki bağımlılıkları ve Android grafik sisteminde farklı eşzamansız işlemler gerçekleştirebilirsiniz. Çerçeve Bileşenlerin arabelleklerin ne zaman serbest bırakıldığını bildirmesini sağlayan bir API sağlar. Çerçeve ayrıca çekirdekten sürücüler arasında senkronizasyon temel öğelerinin iletilmesini sağlar otomatikleştirmeyi sağlar.
Örneğin, bir uygulama GPU'da yapılacak işleri sıraya alabilir. GPU bu resmi çizmeye başlar. Resim çizilmemiş olsa da belleğe henüz eklenmiş değilse, arabellek işaretçisi pencereye ve GPU çalışmasının ne zaman biteceğini belirten bir çitle somut olarak ortaya koyar. Pencere birleştirici, önceden işlemeye başlar ve bu çalışmayı ekran denetleyicisine iletir. Benzer şekilde CPU, yapılmasını şart koşar. GPU bittikten sonra, ekran denetleyicisi resim hemen görüntülenir.
Senkronizasyon çerçevesi, uygulamacıların senkronizasyon kaynaklarını kendi donanım bileşenlerinde senkronize edebilir. Son olarak, çerçeve, grafik ardışık düzeninin daha iyi anlaşılmasını sağlar. hata ayıklama.
Açık senkronizasyon
Açık senkronizasyon, grafik arabelleklerinin üreticilerini ve tüketicilerini etkinleştirir işin bitmesini bekleyeceklerini ortaya koyabilir. Açık senkronizasyon: örneğidir.
Açık senkronizasyonun avantajları şunlardır:
- Cihazlar arasında daha az davranış değişimi
- Daha iyi hata ayıklama desteği
- İyileştirilmiş test metrikleri
Senkronizasyon çerçevesinin üç nesne türü vardır:
sync_timeline
sync_pt
sync_fence
senkronizasyon_zaman çizelgesi
sync_timeline
, zaman çizelgesinde monoton ve giderek daha fazla
her sürücü örneği için (ör. GL bağlamı) uygulaması gereken
2D ekran denetleyicisi veya 2D parlaklıktır. sync_timeline
sayım
özel bir donanım parçası için çekirdeğe gönderilen iş ilanlarıdır.
sync_timeline
, operasyonların sırası hakkında garanti sağlar
ve donanıma özgü uygulamalar sunar.
sync_timeline
öğesini uygularken aşağıdaki yönergeleri izleyin:
- Sürücüler, zaman çizelgeleri ve sınırları basitleştirmek için yararlı adlar verin hata ayıklama.
timeline_value_str
vept_value_str
uygulayın hata ayıklama çıktısını daha okunabilir hale getirmek için zaman çizelgesinde operatörler kullanır.- Kullanıcı alanı kitaplıkları sağlamak için
driver_data
dolgusunu uygulayın. Örneğin, GL kitaplığı gibi, gizli zaman çizelgesi verilerine erişebilir.data_driver
, tedarikçilerin sabit öğe ile ilgili bilgileri iletmesine olanak tanır Komut satırları oluşturmak içinsync_fence
vesync_pts
karar verebilir. - Kullanıcı alanının açıkça bir çit oluşturmasına veya sinyalini göstermesine izin vermeyin. Açıkça sinyal veya parmak izi oluşturulması, hizmet reddi saldırısına neden olur. ardışık düzen işlevselliğini durdurur.
sync_timeline
,sync_pt
veyasync_fence
öğelerini açıkça görebilirsiniz. API, Google Ads'de işlevlerine dahildir.
senkronizasyon_pt
sync_pt
, tek bir değer veya puandır:
sync_timeline
. Nokta
üç durumu vardır: etkin, sinyalli ve hata. Puanlar etkin durumda başlar
ve sinyal ya da hata durumlarına
geçiş yapar. Örneğin, bir resim
tüketicinin artık tamponu kullanması gerekmiyor, bir sync_pt
sinyali var
Bu şekilde, görüntü üreticisi arabelleğe tekrar yazmanın uygun olduğunu bilir.
senkronizasyon_fence
sync_fence
, sync_pt
değerden oluşan bir koleksiyondur
sıklıkla
farklı sync_timeline
üst öğeleri vardır (ekran için
denetleyici ve GPU) ekleyin. sync_fence
, sync_pt
ve
sync_timeline
, sürücülerin ve kullanıcı alanının kullandığı temel bileşenlerdir.
ve bağımlılıklarını
görmek için kullanabilirsiniz. Bir çitin sinyali verildiğinde her şey
verilen komutların tamamlanması garanti edilir çünkü
çekirdek sürücüsü veya donanım bloğu, komutları sırayla yürütür.
Senkronizasyon çerçevesi, birden fazla tüketicinin veya üreticinin,
ve bağımlılık bilgilerini tek bir fonksiyonla
paylaşarak tampon kullanmayı
parametresinden sonra bir değer girin. Çitler bir dosya tanımlayıcısı ile desteklenir ve
örneğine bakalım. Örneğin, bir çit iki
İki ayrı imaj tüketicisinin tamamlandığını belirten sync_pt
değerleri
bir tampon okumayı öğreteceğim. Çit sinyali alındığında, görüntü üreticileri hem
tükettiğini görüyoruz.
sync_pt
değerleri gibi çitler etkin durumda başlar ve durumu şuna göre değiştirir:
ve puanlarının durumu. Tüm sync_pt
değerleri sinyal haline gelirse
sync_fence
sinyale dönüşür. Bir sync_pt
düşerse
hata durumuna geçirirse sync_fence
öğesinin tamamında hata durumu görüntülenir.
sync_fence
üyeliği, kurallar bittikten sonra değiştirilemez
oluşturuldu. Bir çitte birden fazla nokta elde etmek için birleştirme
İki farklı çitten alınan noktaların üçüncü bir çite eklendiği uygulamadır.
Bu noktalardan biri başlangıçtaki çimde işaret edilmiş, diğeri ise işaretlenmemişse
devre dışı da bırakabilirsiniz.
Açık senkronizasyon yapmak için aşağıdakileri sağlayın:
- Senkronizasyon çerçevesini uygulayan çekirdek alanı alt sistemi
sürücüye yönelik bir çağrıdır. Çitlere karşı dikkatli olması gereken sürücüler
Donanım Oluşturucu'ya erişen veya iletişim kuran her şeyi içerir.
Önemli dosyalar şunlardır:
- Temel uygulama:
kernel/common/include/linux/sync.h
kernel/common/drivers/base/sync.c
kernel/common/Documentation/sync.txt
adresindeki belgeler- Şurada çekirdek alanıyla iletişim kuracak şekilde
platform/system/core/libsync
.
- Temel uygulama:
- Tedarikçi firmanın uygun senkronizasyonu sağlaması gerekir.
validateDisplay()
ve HAL'depresentDisplay()
işlevi var. - Çitle ilgili iki GL uzantısı (
EGL_ANDROID_native_fence_sync
veEGL_ANDROID_wait_sync
) ve grafiklerde çit desteği gerekir.
Örnek olay: Ekran sürücüsü uygulama
Senkronizasyon işlevini destekleyen API'yi kullanmak için
Ekran arabellek işlevine sahip bir ekran sürücüsü geliştirmenize yardımcı olabilir. Şu tarihten önce:
senkronizasyon çerçevesi vardı, bu işlev dma-buf
bu arabellekleri ekrana koyun ve arabellek görünür durumdayken engelleyin. Örneğin,
örnek:
/* * assumes buffer is ready to be displayed. returns when buffer is no longer on * screen. */ void display_buffer(struct dma_buf *buffer);
Senkronizasyon çerçevesiyle, display_buffer
işlevi
daha karmaşıktır. Arabellek ekranda gösterilirken arabellek,
tamponun ne zaman hazır olacağını belirten bir çitle ekleyebilirsiniz. Sıraya alabilirsiniz
ve sınır ortadan kalktıktan sonra işe başlayabileceksiniz.
İşleri sıraya alındıktan sonra başlatmak ve işleri bir engel ortadan kalktıktan sonra başlatmak hiçbir şeyi engellemez. Kendi çitinizi hemen iade edersiniz. Böylece proje tamponun devre dışı bırakılır. Tamponları sıraya alırken çekirdek bağımlılıklarını görebilirsiniz:
/* * displays buffer when fence is signaled. returns immediately with a fence * that signals when buffer is no longer displayed. */ struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence *fence);
Senkronizasyon entegrasyonu
Bu bölümde, çekirdek-uzay senkronizasyonu çerçevesinin Android çerçevesinin kullanıcı alanı kısımları ve iletişim kurması gereken sürücüler olabiliyor. Çekirdek alanı nesneleri, kullanıcı alanıdır.
Entegrasyon kuralları
Android HAL arayüz kurallarını uygulayın:
- API, bir
sync_pt
ile ilişkili bir dosya tanımlayıcısı sağlıyorsa Tedarikçi firmanın sürücüsünün veya API'yi kullanan HAL'nin, dosya açıklayıcıyı kapatması gerekir. - Tedarikçi firma sürücüsü veya HAL,
API işlevine
sync_pt
bağlantısı verilse bile, tedarikçi firma sürücüsü veya HAL dosya açıklayıcısını kapatın. - Çit dosyası tanımlayıcısını, tedarikçi firma sürücüsünü veya HAL, açıklayıcıyı kopyalamalıdır.
Bir çit nesnesi, BufferQueue'den her geçtiğinde yeniden adlandırılır.
Çekirdek çit desteği, çitlerin adlar için dizelere sahip olmasını sağlar. Bu nedenle,
çerçeve, adını belirtmek için sıraya alınan pencere adını ve arabellek dizinini kullanır
görebilirsiniz. Örneğin SurfaceView:0
. Bu
adlar görünürken kilitlenmenin kaynağını belirlemeye yardımcı olur,
/d/sync
çıkışı ve hata raporları.
ANativeWindow entegrasyonu
ANativeWindow her şeye duyarlıdır. dequeueBuffer
,
queueBuffer
ve cancelBuffer
özel parametrelere sahip.
OpenGL ES entegrasyonu
OpenGL ES senkronizasyon entegrasyonu iki EGL uzantısına dayanır:
EGL_ANDROID_native_fence_sync
, şurada yerel Android çit dosyası tanımlayıcılarını sarmala veya oluştur:EGLSyncKHR
nesne.EGL_ANDROID_wait_sync
, GPU tarafındaki gecikmelere izin verir yerine GPU'nunEGLSyncKHR
kadar beklemesine neden olur. İlgili içeriği oluşturmak için kullanılanEGL_ANDROID_wait_sync
uzantısı ile aynıEGL_KHR_wait_sync
uzantısı.
Bu uzantıları bağımsız olarak kullanmak için
İlişkili EGL_ANDROID_native_fence_sync
uzantısı
çekirdek desteği. Sonra, EGL_ANDROID_wait_sync
etkinleştirin
uzantısına sahip olursunuz. EGL_ANDROID_native_fence_sync
uzantısı, ayrı bir yerel çit EGLSyncKHR
nesnesinden oluşur
türü. Bu nedenle, mevcut EGLSyncKHR
için geçerli olan uzantılar
nesne türlerinin EGL_ANDROID_native_fence
için geçerli olması gerekmez
kullanarak istenmeyen etkileşimleri önler.
EGL_ANDROID_native_fence_sync
uzantısı, buna karşılık gelen bir yerel reklam kullanır
yalnızca oluşturma sırasında ayarlanabilen ve
mevcut bir senkronizasyon nesnesinden doğrudan sorgulanamaz. Bu özellik
iki moddan birine ayarlanabilir:
- Geçerli bir çit dosyası tanımlayıcısı, mevcut bir yereli sarmalar
EGLSyncKHR
nesnesinde Android çit dosyası tanımlayıcısı. - -1,
EGLSyncKHR
nesne.
Şunu ayıklamak için DupNativeFenceFD()
işlev çağrısını kullanın:
Yerel Android çit dosyası tanımlayıcısından EGLSyncKHR
nesnesi.
Bu, set özelliği sorgulamasıyla aynı sonuca sahiptir ancak
bu kurala uygun hareket etmez (bu nedenle,
işlemi) ekleyebilirsiniz. Son olarak, EGLSyncKHR
nesnesini yok etmek kapanır
dahili çit özelliği.
Donanım Oluşturucu entegrasyonu
Donanım Oluşturucu üç tür senkronizasyon engelini işler:
- Parmaklıkları edinme, giriş arabellekleriyle birlikte
setLayerBuffer
vesetClientTarget
çağrıları. Bunlar, arabelleğe alma için bekleyen bir yazma işlemini temsil eder ve SurfaceFlinger veya HWC, ilişkili arabellekteki verileri okuyarak performansı artırır. - Parmakları serbest bırakma komutu şu çağrıdan sonra alınır:
presentDisplay
,getReleaseFences
aramasını kullanarak. Bunlar, aynı katmanda bulunan önceki arabellekten okunmayı bekleyen bir durumu temsil eder. CEVAP HWC önceki arabelleği artık kullanmadığında özel sınır sinyallerini bırakın çünkü mevcut arabellek, ekrandaki önceki arabelleğin yerini almıştır. Yayın parmaklıkları, önceki arabelleklerle birlikte uygulamaya geri gönderilir geçerli beste sırasında değiştirilir. Uygulamanın bir sonraki aşamaya kadar beklemesi gerekir arabelleğe almaya devam edecek yeni içerikler yazmadan önce geri döndü. - Mevcut çitler,
presentDisplay
adlı kişiye çağrı. Mevcut çitler, kompozisyonu tamamlanmış veya alternatif olarak önceki karenin beste sonucuna artık gerek yok. Fiziksel için ifadesi görüntülenirsepresentDisplay
, ekranda geçerli kare görünür. Mevcut çitler döndürüldükten sonra güvenli değilse SurfaceFlinger hedef arabelleğine tekrar yazmak güvenlidir geçerlidir. Sanal ekranlarda, mevcut çitler okunması güvenli değildir.