программа испытаний поверхности - PullRequest
2 голосов
/ 19 июня 2010

Я хочу написать нативное приложение в Android для тестирования Surfaceflinger.Есть ли какая-нибудь простая программа, которая показывает, как создавать поверхности, регистрировать буферы и постбуферы на Surfaceflinger.

Ответы [ 5 ]

3 голосов
/ 23 мая 2011

frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp хорошее место для начала. Но моя версия (Eclair от поставщика) тестового приложения устарела, некоторые API Surface были перемещены в SurfaceControl, и вам необходимо:
SurfaceComposerClient::createSurface() => SurfaceControl
SurfaceControl->getSurface() => Surface

Второе использование SurfaceComposerClient::openTransaction()/closeTransaction() привязать все транзакции к поверхности SurfaceFlinger, например:
Surface::lock()/unlockAndPost() и SurfaceControl::setLayer()/setSize()

Вот несколько примеров кодов (надеюсь, это скомпилируется: P)

sp<SurfaceComposerClient> client;
sp<SurfaceControl> control;
sp<Surface> surface;
SurfaceID sid = 0;
Surface::SurfaceInfo sinfo;
// set up the thread-pool, needed for Binder
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
client = new SurfaceComposerClient();
control = client->createSurface(getpid(), sid, 160, 240, PIXEL_FORMAT_RGB_565);
surface = control->getSurface();

// global transaction sometimes cannot trigger a redraw
//client->openGlobalTransaction();

printf("setLayer...\n");
client->openTransaction();
control->setLayer(100000);
client->closeTransaction();
printf("setLayer done\n");

printf("memset 0xF800...\n");
client->openTransaction();
surface->lock(&sinfo);
android_memset16((uint16_t*)sinfo.bits, 0xF800, sinfo.s*pfInfo.bytesPerPixel*sinfo.h);
surface->unlockAndPost();
client->closeTransaction();
printf("memset 0xF800 done\n");
sleep(2);

printf("setSize...\n");
client->openTransaction();
control->setSize(80, 120);
client->closeTransaction();
printf("setSize done\n");
sleep(2);

printf("memset 0x07E0...\n");
client->openTransaction();
surface->lock(&sinfo);
android_memset16((uint16_t*)sinfo.bits, 0x07E0, sinfo.s*pfInfo.bytesPerPixel*sinfo.h);
surface->unlockAndPost();
printf("memset 0x07E0 done\n");
client->closeTransaction();
sleep(2);

printf("setPosition...\n");
client->openTransaction();
control->setPosition(100, 100);
client->closeTransaction();
printf("setPosition done\n");
sleep(2);

// global transaction sometimes cannot trigger a redraw
//client->closeGlobalTransaction();

printf("bye\n");
2 голосов
/ 17 мая 2013

Я также ищу какое-то подобное приложение в Jelly bean, но я не могу получить отдельное приложение, которое я могу создать и запустить, и вижу некоторые результаты на экране. Есть некоторые приложения, но они не создаются в Jellybean, так как немногие API-интерфейсы были бы изменены на более низком уровне. Пожалуйста, предоставьте несколько указателей. Я хочу использовать это приложение, чтобы понять поверхность флинера и подсистемы дисплея Android.

Спасибо, Vibgyor

2 голосов
/ 06 мая 2011

Для пряников код в / Рамки / база / услуги / SurfaceFlinger

Оформите заказ на этом сайте, чтобы узнать больше о Surfaceflinger http://kcchao.wikidot.com/surfaceflinger

1 голос
/ 08 мая 2012

Если вы ищете, как напрямую взаимодействовать с SurfaceFlinger, лучше всего заглянуть в код SurfaceComposerClient в /frameworks/base/libs/gui.

1 голос
/ 18 сентября 2010

Посмотрите исходный код для SurfaceFlinger (интересующей вас платформы).

.. / каркасы / база / ЛИЭС / SurfaceFlinger / тесты / размер / resize.cpp

[платформы / рамки / base.git] /opengl/tests/gralloc/gralloc.cpp

Он в основном делает то, что вы описываете, хотя понимаете, что это низкоуровневые нативные API, которые постоянно развиваются в Android.

...