笔记:CAMX拓扑图的XML定义(阶段输出 2)
CAMX通过XML指定各个处理节点Node的连接拓扑图。在高通CHI文档的第6章有XML各个标签的基本介绍。
usecaseconverter.pl文件对XML文件进行解析,并生成对应拓扑图信息的头文件。
相关数据结构
可以将Usecase标签看作是一级标签,Usecase下比较重要的两个标签是Target和Pipeline:
- public class USECASE
- {
- public string UsecaseName;
- public List<TARGET> Targets = new List<TARGET>();
- public List<PIPELINE> Pipelines = new List<PIPELINE>();
- }
CAMX中都将单个数组结构拎出来定义,并包装在另一个结构中(在其中指定数组中元素的个数)。所以和上述List的结构有所不同。
Target如下ChiTarget结构的定义,pBufferFormats是各个Target图片格式的数组,numFormats是数组元素的大小(感觉这两个封装在一起会更紧凑一点):
PipelinePipeline下比较重要的两个标签是Node和Link:
- public class PIPELINE
- {
- public string PipelineName;
- public List<NODE> Nodes = new List<NODE>();
- public List<LINK> Links = new List<LINK>();
- }
之后会用画出来的拓扑图来辅助理解:
Link中源端口只能有一个,但是目的端口可以有多个。所以先要生成目的端口数组,对应的数据结构为ChiLinkNodeDescriptor:
然后,ChiNodeLink结构就完整的对应的Link标签里面的内容:
InputPort和OutputPort和画图的道理是一样的,仅仅画出各条link,图片肯定杂乱无章。Node的输入、输出端口附带在Link标签信息里,需要进行提取整合,从而获得完整的Node信息。
输出端口的结构如下,除了portid之外还附带了其他很多信息,需要之后继续学习和了解;相对而言,输入端口的结构简单了不少:
最后整合Node信息对应ChiNode,输入和输出端口信息包含在nodeAllPorts成员里:
SinkBuffer和SourceBuffer这两个内容比较特殊,一个是最终输出的内容,一个是最开始输入的内容。它们没有在Node标签里定义,而是和Target关联。现在理解的是把它们当成特殊的Node,所以同样需要统计Port信息。但它们都是单侧的,比如SinkBuffer只需要统计连入它的Node对应的Port。
ChiPipelineTargetCreateDescriptor最终Pipeline信息对应的数据结构就是ChiPipelineTargetCreateDescriptor,这里就不再给出了,它就是上述内容的全部整合:包括了Pipeline的名字;包括了各个Node信息、各个Link信息;包括了SinkTarget信息;包括了SourceTarget信息。
总结和思考
一开始我是想画出“漂亮”的可视化拓扑图而自己对XML进行了一番结构体定义和数据处理,发现一些处理过程有一些相通之处,也都要统计input和output端口,也要考虑source和sink的一些概念(要想画出层次分明的图,似乎要类似拓扑排序那样,从源节点进行dfs)。
处理现有的XML文件时,也发现一些模糊不清的地方:node的唯一标识方式是确定的,就是nodeid+nodeinstanceid;但是node下port的唯一标识方式就比较模糊,不能仅仅通过portid进行区分。
感觉目前了解的层面也就是处于解析画图的层次,加之之前添加node实验的失败,意识到还完全不了解拓扑框架下的细节。需要学习的地方还有很多啊!