主题 : android2.3里面都没有copybit了,为啥友善的prebuild里面还有个 复制链接 | 浏览器收藏 | 打印
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
楼主  发表于: 2011-05-05 09:33

 android2.3里面都没有copybit了,为啥友善的prebuild里面还有个

copybit.mini6410.so?这个有用么?我在2.3的framework/base/opengl/libagl里面没用发现copybit的上层实现,友善弄个下层的hareware层干嘛?求解答
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
1楼  发表于: 2011-05-05 09:36
这个太具有迷惑性了!难道友善在android2.3里面添加了copybit支持?
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
2楼  发表于: 2011-05-05 09:50

 回 1楼(xiexiedajia) 的帖子

通过查看友善光盘2,3里面libagl里面的代码发现,与2.1相比,这里已经完全去除了copybit接口,贴个简单的例子,注意看两个的最后不同
2.1的ogles_context_t初始化
ogles_context_t *ogles_init(size_t extra)
{
    void* const base = malloc(extra + sizeof(ogles_context_t) + 32);
    if (!base) return 0;

    ogles_context_t *c =
            (ogles_context_t *)((ptrdiff_t(base) + extra + 31) & ~0x1FL);
    memset(c, 0, sizeof(ogles_context_t));
    ggl_init_context(&(c->rasterizer));

    // XXX: this should be passed as an argument
    sp<EGLSurfaceManager> smgr(new EGLSurfaceManager());
    c->surfaceManager = smgr.get();
    c->surfaceManager->incStrong(c);

    sp<EGLBufferObjectManager> bomgr(new EGLBufferObjectManager());
    c->bufferObjectManager = bomgr.get();
    c->bufferObjectManager->incStrong(c);

    ogles_init_array(c);
    ogles_init_matrix(c);
    ogles_init_vertex(c);
    ogles_init_light(c);
    ogles_init_texture(c);

    c->rasterizer.base = base;
    c->point.size = TRI_ONE;
    c->line.width = TRI_ONE;

    // in OpenGL, writing to the depth buffer is enabled by default.
    c->rasterizer.procs.depthMask(c, 1);

    // OpenGL enables dithering by default
    c->rasterizer.procs.enable(c, GL_DITHER);

    c->copybits.blitEngine = NULL;
    c->copybits.minScale = 0;
    c->copybits.maxScale = 0;
    c->copybits.drawSurfaceBuffer = 0;

#ifdef LIBAGL_USE_GRALLOC_COPYBITS
    hw_module_t const* module;
    if (hw_get_module(COPYBIT_HARDWARE_MODULE_ID, &module) == 0) {
        struct copybit_device_t* copyBits;
        if (copybit_open(module, &copyBits) == 0) {
            c->copybits.blitEngine = copyBits;
            {
                int minLim = copyBits->get(copyBits,
                        COPYBIT_MINIFICATION_LIMIT);
                if (minLim != -EINVAL && minLim > 0) {
                    c->copybits.minScale = (1 << 16) / minLim;
                }
            }
            {
                int magLim = copyBits->get(copyBits,
                        COPYBIT_MAGNIFICATION_LIMIT);
                if (magLim != -EINVAL && magLim > 0) {
                    c->copybits.maxScale = min(32*1024-1, magLim) << 16;
                }
            }
        }
    }
#endif // LIBAGL_USE_GRALLOC_COPYBITS

    return c;
}
2.3的ogles_context_t初始化
ogles_context_t *ogles_init(size_t extra)
{
    void* const base = malloc(extra + sizeof(ogles_context_t) + 32);
    if (!base) return 0;

    ogles_context_t *c =
            (ogles_context_t *)((ptrdiff_t(base) + extra + 31) & ~0x1FL);
    memset(c, 0, sizeof(ogles_context_t));
    ggl_init_context(&(c->rasterizer));

    // XXX: this should be passed as an argument
    sp<EGLSurfaceManager> smgr(new EGLSurfaceManager());
    c->surfaceManager = smgr.get();
    c->surfaceManager->incStrong(c);

    sp<EGLBufferObjectManager> bomgr(new EGLBufferObjectManager());
    c->bufferObjectManager = bomgr.get();
    c->bufferObjectManager->incStrong(c);

    ogles_init_array(c);
    ogles_init_matrix(c);
    ogles_init_vertex(c);
    ogles_init_light(c);
    ogles_init_texture(c);

    c->rasterizer.base = base;
    c->point.size = TRI_ONE;
    c->line.width = TRI_ONE;

    // in OpenGL, writing to the depth buffer is enabled by default.
    c->rasterizer.procs.depthMask(c, 1);

    // OpenGL enables dithering by default
    c->rasterizer.procs.enable(c, GL_DITHER);

    return c;
}
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
3楼  发表于: 2011-05-05 10:04
而且/frameworks/base/opengl/libagl下面都没有copybit.cpp这个copybit的上层实现的文件了。
请问prebuild里面的copybit.mini6410.so有什么用?
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
4楼  发表于: 2011-05-05 10:32
Android 2.2起调用copybit的地方就只有几处, 这也是为何copybit效果不太明显的一个原因了
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
5楼  发表于: 2011-05-05 10:36
但是Android2.3已经去掉copybit的上层处理了,为啥下层还能做?
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
6楼  发表于: 2011-05-05 10:39
那copybit.mini6410.so里面封装了那些函数?这些函数在2.3里面有可能被调用么
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
7楼  发表于: 2011-05-05 10:44
虽然少了, 但还是有地方会调用的
级别: 圣骑士
UID: 9690
精华: 0
发帖: 369
金钱: 1955 两
威望: 415 点
综合积分: 738 分
注册时间: 2009-10-10
最后登录: 2017-11-21
8楼  发表于: 2011-05-05 11:00
额,找到了。在egl里面
级别: 新手上路
UID: 10807
精华: 0
发帖: 27
金钱: 140 两
威望: 28 点
综合积分: 54 分
注册时间: 2009-11-18
最后登录: 2017-09-13
9楼  发表于: 2011-06-08 18:08
自己按照2.1的方式 在 egl 与 skia 中加上 copybit 会有效果么