温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Graphic 学习笔记

发布时间:2020-05-30 23:08:36 来源:网络 阅读:785 作者:lindt 栏目:移动开发

发现一个比较好的介绍graphic帖子, 后面会跟着帖子来梳理下graphic相关知识点
http://blog.csdn.net/u014409795/article/details/51276468


  1. BufferQueue

       class BufferQueue {
              class ProxyConsumerListener : public BnConsumerListener;
              static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
                        sp<IGraphicBufferConsumer>* outConsumer,
                        const sp<IGraphicBufferAlloc>& allocator = NULL);
        private:
             BufferQueue(); // Create through createBufferQueue

     }

     //看起来只有consumer一个角色?


    void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
        sp<IGraphicBufferConsumer>* outConsumer,
        const sp<IGraphicBufferAlloc>& allocator) {

        sp<BufferQueueCore> core(new BufferQueueCore(allocator));
        sp<IGraphicBufferProducer> producer(new BufferQueueProducer(core));

        sp<IGraphicBufferConsumer> consumer(new BufferQueueConsumer(core));

    

  BufferQueue核心是BufferQueueCore,

  看BufferQueueCore里面是管理什么的 

  class BufferQueueCore : public virtual RefBase {

          friend class BufferQueueProducer;
          friend class BufferQueueConsumer;

           typedef Vector<BufferItem> Fifo;  //一个BufferItem Vector

         private:

         // mAllocator is the connection to SurfaceFlinger that is used to allocate
         // new GraphicBuffer objects.
        sp<IGraphicBufferAlloc> mAllocator;
         // mSlots is an array of buffer slots that must be mirrored on the producer
        // side. This allows buffer ownership to be transferred between the producer
        // and consumer without sending a GraphicBuffer over Binder. The entire
       // array is initialized to NULL at construction time, and buffers are
       // allocated for a slot when requestBuffer is called with that slot's index.
        BufferQueueDefs::SlotsType mSlots;   //


        BufferSlot()
    : mEglDisplay(EGL_NO_DISPLAY),
      mBufferState(BufferSlot::FREE),   //state
      mRequestBufferCalled(false),
      mFrameNumber(0),
      mEglFence(EGL_NO_SYNC_KHR),
      mAcquireCalled(false),
      mNeedsCleanupOnRelease(false),
      mAttachedByConsumer(false) {
    }

    // mGraphicBuffer points to the buffer allocated for this slot or is NULL
    // if no buffer has been allocated.
    sp<GraphicBuffer> mGraphicBuffer;   //bufferslot中指向GraphicBuffer

  

    enum BufferState { // state 表示buffer state

     FREE = 0,  //FREE indicates that the buffer is available to be dequeued by the producer.
     // 允许produce获取该buffer,填充数据,状态变为dequeue    free 时表示该buffer还被bufferqueue 所有

   DEQUEUED = 1,// DEQUEUED indicates that the buffer has been dequeued by the  producer, but has not yet been queued or canceled. The slot is "owned" by the producer.  处于待填充数据状态,被producer所有

  QUEUED = 2,//QUEUED indicates that the buffer has been filled by the producer and queued for use by the consumer; producer填充完数据,准备提供给consumer消费,被bufferqueue所有

   ACQUIRED = 3//ACQUIRED indicates that the buffer has been acquired by the  consumer.

   buffer被consumer获取到,消费完后转为free

   

   在bufferqueuecore中bufferItem又是什么
   class BufferItem : public Flattenable<BufferItem> {

   // mGraphicBuffer points to the buffer allocated for this slot, or is NULL
    // if the buffer in this slot has been acquired in the past (see
    // BufferSlot.mAcquireCalled).
    sp<GraphicBuffer> mGraphicBuffer; //也有GraphicBuffer指针 

     union {
        // mSlot is the slot index of this buffer (default INVALID_BUFFER_SLOT).
        int mSlot; // slot数组中索引

        // mBuf is the former name for mSlot
        int mBuf;  // 旧名字
    };

   

   BufferSlot 与 BufferItem 都指向GraphicBuffer,然后又 通过mSlot下标关联起来,至于两者使用场景再看
 


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI