【问题标题】:surfaceflinger test programsurfaceflinger 测试程序
【发布时间】:2010-06-19 17:29:39
【问题描述】:

我想在 Android 中编写一个原生应用程序进行测试 表面抛掷器。是否有任何简单的程序显示如何创建 Surfaceflinger 上的表面、注册缓冲区和发布缓冲区。

【问题讨论】:

    标签: android android-ndk native platform surfaceflinger


    【解决方案1】:

    frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp 是一个很好的起点。 但是我的测试应用程序版本(来自供应商的 Eclair)已经过时,一些 Surface API 已移至 SurfaceControl,您必须:
    SurfaceComposerClient::createSurface() => SurfaceControl
    @987654326 @ => 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】:

      姜饼的代码在 /frameworks/base/services/surfaceflinger

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

      【讨论】:

        【解决方案3】:

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

        谢谢, 维乔尔

        【讨论】:

          【解决方案4】:

          查看 SurfaceFlinger(您感兴趣的平台)的源代码。

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

          [平台/框架/base.git]/opengl/tests/gralloc/gralloc.cpp

          它基本上可以实现您所描述的,但意识到这些是低级原生 API,并且在 Android 中不断发展。

          【讨论】:

          • 是否可以独立于Android控制台构建和运行这个程序来感受一下?
          • 是的,虽然可能不是您想要做的,但这是可能的。请记住,这些是低级原生 API,因此可能无法跨版本移植。我能想到的一种方法是使用 Android 的 NDK 来满足所有依赖项(包括、库等)。 NDK 确实带有示例代码,可以简单地替换。正确/预期的方法是从源代码构建 Android,然后从源代码树中修改/构建。
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-07
            • 1970-01-01
            • 2016-01-12
            相关资源
            最近更新 更多