2

surfaceflinger をテストするために、Android でネイティブ アプリケーションを作成したいと考えています。Surfaceflinger でサーフェスを作成し、バッファを登録し、バッファをポストする方法を示す簡単なプログラムはありますか。

4

5 に答える 5

3

frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp始めるのに良い場所です。しかし、私のバージョン(ベンダーのEclair)は古く、一部のSurfaceAPIはに移動されて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");
于 2011-05-23T05:23:37.720 に答える
2

私はジェリービーンでも同様のアプリケーションを探していますが、ビルドして実行でき、画面に出力を表示できるスタンドアロンアプリケーションを取得できません。いくつかのアプリケーションがありますが、下位レベルで変更された API はほとんどないため、それらは Jellybean で構築されていません。いくつかの指針を提供してください。Androidの表面フリンガーと表示サブシステムを理解するためにこのアプリを使いたいです。

ありがとう、ヴィブジョール

于 2013-05-17T06:59:54.773 に答える
2

ジンジャーブレッドのコードは /frameworks/base/services/surfaceflinger にあります

Surfaceflinger に関する情報については、このサイトをご覧ください http://kcchao.wikidot.com/surfaceflinger

于 2011-05-06T07:36:47.143 に答える
1

SurfaceFlinger (関心のあるプラットフォームの) のソース コードを調べます。

../frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp

[プラットフォーム/フレームワーク/base.git]/opengl/tests/gralloc/gralloc.cpp

基本的には、あなたが説明したことを行いますが、これらは低レベルのネイティブ API であり、Android で常に進化していることを認識してください。

于 2010-09-18T13:58:07.143 に答える
1

SurfaceFlinger を直接操作する方法を探している場合は、/frameworks/base/libs/gui にある SurfaceComposerClient コードを調べることから始めるのが最善の方法です。

于 2012-05-08T19:55:28.070 に答える