2

我想在 Android 中编写一个本机应用程序来测试surfaceflinger。是否有任何简单的程序显示如何在 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

对于姜饼,代码位于 /frameworks/base/services/surfaceflinger

查看此站点以获取有关 Surfaceflinger http://kcchao.wikidot.com/surfaceflinger的一些信息

于 2011-05-06T07:36:47.143 回答
2

我还在 Jelly bean 中寻找一些类似的应用程序,但我无法获得一个可以构建和运行的独立应用程序,并且可以在屏幕上看到一些输出。有一些应用程序,但它们不是在 Jellybean 中构建的,因为很少有 API 会在较低级别进行修改。请提供一些指示。想用这个app来了解一下Android的surface flinger和显示子系统。

谢谢,维布乔

于 2013-05-17T06:59:54.773 回答
1

如果您正在寻找如何直接与 SurfaceFlinger 交互,最好的开始是查看 /frameworks/base/libs/gui 中的 SurfaceComposerClient 代码。

于 2012-05-08T19:55:28.070 回答
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 回答