【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ②

DRQ的作用:
    DRQ负责调度管理pipeline里的node处理逻辑(通过node之间的dependency依赖机制)
    利用多线程并行处理Pipeline中并行的node,加快处理速度


DRQ运转流程:
        DRQ先告诉node fill dependency, 此时seq id 为0(metadata/property,buffer,chifence)
        metadatapool  writeDataList - DRQ - thread pool - node 此时seq id 为1
        buffer signal - camsync - DRQ - node
        chifence signal - camsync - DRQ - node

线程池和DRQ实例:
    
    session, pipeline, node, drq, metapool等用的是chicontext里的同一个线程池
    ChiContext::Initialize()
    {
        ThreadManager::Create(&m_pThreadManager, "SoloThreadManager", numThreads);
        //线程池handler会传递给session, pipeline, node, drq, metapool等进行共同使用
    }

    一个session里面所有的pipeline共用一个DRQ
    Session::Initialize()
    {
        m_pDeferredRequestQueue = DeferredRequestQueue::Create(&pDeferredCreateData);
    }
    
重要结构体介绍:
DeferredRequestQueue:
        class DeferredRequestQueue : public IPropertyPoolObserver(观察者模式)
        {
            Hashmap*                    m_pDependencyMap;       ///< Hashmap to store pending dependencies(所有的依赖)
            ThreadManager*              m_pThreadManager;       ///< 指向一个线程池
            Session*                    m_pSession;             ///< pointer to Session to which this DRQ belongs
            JobHandle                   m_hDeferredWorker;      ///< 通过这个worker handle执行异步操作
            LightweightDoublyLinkedList m_deferredNodes;        ///< List of deferred nodes
            LightweightDoublyLinkedList m_readyNodes;           ///< List of ready nodes
            MetadataPool*               m_pMainPools[MaxPipelinesPerSession];  ///< 保存了每个pipeline的result metadata pool
        }

    DependencyUnit:(每个node需要填充的Dependency)
    每个Node需要填写自己处理一个request需要的dependency(chifence, fence, metadata/property),只有所有的dependency都满足后,DRQ才会调度线程池去安排node处理request
        struct DependencyUnit
        {
            PropertyDependency propertyDependency(metadata);
            bufferDependency;// input buffer fence
            chiFenceDependency;// non buffer fence(NCS)
        }

Dependency:(node填充完Dependency后会送到DRQ,这个是转换为属于DRQ的Dependency)


DependencyKey:(Hashmap的key)
    struct DependencyKey
    {
        UINT64 requestId;      ///< Request ID
        UINT64 pipelineId;     ///< pipeline id for the data
        UINT32 dataId;         ///< Property/Metadata/Data identifier
        VOID*  pFence;         ///< Fence pointer
        VOID*  pChiFence;      ///< Chi Fence pointer
    };

mapKey-property类型:
    DependencyKey mapKey  = {request, pDependency->pipelineIds[i], pDependency->properties[i], NULL, NULL};

mapKey-buffer fence(csl)类型:
    DependencyKey mapKey = {0, 0, PropertyIDInvalid, pDependency->phFences[i], NULL};

mapKey-chi fence类型:
    DependencyKey mapKey = {0, 0, PropertyIDInvalid, NULL, pDependency->pChiFences[i]};

HashMap结构图:

m_deferredNodes 与 m_readyNodes 结构:

    所有的Dependency会先加入到m_deferredNodes 链表中,当所有的Dependency满足时会添加到m_readyNodes链表中
    m_readyNodes会丢进线程池中去处理(即调用当前已经满足依赖的node processrequest)

DRQ相关知识点可以结合以下博客,共同分析:

【Qcom Camera】DumpDebugInfo分析-CSDN博客

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cam_Rxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值