surfaceflinger をテストするために、Android でネイティブ アプリケーションを作成したいと考えています。Surfaceflinger でサーフェスを作成し、バッファを登録し、バッファをポストする方法を示す簡単なプログラムはありますか。
5 に答える
frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp
始めるのに良い場所です。しかし、私のバージョン(ベンダーのEclair)は古く、一部のSurface
APIはに移動されて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");
私はジェリービーンでも同様のアプリケーションを探していますが、ビルドして実行でき、画面に出力を表示できるスタンドアロンアプリケーションを取得できません。いくつかのアプリケーションがありますが、下位レベルで変更された API はほとんどないため、それらは Jellybean で構築されていません。いくつかの指針を提供してください。Androidの表面フリンガーと表示サブシステムを理解するためにこのアプリを使いたいです。
ありがとう、ヴィブジョール
ジンジャーブレッドのコードは /frameworks/base/services/surfaceflinger にあります
Surfaceflinger に関する情報については、このサイトをご覧ください http://kcchao.wikidot.com/surfaceflinger
SurfaceFlinger (関心のあるプラットフォームの) のソース コードを調べます。
../frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp
[プラットフォーム/フレームワーク/base.git]/opengl/tests/gralloc/gralloc.cpp
基本的には、あなたが説明したことを行いますが、これらは低レベルのネイティブ API であり、Android で常に進化していることを認識してください。
SurfaceFlinger を直接操作する方法を探している場合は、/frameworks/base/libs/gui にある SurfaceComposerClient コードを調べることから始めるのが最善の方法です。