笔记:CAMX拓扑图的XML定义(阶段输出 2)

CAMX通过XML指定各个处理节点Node的连接拓扑图。在高通CHI文档的第6章有XML各个标签的基本介绍。

usecaseconverter.pl文件对XML文件进行解析,并生成对应拓扑图信息的头文件。

相关数据结构

可以将Usecase标签看作是一级标签,Usecase下比较重要的两个标签是Target和Pipeline:

  1. public class USECASE
  2. {
  3.     public string UsecaseName;
  4.     public List<TARGET> Targets = new List<TARGET>();
  5.     public List<PIPELINE> Pipelines = new List<PIPELINE>();
  6. }

CAMX中都将单个数组结构拎出来定义,并包装在另一个结构中(在其中指定数组中元素的个数)。所以和上述List的结构有所不同。

Target

如下ChiTarget结构的定义,pBufferFormats是各个Target图片格式的数组,numFormats是数组元素的大小(感觉这两个封装在一起会更紧凑一点):

Pipeline

Pipeline下比较重要的两个标签是Node和Link:

  1. public class PIPELINE
  2. {
  3.     public string PipelineName;
  4.     public List<NODE> Nodes = new List<NODE>();
  5.     public List<LINK> Links = new List<LINK>();
  6. }

之后会用画出来的拓扑图来辅助理解:

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实验的失败,意识到还完全不了解拓扑框架下的细节。需要学习的地方还有很多啊!