Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2|回复: 1
打印 上一主题 下一主题

利用GraphicBuffer来复制系统

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
跳转到指定楼层
楼主
发表于 2016-4-17 15:40:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上层的程序,处理号surface,会交给surfaceflinger处理。

BufferQueue中间有一个listener:
class ProxyConsumerListener : public BnConsumerListener {    public:        //省略構造函數        virtual void onFrameAvailable();        /*當一塊buffer可以被消費時,這個函數會被調用,特別注意此時沒有共享鎖的保護*/        virtual voidonBuffersReleased();        /*BufferQueue通知consumer它已經釋放其slot中的一個或多個 GraphicBuffer引用*/    private:            wp<ConsumerListener>mConsumerListener;}


[backcolor=rgba(128, 128, 128, 0.0470588)]这个listener会通过surfaceflinger一步一步,最终会调用到FramebufferSurface:nFrameAvailable()
/media/doraemon/works/android/mtk/6735/alps_ok/frameworks/native/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
// Overrides ConsumerBase:nFrameAvailable(), does not call base class impl.
void FramebufferSurface:nFrameAvailable() {
    sp<GraphicBuffer> buf;
    sp<Fence> acquireFence;
    status_t err = nextBuffer(buf, acquireFence);
    if (err != NO_ERROR) {
        ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)",
                strerror(-err), err);
        return;
    }
    err = mHwc.fbPost(mDisplayType, acquireFence, buf);
    if (err != NO_ERROR) {
        ALOGE("error posting framebuffer: %d", err);
    }
}

回复

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
沙发
 楼主| 发表于 2016-4-17 16:35:38 | 只看该作者
上面出现了最终的buf,这个buf是一个GraphicBuffer类对象。
GraphicBuffer

frameworks/native/include/ui/GraphicBuffer.h

Represents a buffer, wraps ANativeWindowBuffer
Attributes including width, height, format, usage inherited from ANativeWindowBuffer
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2025-12-15 02:04 , Processed in 0.011284 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表