一种OpenGL多重嵌套显示列表调用方法与流程

文档序号:17396528发布日期:2019-04-13 00:51阅读:420来源:国知局
一种OpenGL多重嵌套显示列表调用方法与流程

本发明属于图形处理技术领域,具体涉及一种opengl多重嵌套显示列表调用方法。



背景技术:

显示列表表示一组存储在一起的opengl数据,可以创建后再多次调用,以提高绘图效率,节省计算机的处理资源。调用一个显示列表时,它所存储的函数就会按照顺序执行。使用显示列表,可以一次定义几何图形或状态更改,并在以后多次执行它们,是opengl为了提高性能而提出的一种图形绘制技术。

opengl通过glcalllist命令对这些数据进行调用,只要知道函数的存储地址及总大小就能很容易的将它们取出并执行,但是当调用过程中出现glcalllist嵌套甚至多重嵌套时,数据调用地址的频繁变更以及跳转现场重要信息保存、后续的补充调用等都是需要解决的技术问题。



技术实现要素:

为了解决现有技术中存在的上述问题,本发明提供了一种opengl多重嵌套显示列表调用方法。本发明要解决的技术问题通过以下技术方案实现:

本发明提供了一种opengl多重嵌套显示列表调用方法,包括:

s1:获取第一显示列表中的每个opengl函数;

s2:依次判断每个所述opengl函数是否为glcalllist命令,若否,则输出所述opengl函数;若是,则执行步骤s3;

s3:根据所述glcalllist命令调用嵌套显示列表;

s4:处理所有所述嵌套显示列表中的未完成部分。

在本发明的一个实施例中,所述s1包括:

s11:获取第一显示列表的存储信息;

s12:根据所述存储信息获取所述第一显示列表中的opengl数据;

s13:对所述opengl数据进行组装,得到opengl函数。

在本发明的一个实施例中,所述s11包括:

s111:确定所述第一显示列表的第一源地址和第一字节大小;

s112:根据所述第一源地址和所述第一字节大小计算所述第一显示列表中最后一条opengl函数对应的第一结束地址。

在本发明的一个实施例中,所述s12包括:

从所述第一源地址开始依次获取所述第一显示列表中的opengl数据。

在本发明的一个实施例中,在所述s1之前还包括:

s0:设置嵌套次数变量,用于统计显示列表调用过程中的嵌套次数。

在本发明的一个实施例中,所述s3包括:

s31:当所述opengl函数中出现glcalllist命令时,将所述嵌套次数变量的值加一;

s32:保存所述glcalllist命令对应的下一条opengl函数的地址及剩余命令的字节大小;

s33:根据所述glcalllist命令所携带的信息跳转至第二显示列表继续进行调用。

在本发明的一个实施例中,所述s33包括:

s331:根据所述glcalllist命令所携带的信息确定所述第二显示列表的第二源地址和第二字节大小;

s332:用所述第二源地址和第二字节大小更新所述第一源地址和第一字节大小;

s333:计算所述第二显示列表中最后一条opengl函数对应的第二结束地址;

s334:从所述第二源地址开始获取所述第二显示列表的opengl数据,并重复步骤s2、s3和s4,直至所有嵌套显示列表调用完毕。

在本发明的一个实施例中,所述s4包括:

s41:当所有嵌套显示列表调用完毕后,对所述嵌套次数变量具有最大值n时对应的第n显示列表的剩余opengl函数进行调用,重复步骤s2、s3和s4;

s42:根据所述嵌套次数变量由大到小顺序,对所有嵌套的显示列表未完成部分中的剩余opengl函数依次进行调用,直至回到所述第一显示列表,并对所述第一显示列表中的所有剩余opengl函数进行调用。

在本发明的一个实施例中,所述s42包括:

s421:当所述第n显示列表调用完毕后,所述嵌套次数变量的值变为n-1;

s422:对嵌套次数变量n-1对应的第n-1显示列表的剩余opengl函数进行调用,重复步骤s2、s3和s4,直至所述嵌套次数变量的值变为0;

s423:对嵌套次数变量0对应的第一显示列表的剩余opengl函数进行调用。

与现有技术相比,本发明的有益效果在于:

本发明的opengl多重嵌套显示列表调用方法从获取显示列表存储信息、获取opengl数据、opengl数据分析以及glcalllist命令嵌套处理等几个方面实现了对显示列表的调用功能,解决了多重glcalllist嵌套情况下数据源地址频繁变更、跳转现场重要信息保存以及后续的补充调用的问题,实现了显示列表数据的准确获取功能。

附图说明

图1是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的示意性流程图;

图2是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的详细流程图;

图3是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的调用过程示意图;

图4是本发明实施例提供的一种用于opengl显示列表调用的tlm模型的模块图;

图5是本发明实施例提供的一种用于opengl显示列表调用的tlm模型的结构示意图;

图6是本发明实施例提供的一种调用控制单元和嵌套表单元的具体结构示意图。

具体实施方式

下面将结合具体实施例对本发明做详细描述,但本发明的实施方式不限于此。

实施例一、

请参见图1,图1是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的示意性流程图。本实施例提供了一种opengl多重嵌套显示列表调用方法,所述方法包括:

s1:获取第一显示列表中的每个opengl函数;

s2:依次判断每个所述opengl函数是否为glcalllist命令,若否,则输出所述opengl函数;若是,则执行步骤s3;

s3:根据所述glcalllist命令调用嵌套的显示列表;

s4:对所有嵌套的显示列表中的未完成部分进行处理。

进一步地,所述s1包括:

s11:获取第一显示列表的存储信息;

具体地,步骤s11包括:

s111:确定所述第一显示列表的第一源地址srcaddr1和第一字节大小size1;

根据原始输入的glcalllist命令携带的显示列表存储地址及字节大小确定所述第一显示列表的第一源地址srcaddr1和第一字节大小size1。

s112:根据所述第一源地址srcaddr1和所述第一字节大小size1计算所述第一显示列表中最后一条opengl函数对应的第一结束地址lastaddr1。

其中,所述第一结束地址lastaddr1的计算公式为:

lastaddr1=srcaddr1+size1。

s12:根据所述存储信息获取所述第一显示列表中的opengl数据;

具体地,从所述第一源地址srcaddr1开始依次获取所述第一显示列表中的opengl数据。

s13:对所述opengl数据进行组装,得到opengl函数。

具体地,对所述完整opengl数据按照设定的格式进行组装,比如加入功能码和标识符等,得到完整opengl函数的列表,以用于以下进行调用和判断。

此外,在本实施例中,在所述s1之前还包括:

s0:设置嵌套次数变量,用于统计显示列表调用过程中的嵌套次数。

具体地,设置参数nestingcount作为嵌套次数变量用来统计显示列表调用过程中的嵌套次数,其中,变量nestingcount的初始值设定为0,当出现一次显示列表的嵌套,也就是每遇到一个glcalllist命令,变量nestingcount的值加一。

接着,请参见图2和图3,图2是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的详细流程图;图3是本发明实施例提供的一种opengl多重嵌套显示列表调用方法的调用过程示意图。如图2所示,所述s2包括:

从所述第一源地址lastaddr1开始依次判断所述opengl函数是否为glcalllist命令,当前opengl函数为非glcalllist命令时,直接输出所述当前opengl函数;判断所述当前opengl函数的结束地址是否为lastaddr1,如否,则转至下一条opengl函数进行判断,若是,则该显示列表的调用结束;当所述当前opengl函数为glcalllist命令时,执行步骤s3。

进一步地,所述s3包括:

s31:当所述opengl函数中出现glcalllist命令时,将所述嵌套次数变量的值加一;

s32:保存所述glcalllist命令对应的下一条opengl函数的地址及剩余命令的字节大小;

s33:根据所述glcalllist命令所携带的信息跳转至第二显示列表继续进行调用。

进一步地,所述s33包括:

s331:根据所述glcalllist命令所携带的信息确定所述第二显示列表的第二源地址srcaddr2和第二字节大小size2;

s332:用所述第二源地址srcaddr2和第二字节大小size2更新所述第一源地址srcaddr1和第一字节大小size1;

s333:计算所述第二显示列表中最后一条opengl函数对应的第二结束地址lastaddr2;

s334:从所述源地址srcaddr2开始获取所述第二显示列表的opengl数据,并重复步骤s2、s3和s4,直至所有嵌套的显示列表调用完毕。

进一步地,所述s4包括:

s41:当所有嵌套的显示列表调用完毕后,对所述嵌套次数变量具有最大值时对应的第n显示列表的剩余opengl函数进行调用,重复步骤s2、s3和s4;

s42:根据所述嵌套次数变量由大到小顺序,对所有嵌套的显示列表未完成部分中的剩余opengl函数依次进行调用,直至回到所述第一显示列表,并对所述第一显示列表中的所有剩余opengl函数进行调用。

具体地,所述s42包括:

s421:当所述第n显示列表调用完毕后,所述嵌套次数变量的值变为n-1;

s422:对嵌套次数变量n-1对应的第n-1显示列表的剩余opengl函数进行调用,重复步骤s2、s3和s4,直至所述嵌套次数变量的值变为0;

s423:对嵌套次数变量0对应的第一显示列表的剩余opengl函数进行调用。

为了更清楚地描述本发明的多重嵌套显示列表的调用方法,现以图3中所示的多重嵌套显示列表为例,对本发明的多重嵌套显示列表调用方法进行描述。

首先,设置嵌套次数变量nestingcount的初始值为0,从第一显示列表的源地址srcaddr1开始依次执行各opengl函数,判断各opengl函数是否为glcalllist命令,若当前opengl函数不是glcalllist命令,则输出该当前opengl函数并执行下一条opengl函数;若当前opengl函数为glcalllist命令,即遇到第一显示列表中的glcalllist命令1,正在进行处理的所述第一显示列表的调用路径将发生跳转,此时,嵌套次数变量nestingcount的值从0变为1,接着保存glcalllist命令1对应的下一条opengl函数的地址及剩余命令的字节大小。根据glcalllist命令1所携带的信息随后调用第二显示列表,类似地,从所述第二显示列表的源地址srcaddr2开始依次执行第二显示列表的各opengl函数,判断各opengl函数是否为glcalllist命令。本实施例中,第二显示列表中不包括glcalllist命令,因此,各opengl函数依次进行执行,不会发生跳转。当执行到第二显示列表中的最后一条opengl函数之后,根据已经保存的glcalllist命令1对应的下一条opengl函数的地址返回第一显示列表,并从所述第一显示列表中的glcalllist命令1的下一条opengl函数开始继续进行调用处理,同时嵌套次数变量nestingcount的值减1,即此处的nestingcount值从1变为0。

接着,当遇到第一显示列表中的glcalllist命令2时,正在进行处理的所述第一显示列表的调用路径将再次发生跳转,此时,嵌套次数变量nestingcount的值加1,即此处的nestingcount值从0变为1,保存glcalllist命令2对应的下一条opengl函数的地址及剩余命令的字节大小。随后根据glcalllist命令2所携带的信息调用第三显示列表,类似地,从所述第三显示列表的源地址srcaddr3开始依次执行第三显示列表的各opengl函数,判断各opengl函数是否为glcalllist命令。当遇到第三显示列表中的glcalllist命令3时,正在进行处理的所述第三显示列表的调用路径将再次发生跳转,此时,嵌套次数变量nestingcount的值再次加1,即此处的nestingcount值从1变为2,保存glcalllist命令3对应的下一条opengl函数的地址及剩余命令的字节大小。随后根据glcalllist命令3所携带的信息调用第四显示列表,类似地,从所述第四显示列表的源地址srcaddr4开始依次执行第四显示列表的各opengl函数,判断各opengl函数是否为glcalllist命令。本实施例中,第四显示列表中不包括glcalllist命令,因此,各opengl函数依次进行执行,不会发生跳转。当执行到第四显示列表中的最后一条opengl函数之后,根据已经保存的glcalllist命令3对应的下一条opengl函数的地址返回第三显示列表,同时嵌套次数变量nestingcount的值减1,即此处的nestingcount值从2变为1,接着从所述第三显示列表中的glcalllist命令3的下一条opengl函数开始继续进行调用处理,直至第三显示列表调用完毕,则根据已经保存的glcalllist命令2对应的下一条opengl函数的地址返回第一显示列表,同时嵌套次数变量nestingcount的值减1,即此处的nestingcount值从1变为0,接着从所述第一显示列表中的glcalllist命令2的下一条opengl函数开始继续进行调用处理,直至所述第一显示列表中的opengl函数全部处理完毕,此时,整个调用过程结束。

本实施例的opengl多重嵌套显示列表调用方法从获取显示列表存储信息、获取opengl数据、opengl数据分析以及glcalllist命令嵌套处理等几个方面实现了对显示列表的调用功能,解决了多重glcalllist嵌套情况下数据源地址频繁变更、跳转现场重要信息保存以及后续的补充调用的问题,实现了显示列表数据的准确获取功能。

实施例二、

在上述实施例的基础上,本实施例提供了一种用于opengl多重嵌套显示列表调用的tlm模型。

请参见图4,图4是本发明实施例提供的一种用于opengl显示列表调用的tlm模型的模块图。本实施例的tlm模型包括显示列表存储单元101,用于存储预先设定的显示列表;调用控制单元102,用于根据glcalllist命令调用所述显示列表;直接存储控制单元104,用于当所述调用控制单元102调用所述显示列表时,获取所述显示列表中的显示列表数据,并且当接收到所述调用控制单元102发送的调用指令时,传输所述显示列表数据至所述调用控制单元102;嵌套表单元103,用于获取并存储所述显示列表数据中的暂停信息,并且当接收到所述调用控制单元102发送的调用指令时,将所述暂停信息反馈至所述调用控制单元102。

具体地,调用控制单元102首先接收外部输入的glcalllist命令,根据该glcalllist命令向直接存储控制单元104发送调用指令,直接存储控制单元104根据所述调用指令获取显示列表存储单元101中相应的显示列表中的显示列表数据,并将所述显示列表数据传输至调用控制单元102,随后调用控制单元102对接收的显示列表数据开始进行处理,当在接收的显示列表中出现glcalllist命令时,调用控制单元102会再次向直接存储控制单元104发送新的调用指令,同时将正在处理的显示列表中的暂停信息存储在嵌套表单元103。接着,直接存储控制单元104根据新的调用指令获取显示列表存储单元101中相应的下一个嵌套的显示列表,并对该显示列表中的显示列表数据进行处理,从而依次进行多重嵌套调用处理。

进一步地,调用控制单元102连接嵌套表单元103,调用控制单元102还用于根据暂停信息对所有显示列表的由于嵌套处理而未完成调用的部分进行重新调用。具体地,所述暂停信息包括显示列表的中glcalllist命令对应的下一条opengl函数的存储地址以及显示列表的剩余未调用部分的字节大小。

进一步地,显示列表存储单元101按照地址划分存储有多个显示列表list_1,list_2,list_x,......,且多个显示列表之间相互独立,也可以相互关联。例如,对于显示列表list_1和list_2,如果list_2不是由list_1中的某个glcalllist命令所指向的显示列表,同样地,list_1也不是由list_2中的某个glcalllist命令所指向的显示列表,那么这两个显示列表是相互独立的;否则,则是有关联的。

进一步地,请参见图5,图5是本发明实施例提供的一种用于opengl显示列表调用的tlm模型的结构示意图。优选地,该tlm模型还包括数据缓冲单元105,数据缓冲单元105连接直接存储控制单元104和调用控制单元102,用于缓存显示列表数据,并将显示列表数据传输至调用控制单元102。

进一步地,请参见图6,图6是本发明实施例提供的一种调用控制单元和嵌套表单元的具体结构示意图。在本实施例中,调用控制单元102包括依次电连接的信息组装模块1021、判断模块1022、调用处理模块1023和计数模块。信息组装模块1021通过tlm接口连接数据缓冲单元105,用于将来自显示列表存储单元101的显示列表数据进行组装,形成依次排列的多个opengl函数;判断模块1022连接信息组装模块1021,用于依次判断多个opengl函数是否为glcalllist命令。调用处理模块1023用于根据判断模块1022的判断结果对所述opengl函数进行相应的处理:若当前opengl函数为非glcalllist命令,直接输出非glcalllist命令;若当前opengl函数为glcalllist命令,根据glcalllist命令调用下一个显示列表,并将当前显示列表的暂停信息发送至嵌套表单元103。

计数模块1024用于统计显示列表的调用次数,得到计数信号。所述计数信号用于控制调用处理模块1023启动调用过程。

进一步地,嵌套表单元103包括嵌套表存储模块1031和反馈模块1032,其中,嵌套表存储模块1031连接调用处理模块1023,用于存储发生调用的显示列表的暂停信息;反馈模块1032连接嵌套表存储模块1031和判断模块1022,用于根据计数模块1024的计数信号将暂停信息反馈至调用控制单元102。

另外,在本实施例中,显示列表存储单元101、调用控制单元102、直接存储控制单元104、嵌套表单元103和数据缓冲单元105上均设置有多个tlm接口(事务级接口),其数据和指令信号的输入输出均通过所述tlm接口进行。

本实施例用于opengl显示列表调用的tlm模型解决了多重glcalllist嵌套情况下数据源地址频繁变更的问题,实现了显示列表数据的准确获取功能。此外,该tlm模型解决了芯片设计早期对glcalllist算法和架构的提前验证问题,且实现周期短,仿真速度快。

以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1