【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_pMainPoolsMaxPipelinesPerSession; ///< 保存了每个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->pipelineIdsi, pDependency->propertiesi, NULL, NULL};

mapKey-buffer fence(csl)类型:

DependencyKey mapKey = {0, 0, PropertyIDInvalid, pDependency->phFencesi, NULL};

mapKey-chi fence类型:

DependencyKey mapKey = {0, 0, PropertyIDInvalid, NULL, pDependency->pChiFencesi};

HashMap结构图:

m_deferredNodes 与 m_readyNodes 结构:

所有的Dependency会先加入到m_deferredNodes 链表中,当所有的Dependency满足时会添加到m_readyNodes链表中

m_readyNodes会丢进线程池中去处理(即调用当前已经满足依赖的node processrequest)

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

【Qcom Camera】DumpDebugInfo分析-CSDN博客

相关推荐
朱涛的自习室2 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
应用市场8 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭111999 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
geats人山人海10 小时前
java 7异常
android·java·开发语言
2601_9620710011 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
右手吉他12 小时前
高通平台IA APN问题分析之二
android·物联网
夜雪一千12 小时前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
不浪费一个字节13 小时前
一个纯 Python 实现的 APK 解析与设备操控工具箱
android
itmigrate13 小时前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
hai_android13 小时前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack