用于区带渲染的有效图形状态管理的制作方法

文档序号:6434165阅读:140来源:国知局
专利名称:用于区带渲染的有效图形状态管理的制作方法
技术领域
本发明一般地涉及图形系统,更具体而言涉及图形渲染(rendering)系统。
背景技术
计算机图形系统被广泛用于在二维视频显示屏幕上显示对象的图形表示。当前的计算机图像系统提供非常细致的表示并用于多种应用中。在典型的计算机图形系统中,显示屏幕上所要表示的对象被分解成多个图形图元(primitive)。图元是图形显示的基本组成部分,并可包括点、线、向量和多边形(例如三角形和四边形)。通常,利用硬件/软件方案来渲染或画出下述图形图元,所述图形图元代表显示屏幕上正被表示的一个或多个对象的视图。
要被渲染的三维对象的图元由主计算机以图元数据的方式来定义。例如,当图元是三角形时,主计算机可以按照其顶点的X、Y和Z坐标以及每个顶点的红、绿和蓝(R、G和B)颜色值来定义图元。在具体应用中可以使用其它图元数据。
图像渲染是将基于对象的高级描述转换为用于在某个显示设备上显示的图形化图像。例如,在将三维对象或场景的数学模型转换为位图(bitmap)图像期间,就会发生图像渲染动作。图像渲染的另一个例子是将一个HTML文档转换为一个用于在计算机监视器上显示的图像。通常,称为图形渲染引擎的硬件设备执行这些图形处理任务。图形渲染引擎通常将场景渲染到随后将被输出到图形输出设备的缓冲区中,但某些渲染引擎可能将其二维输出直接写到输出设备中。图形渲染引擎插入图元数据来计算表示每个图元的显示屏幕像素,并计算每个像素的R、G和B颜色值。
这里所用的图形渲染系统(或子系统)指的是在应用程序和图形输出设备之间的所有级别的处理。图形引擎可以提供一种或多种模式的渲染,包括区域渲染(zone rendering)。区域渲染通过实现最优的渲染缓存利用率,由此缓解像素颜色和深度存储器读/写的瓶颈,以此来试图提高整体的3D渲染性能。在区域渲染中,屏幕被划分成区域阵列,并对各个区域生成对应的指令库(instruction bin),所述指令库用来保存渲染每个子图像所需的所有图元和状态设置指令。只要一个图元与一个区域相交(或者可能相交),则将该图元指令置于该区域的库中。一些图元将与一个以上的区域相交,这种情况下该图元指令被复制到对应的多个库中。继续这个过程,直到整个场景被分类到各个库中。在为与一个图元相交的每个区域都建立库的第一次扫描之后,进行第二次逐个区域的渲染扫描。具体而言,形成所有区域的库以生成最终的图像。
为了实现诸如区带渲染之类的平铺式渲染(tile-rendering),维护每个图像空间区带内的正确的图形渲染状态变量非常重要,因为随后(在渲染阶段)需要根据在入库(binning)阶段中遇到每个库的图元时存在的图形状态来提供该库的图元。
用于将图元和它们的合适的图形状态相关联的一种传统方法是单独维护所有遇到的图形状态的拷贝,并将每个图元和某个标签(例如索引)相关联,所述标签标识了以后将用于渲染该图元的特定状态。然而,在低成本且带宽受限(例如集成式的)图形系统中,维护单独的状态表的复杂度以及装载整个状态集的成本(按所需的存储器区域、延迟和带宽来计算)——可能在每个图元之间——是非常高昂的。
因此所需要的是这样一种方法、装置和系统,其可以较低成本且更有效地对区带渲染进行图形状态管理。


图1示出了一个计算机系统的实施例框图,该计算机系统包括用于自动对区带渲染进行存储器管理的图形设备的实施例。
图2示出了一种图形设备的实施例的框图,该图形设备包括图形入库引擎,用于处理包含状态改变量(delta state)、图形渲染引擎和库在内的场景输入列表。
图3示出了包括多个区带和几何图元的区带渲染器屏幕视图的实施例。
图4示出了动态状态子分组以及逐库跟踪位(per-bin tracking bit)的图5示出了区带渲染的场景捕获期间,用于在将图元置入库中之前输出任何所需的状态改变的处理、以及使用所存储的当前动态状态和所述逐库跟踪位向量来有效地管理状态改变处理的实施例的流程图。
图6示出了对检测需要哪些纹理图(texture map)和哪些纹理混合阶段(texture blend stage)这一操作进行优化的处理的实施例的流程图。
具体实施例方式
本发明提供了一种有成本效益的机制,其利用硬件状态入库逻辑,并与用以生成图形化图像的基于平铺层(tile based)的图像渲染方法结合使用,从而跟踪并管理图形状态。根据本发明的实施例,硬件中只维护动态状态变量的当前值。在一个实施例中,动态状态变量包括(但不局限于)被认为可能在图元之间改变的变量。在典型的场景中保持恒定或相当恒定的状态变量一般被排除在外。将动态状态变量的集合划分成子分组。每个状态子分组都和逐库跟踪位阵列相关联。只要在入库阶段遇到了状态改变,就为所有的库设置对应于相关联的状态组的跟踪位。在将图元置于库中之前,检查与该库相关联的跟踪位,并将对应于所设置的跟踪位的当前状态插入到该库中所述图元之前。然后清除用于该库的跟踪位。
如下面所详细讨论的,本发明优化了区带渲染支持,因为它不再需要在驱动程序软件中跟踪状态改变,因而提高了性能并降低了驱动程序复杂度。通过只支持动态状态变量的片上(on-chip)存储,同时提供改变任何状态变量的方式,并且减少对于每个库的跟踪位的片上存储(一般每个库存储4个跟踪位),最小化了入库状态管理的成本。在一个典型的实施例中,每个库的片上存储被减少到了只有4个跟踪位。另外,对状态改变带宽和区域的需求也通过下述方式而减少了(a)背靠背地压缩子分组内的状态改变,(b)消除对非必需的纹理混合阶段和纹理图状态数据的更新,以及(c)提供用于状态子分组改变的优化(并且低延迟的)指令。而且,还降低了管理间接存储的状态阵列和/或缓存的成本和复杂度。
在详细说明中,给出了大量的具体细节以提供对本发明的充分理解。但是,本领域的技术人员将理解到,没有这些具体细节也可以实现本发明。此外,没有详细地描述公知的方法、过程、组件和电路,以免模糊本发明。
接下来的详细描述中的某些部分按照对计算机中数据位或二进制信号的操作的算法和符号表示来展现。这些算法描述和表示是数据处理领域的技术人员用来向本领域其他技术人员传达其工作内容的手段。算法在这里(以及一般地)被认为是产生所期望结果的自相一致的步骤序列。这些步骤包括对物理量的物理操纵。虽然不是必需的,但通常这些量采用能被存储、传送、组合、比较或者操纵的电信号或磁信号的形式。为通用起见,将这些信号称为位、值、元素、符号、字符、项、数等常常被证明是方便的。但是应该理解,所有这些以及类似的术语将与合适的物理量相关联,并仅仅是应用到这些量上的方便的标记。除非在后面的讨论中专门给出了相反的陈述,应该认识到在整个说明书中,采用诸如“处理”或“计算(computing或calculating)”或“确定”等术语的讨论,指的是计算机或计算系统或类似的电子计算设备的下列动作和过程,即将表示为该计算系统的寄存器和/或存储器中的物理(电子)量的数据操纵并转换成类似地表示为该计算系统的存储器、寄存器或其它这样的信息存储、传输或显示设备中的物理量的其它数据。
本发明的实施例可以在硬件或软件、或者两者的组合中实现。但是,本发明的实施例可被实现为在可编程系统上执行的计算机程序,该系统包括至少一个处理器、数据存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设备。可对输入数据应用程序代码以执行这里所描述的功能并产生输出信息。输出信息可以以已知的方式被应用到一个或多个输出设备。为了这一应用目的,处理系统包括任何具有处理器的系统,所述处理器例如是数字信号处理器(DSP)、微控制器、专用集成电路(ASIC)或者微处理器。
程序可以用高级过程性或面向对象的编程语言来实现,以和处理系统通信。如果需要,程序还可以用汇编语言或机器语言来实现。实际上,本发明在范围上并不限于任何具体的编程语言。在任何情况下,该语言都可以是经过编译的语言或解释性的语言。
程序可以被存储在通用或专用可编程处理系统可读的存储介质或设备(例如硬盘驱动器、软盘驱动器、只读存储器(ROM)、CD-ROM设备、闪存设备、数字多功能盘(DVD)或其它存储设备)上,用于当该存储介质或设备被处理系统读取时,配置并操作该处理系统来执行这里所描述的过程。还可认为本发明的实施例可被实现为机器可读的存储介质,其被配置来和处理系统一起使用,其中如此配置的存储介质使得处理系统以特定和预定义的方式操作,来执行这里所描述的功能。
在图1中示出这样一种处理系统的例子。示例系统100可以被用来例如执行根据本发明的方法的处理,例如这里所描述的实施例。示例系统100可表示基于可从英特尔公司得到的微处理器的处理系统,尽管也可以使用其它系统(包括具有其他微处理器的个人计算机(PC)、工程工作站、机顶盒等等)。在一个实施例中,示例系统100可以运行可从微软公司得到的WINDOWSTM操作系统的一个版本,尽管也可以使用例如其他操作系统和图形用户界面。
图1是本发明一个实施例的系统100的框图。计算机系统100包括中央处理器102、包括图形设备106的图形和存储器控制器104、存储器108和显示设备114。处理器102处理数据信号,并可以是复杂指令集计算机(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器、实施多个指令集的组合的处理器、或者例如数字信号处理器的其他处理器设备。处理器102可以耦合到公共总线112,该总线112在处理器102和系统100中的其他组件之间传输数据信号。图1仅仅用来说明。还可以在包括单独的图形设备的配置中利用本发明。
处理器102在公共总线112上发出信号来与存储器108或图形和存储器控制器104通信,以按这里所描述的来操纵数据。处理器102响应于其从存储器108得到的软件指令来发出这样的信号。存储器108可以是动态随机访问存储器(DRAM)设备、静态随机访问存储器(SRAM)设备、或其他存储器设备。存储器108可以存储由数据信号所表示的指令和/或数据,这些指令和/或数据可以被处理器102、图形设备106或某个其它设备执行。这些指令和/或数据可以包括用来执行本发明的任何和/或所有技术的代码。存储器108还可以包含软件和/或数据。可选的缓存110可用于通过利用其访问局部性来加速图形设备106对存储器的访问。在一些实施例中,图形设备106可以从处理器102分担许多渲染图像所需的存储器密集任务。图形设备106处理数据信号,并可以是复杂指令集计算机(CISC)微处理器、精简指令集计算(RISC)微处理器、超长指令字(VLIW)微处理器、实施多个指令集的组合的处理器、或者例如数字信号处理器的其它处理器设备。图形设备106可以耦合到公共总线112,该总线112在图形设备106和系统100中的其它组件之间传输数据信号,这些组件包括渲染缓存110和显示设备114。图形设备106包括渲染硬件,该硬件除了别的功能之外还向显示设备114的特定象素写特定属性(例如颜色),并在显示设备114上画出复杂的图元。图形和存储器控制器104与显示设备114通信,以显示图形控制器104渲染或者处理的图像,从而向用户显示所渲染或处理的图像。显示设备114可以包括计算机监视器、电视机、平板显示器或者其他合适的显示设备。
存储器108存储主机操作系统,该主机操作系统可以包括一个或多个渲染程序来构建图形图元的图像以用于显示。系统100包括诸如图形加速器之类的图形设备106,该图形加速器使用定制的硬件逻辑设备或协处理器,以提高对本来由主机渲染程序处理的图形图元的至少某个部分进行渲染的性能。主机操作系统程序及其主机图形应用编程接口(API)通过驱动程序来控制图形设备106。
参考图2和3,图示了在区带渲染系统120上实现的各种图形对象的实施例160,例如几何图元(即三角形、直线)162。在区带渲染中,屏幕被划分成多个区带164的阵列,区带164通常是具有一定屏幕空间的矩形,尽管也可以使用其他的几何变形。每个区带164与一个库相关联。每个库128包括存储在非连续物理存储器页面中的一连串命令缓冲区134。因此库128优选地实现为一连串独立的物理页面。
当图元162与区带164相交时,相应的图元指令就被置于与相交区带164相关联的库128中。因此每个区带的指令库128被用来保存渲染每个子图像所需的图元指令和状态设置指令,并且,通过将每个图元162的屏幕空间范围与区带164的阵列相比较来产生指令库128。于是,当接收到图元162时,本发明就确定每个图元162所相交的(多个)区带164,并将图元指令复制到与这些区带164中的每个区带相关联的库128中。将图元(及其属性)162分配到区带164的过程称为“入库”。“库”128指的是用于每个区带的抽象缓冲区——其中库128一般被实现为一系列指令批处理缓冲区124。入库过程执行必要的计算来确定哪些图元162位于哪些区带164中,并且可由专用硬件和/或软件实现来执行。在一个典型的实现中,驱动器122为与图元162相交的每个区带164写出一组将由图形入库引擎126解析(parse)的命令,并将这些命令写入到与相交的区带164相关联的缓冲区134中。
一些图元162将与一个以上的区带164相交,这种情况下,图元指令被复制到与相交区带164相对应的库128中。例如,图3中所示的闪电与9个区带164相交。继续此过程,直到整个场景都被分类到库128中。
一旦所有的图元162都被分类并且完成了命令结构,就进行第二次扫描来一次一个区带164地渲染所述场景。在为与图元162相交的每个区带164建库的第一次扫描之后,逐个区带地进行第二次渲染扫描。具体而言,形成所有区带164的库128以产生最终的图像,其中每个场景都一次一个区带164地被渲染。区带164被渲染的顺序并不重要。与触及某个区带164中的象素的图元162相关联的所有库128在渲染下一个区带164之前都被形成。单个图元162可与许多区带164相交,因此需要多次复制。结果,与多个区带164相交的图元162被多次渲染(即对每个相交的区带164都渲染一次)。
由于将图元162分解成与渲染缓存110对齐的若干区带164,渲染性能得到了改进。由于图形设备106每次只对屏幕的一小部分(即区带164)工作,因此它能够将用于整个区带164的帧缓冲区内容保存在渲染缓存110中。区带164的大小一般是一个常数,其被调节成适于渲染缓存110的大小和结构。通过这一机制,渲染缓存110提供了最佳收益——通过利用区带164的空间连贯性(coherence),可最大程度地复用所缓存的数据。通过使用区带渲染模式,只需要执行最少数量的颜色存储器写来每次一个区带164地生成最终的图像,并且同时可以最少化或避免颜色存储器读以及深度存储器读和写。因此,与传统的渲染器相比,对渲染缓存110的使用大大减少了存储器流量并提高了性能,其中所述传统的渲染完整地绘制完每一个图元之后才继续到下一个图元。
参考图2,在典型的实现中,最开始,将被称为场景输入列表124的图形图元和状态设置指令流应用到与图形入库引擎126相关联的图形入库引擎环形缓冲区125。场景输入列表124可以是(应用编程接口所接收到的)单个时间排序的场景描述。图形入库引擎126通常实现为硬件入库引擎(HWB)126。本领域技术人员将认识到也可以使用软件或软件加硬件的入库器。图形入库引擎126对屏幕输入列表124进行解析,并确定每个图元162与哪些(多个)区带164相交。
如前所述,区带164与库128相关联。图形入库引擎126将每个图元162的屏幕空间范围与区带164的阵列比较,并将相关联的图元命令复制到相应的库128中。如图5所示以及如下所述,库128由通常存储在非连续物理存储器页面中的串联的多个命令缓冲区134组成。库列表是包括每个库132的缓冲区134的列表。页面被初始分配到BMP 140。用所述页面的页号来初始化库指针列表130,库指针列表130将写指针存储到库列表132中。
图形入库引擎126还通过对包含在场景输入列表124中的关联状态设置指令进行解析,来维护当前的图形状态。在将图元命令置于任何给定的库128中之前,图形入库引擎126通常在库128中将任何必需的状态设置指令放在所述图元命令之前。
在已经完全对场景输入列表124进行解析之后,相关联的库(即库0、库1...库n-1)就准备好被图形渲染引擎136用来渲染场景了。如下详细讨论的,在场景输入列表124末端包括指令,以使得图形入库引擎126将待处理的场景计数器148中的寄存器加1,并启动对已入库场景的渲染。例如,图形入库引擎126经由路径156向与图形渲染引擎136相关联的图形渲染引擎环形缓冲区157发送渲染指令。
图4示出了当前的动态状态子分组172和逐库跟踪位174的实施例170的框图。将动态状态划分成子分组172提供了跟踪动态状态变量的改变并对之进行改变的一定级别的粒度。在典型的实施例中,将动态状态变量集合划分成4个子分组172。本领域内的技术人员将会认识到4个子分组172对于在此所示出和讨论的配置来说是有优势的,然而,本发明也可利用以任意方式配置的任意数量的子分组172。
每个库128(例如库0、库1、库2……库n)都与多个跟踪位174相关联,每个库位都与特定的动态状态子分组172相关联。当“设置”特定库128的跟踪位174时,它表示自上一次将图元162输出到库128之后,该子分组172中的(并且是用于所述特定库128例如库n的)某个状态变量已经改变了。相反,“被清除”的跟踪位174表示自上一次将图元162输出到库128之后,用于该库128的关联动态状态子分组172没有改变。在典型的实现中,使用每个库4比特的“跟踪位”向量174来跟踪所述4个状态子分组172的改变。“纹理图”、“纹理混合”、“基本状态”和“慢状态”子分组中的每一个一般都包括512或1024个库。对于512个库,一共是2K比特(每个库4比特×512个库)。对于1024个库,一共是4K比特(每个库4比特×1024个库)。
一开始“设置”所有的跟踪位174,以用动态状态的完全的补来初始化每个库128。具体地说,在将图元162置入库128中之前,检查与该库128相关联的跟踪位174,并将对应于所设置的跟踪位174的当前状态置入库128中该图元162之前。然后,清除用于该库128的跟踪位174。在典型的实施例中,许多跟踪位174并不经常改变。然而,必需标识出位174当中任何随时间而改变了的位并将之发送(或将一个更大组的改变了的位发送)到库128,以使得在光栅化(rasterization)期间可以保持三角形的精确状态。
具体地说,图4所示的状态组172包括(1)“基本状态”子分组176——与基本状态跟踪位阵列相关联的状态变量包括但不局限于顶点缓冲区、顶点格式、设置、纹理象素(texel)流和象素流水线状态变量。所述状态变量通常被设置成固定的字序列。在一个特定的实施例中,基本状态变量的任意改变都需要将所有的字发送给所需的库128,尽管本领域内的技术人员将会认识到也可使用其它的配置。在另一个实施例中,对所有的库128或“打开的”(open)库128的一个较小子集实现了更为粒度化的跟踪。
(2)“纹理图”子分组178——与纹理图状态跟踪位阵列相关联的状态变量包括但不局限于大多数纹理图参数、立方图表面激活因子以及纹理滤波器参数。状态变量由图形入库引擎126作为指令的一部分而输出。当发现特定的库128的纹理图状态跟踪位已设置时,图形入库引擎126将只输出与当前的上下文设置当前所需的纹理图相关联的字。“当前所使用的”图由图形入库引擎126通过下述操作来确定检查已激活的纹理混合阶段,查看哪些纹理象素流需要作为输入,然后检查哪些纹理图与那些所需的纹理象素流相关联。
(3)“纹理混合”子分组180——与纹理混合状态跟踪位阵列相关联的状态变量包括但不局限于用来控制纹理图混合阶段的状态变量。在典型的实现中,所述状态变量包括全局控制和纹理混合颜色α,即用于控制1到4个纹理图混合阶段单元的控制阶段参数。这些状态变量由图形入库引擎126作为指令的一部分而输出。当发现特定库128的纹理混合状态跟踪位已设置时,图形入库引擎126将只输出从“已激活的纹理混合阶段”导出的状态变量的当前状态所需要的那些字。
(4)“慢状态”子分组182——与慢状态跟踪位阵列相关联的状态变量是“慢状态指针”。慢状态指针间接地控制未包含在其它状态子分组例如基本、纹理混合和纹理图状态子分组176、178和180中的任意状态指针。在典型的实施例中,将低级状态改变和/或不经常改变的指令置入慢状态缓冲区166中,并且只将所述指针通过指令167传递到那些慢状态缓冲区166中。
“慢状态”组包含其余未流水线化的(以及少量低频度的流水线化的)状态变量。“慢状态”状态变量的改变不直接发送给图形入库引擎126。相反,如图2所示,如下构建包含这些变量的“初始值+改变量”的慢状态缓冲区166,以使得指向这些慢状态缓冲区166之一内部的单个指针就足以定义所有的“慢”状态变量的当前状态。按照这种方式,只有该慢状态指针需要被发送到图形入库引擎126。该慢状态指针的改变将如所需地被置入库128中,并且在渲染期间将启动对慢状态缓冲区166的读,以更新慢状态变量。图形渲染引擎136将执行慢状态“指针”以前的值和新值之间的缓冲指令,尽管所述执行只发生在所述新值落在所述以前的值和所渲染的页面的末端之间的情况下。否则,图形渲染引擎136将执行从新慢状态指针所直到的页面的顶部开始,直到(但不包括)该新慢状态指针指定的双字(Dword)为止的指令。从而,这将使得所有的慢状态指针被设置为它们的初始值,然后应用所有的改变量状态改变,直到(但不包括)所述新慢状态指针所指定的双字。
具体地说,一开始,将称为场景输入列表124的图形图元和状态设置指令流应用到与图形入库引擎126相关联的图形入库引擎环形缓冲区125。图形入库引擎126解析场景输入列表124,并确定每个图元162与哪些164相交。
图形入库引擎126通过解析包含在场景输入列表124中的关联状态设置指令来维护当前的图形状态。在将图元命令置入任何给定的库128中之前,图形入库引擎126将状态设置指令167置入库128中该图元命令之前。
慢状态缓冲区166存储慢状态变量的初始值和改变量状态改变。指向这些慢状态缓冲区166之一内部的单个指针就足以定义所有“慢”状态变量的当前状态。慢状态缓冲区166可位于状态存储器108或专用存储器内部。在典型的实施例中,低级状态改变和/或不经常改变的指令被置入慢状态缓冲区166中,并且入库器(binner)指针只通过指令167传递到那些慢状态缓冲区中。一旦将所有的图元和包含慢状态指针的状态指令入库,就依次一个区带164地对场景进行第二此扫描。提供了所述库128来生成最终的图像,每个场景都是一次一个区带164地渲染。在渲染期间,图形渲染引擎136基于入库的慢状态指针来启动对慢状态缓冲区166的所需的读,以更新慢状态指针。图形渲染引擎136将执行慢状态“指针”先前的值和新值之间的缓冲指令。
图5示出了用于在将与图元162相关联的图元指令置入库128中之前输出任何所需的状态改变(步骤192-208)以及用于检查改变量状态改变并更新状态和逐库跟踪位(步骤212-222)的实施例190的流程图。所述优化最小化了不必要的状态复制。
具体地说,在渲染期间,在将图元指令置入特定的库128之前,图形入库引擎126确保该特定库128的状态至少在可正确地渲染图元162之前是最新的。这意味着在将该图元指令输出到所述库128之前,不需要输出当前未使用的状态。例如,被禁止的纹理混合阶段设置以及未使用的纹理图设置不需要输出到所述库128。
如果遇到了图元162(步骤192),则本发明确定该图元162与哪些区带164相交(步骤194)。对于和所相交的区带164相关联的每个库128(步骤196),检查每个子分组跟踪位174(步骤198)。如果设置了特定子分组的跟踪位174(步骤199),则将该特定子分组172的当前值输出到所述库128(步骤200)。当与一个跟踪位174相关联的状态子分组172变为“已使用”时,该跟踪位174被认为是“已设置的”。
例如,一开始可针对库0而检查基本状态子分组176的子分组跟踪位177。然后清除用于该特定库128的子分组跟踪位174(步骤202)。否则,如果未设置用于特定子分组的跟踪位,则不将该特定子分组172的任何当前值输出给所述库128(步骤201)。
然后检查所述库128的下一个子分组跟踪位174,并且对该库128中的每个位174重复步骤198、200和202(步骤204)。例如,然后可检查用于库0的纹理图子分组178的跟踪位179。
在已经为特定的库128检查了与子分组172相关联的所有跟踪位174之后,将所述图元指令输出到库128(步骤206)。然后检查用于下一个库128的子分组172的跟踪位174(步骤208),所述下一个库128与和图元162所相交的区带164相关联。
例如,参考图4,如果与库0相关联的基本状态跟踪位177表明了改变,则基本状态子分组176的当前值被输出到库0。然后清除基本状态跟踪位177。如果基本状态跟踪位177未表明变化,则不向库0输出值。
然后检查用于下一子分组172的跟踪位174。例如,如果用于库0的纹理图状态跟踪位179表明了改变,则输出纹理图状态178的当前值。然后清除纹理图状态跟踪位179。如果纹理图状态跟踪位179未表明改变,则不向库0输出值。
类似地,如果用于库0的纹理混合状态跟踪位181表明了改变,则输出纹理混合状态180的当前值。然后清除纹理混合状态跟踪位181。如果纹理混合状态跟踪位181未表明改变,则不向库0输出值。
如果用于库0的慢状态跟踪位183表明了改变,则向库0输出慢状态指针。然后清除慢状态跟踪位183。如果慢状态跟踪位183未表明改变,则不向库0输出慢状态指针。
因此,跟踪位174消除了使用失效资源的可能性。例如,如果(a)改变了当前未使用的纹理图,(b)绘制了图元162(清除了各纹理图跟踪位179而未输出未使用的状态),并且(c)改变了状态以使得现在“原封不动”地使用纹理图(即图本身未改变),那么,如果没有任何特殊的处理,失效的纹理图将会不正确地使用。在本发明中,当(由于纹理图状态的状态改变)纹理图变为“已使用”时,设置纹理图跟踪位179,因而消除了使用失效资源的可能性。
使用了状态设置图形指令的优化版本来独立地更新每个动态状态变量子分组172。通过将这些优化的指令包含在库128中,大大减小了读间接状态数据的复杂度和延迟,因而改进了性能并降低了成本。具体地说,图5示出了检查改变量状态改变以及更新状态和逐库跟踪位174(步骤212-222)。图形入库引擎126通过逐个库128以及逐个子分组172地维护并跟踪状态改变,防止了将所有状态改变不必要地广播到所有库128。仅在将图元指令被置入库128之前才更新该库128的状态,这是很有优势的。在图元指令被入库之间发生在同一状态子分组172内的多个改变被压缩成输出到库128的一个子分组改变。
实现步骤212-222,以在场景捕获阶段使用所存储的当前的动态状态和逐库跟踪位174来有效地管理状态改变。通过逐个库128并且逐个状态组172地跟踪状态改变,图形入库引擎126还将只更新下述状态子分组172,所述子分组172在上一次将图元162置入特定的相交库128之后对于该库128已经改变了。
一开始,如果遇到了状态改变(步骤212),则确定对应的动态状态子分组172(步骤214)。然后确定该特定状态变量的先前值(步骤216) 。
如果该状态的新值不同于该状态的当前值(步骤218),则设置用于库128的对应的子分组跟踪位174(步骤220)。然后用该状态的新值来更新所述状态(步骤222)。
慢状态指针如果状态改变修改了“慢状态指针”,则设置用于每个库(i)的慢状态跟踪位(i)。将所述状态改变应用到每个受影响的子分组的当前状态。
基本状态例如,如果状态改变修改了“基本状态”,则设置用于每个库(i)的基本状态跟踪位(i)。
纹理图如果状态改变使得任意所需的纹理图(0…3)变为已设置,则设置用于每个库(i)的纹理图状态跟踪位(i)。如果状态改变修改了纹理图(0…3),则设置用于每个库(i)的纹理图状态跟踪位(i)。
纹理混合如果状态改变修改了所需的“颜色因子”,则设置用于每个库(i)的纹理温和状态跟踪位(i)。如果状态改变增加了已激活的纹理混合阶段的数量,则设置用于每个库(i)的纹理混合状态跟踪位(i)。
图6示出了对具体地检测哪些(如果有的话)与特定纹理图或纹理混合阶段相关联的状态需要被输出到库128这一操作进行优化的处理的实施例230的流程图。具体地说,只有当发现与特定纹理图或纹理混合阶段相关联的子分组跟踪位174已设置时,才将与该特定纹理图或纹理混合阶段相关联的状态信息输出到库128。只有与已使用的纹理图或纹理混合阶段相关联的信息被输出到库128。这通过确保只将新需要的状态或图输出到相交的库,防止了失效的纹理混合或纹理图被使用。当(a)改变了与当前使用的图/阶段相关联的状态时,或者当(b)通过改变成另一个状态变量,以前未使用的图/阶段变成“已使用”时,设置子分组跟踪位174。例如,对于后一情形,由于相关联的状态改变(例如基本状态改变),纹理混合或纹理图变为“已使用”。
对于图元162与之相交的每一个库128(步骤232),检查与该库128相关联的纹理图或混合子分组跟踪位174。如果设置了跟踪位174(步骤240),则检查所述图/阶段(步骤238-244)。如果纹理图/阶段中存在改变(步骤240),则将纹理图/阶段输出到库128(步骤242)。然后检查下一个纹理图/阶段(步骤244)。例如,如果设置了纹理混合状态跟踪位(i)(步骤236),则将已改变的(多个)特定纹理混合阶段输出到库128。具体地说,如果纹理混合阶段0改变了,则输出纹理混合状态1。如果纹理混合阶段1改变了,则输出纹理混合状态2。如果纹理混合阶段2已经到达其最后阶段,则输出纹理混合阶段3,等等。然后清除纹理混合状态跟踪位(步骤246)。
如果设置了纹理图状态跟踪位(i)(步骤232),则将已改变的(多个)特定纹理图输出到库128。具体地说,如果纹理图0改变了,则输出纹理图0。如果纹理图[1]改变了,则输出纹理图1。如果纹理图[2]改变了,则输出纹理图2。如果纹理图[3]改变了,则输出纹理图3,等等。然后清除纹理图状态跟踪位(步骤246)。
如果跟踪位174未表明改变,则绘制图元162,清除各纹理混合状态或纹理图/阶段跟踪位,而不将不必要的状态输出到库128。
现在已经根据专利法的需求描述了本发明,本领域技术人员将理解如何对本发明进行改变和改进,以满足他们的具体要求或情况。可以进行这种改变和改进,而不偏离所附权利要求中提出的本发明的范围和精神。
权利要求
1.一种用于管理状态变量以渲染图元的方法,包括定义多个存储器区域,以存储与所述图元相关联的指令和当前状态信息;定义与所述图元相关联的状态变量;将状态变量分类成多个子分组;将所述多个存储器区域中的每一个存储器区域与多个跟踪位相关联,其中每个跟踪位都与一个子分组以及所述多个存储器区域之一相关联;响应于自先前将所述图元指令输出到所述存储器区域之后的状态变量的改变,设置所述跟踪位;以及响应于设置所述跟踪位,将与所述子分组相关联的当前状态信息输出到所述多个存储器区域之一中。
2.如权利要求1所述的方法,还包括在已将所述当前状态信息输出到所述多个存储器区域之一后,清除所述跟踪位。
3.如权利要求1所述的方法,其中将状态变量分类成多个子分组还包括对与基本状态功能相关联的状态变量进行分类。
4.如权利要求1所述的方法,其中将状态变量分类成多个子分组还包括对与纹理图功能相关联的状态变量进行分类。
5.如权利要求1所述的方法,其中将状态变量分类成多个子分组还包括对与纹理混合功能相关联的状态变量进行分类。
6.如权利要求1所述的方法,其中将状态变量分类成多个子分组还包括对与慢状态功能相关联的状态变量进行分类。
7.如权利要求1所述的方法,其中,“响应于自先前将所述图元指令输出到所述存储器区域之后的状态变量的改变,设置所述跟踪位”还包括确定是否已发生状态改变;确定哪个子分组与所述状态改变相关联;确定所述状态变量的新值和先前值;以及如果所述新值和先前值不同,则设置对应的子分组跟踪位。
8.如权利要求1所述的方法,还包括定义多个附加存储器区域,以存储状态信息;定义对所述多个附加存储器区域的引用;以及将所选择的状态组信息存储到所述多个附加存储器区域。
9.如权利要求8所述的方法,其中,“响应于设置所述跟踪位,将与所述子分组相关联的当前状态信息输出到所述多个存储器区域之一中”还包括当设置所述跟踪位时,将与所述子分组相关联的引用输出到所述多个存储器区域之一中;以及基于所述引用,在渲染期间获取存储在所述多个附加存储器区域之一中的被引用的信息。
10.如权利要求9所述的方法,其中,“将所选择的状态组信息存储到所述多个附加存储器区域中”还包括将与慢状态功能相关联的状态变量存储到所述多个附加存储器区域中。
11.如权利要求10所述的方法,其中,“定义对所述多个附加存储器区域的引用”还包括定义指向其中存储了慢状态信息的所述附加存储器区域的指针。
12.一种用于渲染包含图元的场景的装置,包括多个入库存储器区域,其与图元所相交的区域相关联;跟踪存储器区域,用于存储下述状态变量的指示符,所述状态变量自先前将图元指令输出到所述存储器区域之后已经受到影响;入库引擎,用于响应于所述跟踪指示符,将状态变量的当前状态信息入库;以及渲染引擎,用于渲染存储在所述存储器区域中的当前信息。
13.如权利要求12所述的装置,其中所述当前信息包括自先前将图元指令输出到所述存储器区域之后已经改变的状态变量。
14.如权利要求12所述的装置,其中所述当前信息包括引用。
15.如权利要求13所述的装置,其中所述状态变量与至少一个状态组相关联。
16.如权利要求15所述的装置,其中所述至少一个状态组包括基本状态功能。
17.如权利要求15所述的装置,其中所述至少一个状态组包括纹理图功能。
18.如权利要求15所述的装置,其中所述至少一个状态组包括纹理混合功能。
19.如权利要求15所述的装置,其中所述至少一个状态组包括慢状态功能。
20.如权利要求12所述的装置,其中所述跟踪信息包括多个跟踪位,其中每个跟踪位都与一个入库存储器区域和一个子分组相关联。
21.如权利要求12所述的装置,其中,用于存储自先前将图元指令输出到所述存储器区域之后已受到影响的状态变量的指示符的跟踪存储器区域还包括用于存储自先前将图元指令输出到所述存储器区域之后已改变的状态变量的指示符的跟踪存储器区域。
22.如权利要求12所述的装置,其中用于存储自先前将图元指令输出到所述存储器区域之后已受到影响的状态变量的指示符的跟踪存储器区域还包括用于存储自先前将图元指令输出到所述存储器区域之后已使用的状态变量的指示符的跟踪存储器区域。
23.如权利要求14所述的装置,还包括多个附加存储器区域。
24.如权利要求23所述的装置,其中所述多个附加存储器区域存储慢状态变量。
25.如权利要求24所述的装置,其中所述引用包括指向所述附加存储器区域内的指针。
26.如权利要求25所述的装置,其中所述入库引擎响应于所述跟踪指示符,将所述引用入库到所述多个入库存储器区域之一中。
27.如权利要求26所述的装置,其中所述渲染引擎利用所述引用来从所述多个附加存储器区域中的至少一个区域中获取慢状态信息。
28.一种机器可读介质,其中存储有多个可被处理器执行的机器可读指令,以管理用于渲染图元的状态,所述机器可读指令包括定义多个存储器区域,以存储与所述图元相关联的指令和当前状态信息的指令;定义与所述图元相关联的状态变量的指令;将状态变量分类成多个子分组的指令;将所述多个存储器区域中的每一个存储器区域与多个跟踪位相关联的指令,其中每个跟踪位都与一个子分组以及所述多个存储器区域之一相关联;响应于自先前将所述图元指令输出到所述存储器区域之后的状态变量的改变,设置所述跟踪位的指令;以及响应于设置所述跟踪位,将与所述子分组相关联的当前状态信息输出到所述多个存储器区域之一中的指令。
29.如权利要求28所述的机器可读介质,还包括在已将所述当前状态信息输出到所述多个存储器区域之一后,清除所述跟踪位的指令。
30.如权利要求28所述的机器可读介质,其中,将状态变量分类成多个子分组的指令还包括对与基本状态功能相关联的状态变量进行分类的指令。
31.如权利要求28所述的机器可读介质,其中,将状态变量分类成多个子分组的指令还包括对与纹理图功能相关联的状态变量进行分类的指令。
32.如权利要求28所述的机器可读介质,其中,将状态变量分类成多个子分组的指令还包括对与纹理混合功能相关联的状态变量进行分类的指令。
33.如权利要求28所述的机器可读介质,其中,将状态变量分类成多个子分组的指令还包括对与慢状态功能相关联的状态变量进行分类的指令。
34.如权利要求28所述的机器可读介质,其中,响应于自先前将所述图元指令输出到所述存储器区域之后的状态变量的改变,设置所述跟踪位的指令还包括确定是否已发生状态改变的指令;确定哪个子分组与所述状态改变相关联的指令;确定所述状态变量的新值和先前值的指令;以及如果所述新值和先前值不同,则设置对应的子分组跟踪位的指令。
35.如权利要求28所述的机器可读介质,还包括定义多个附加存储器区域,以存储状态信息的指令;定义对所述多个附加存储器区域的引用的指令;以及将所选择的状态组信息存储到所述多个附加存储器区域的指令。
36.如权利要求35所述的机器可读介质,其中,响应于设置所述跟踪位,将与所述子分组相关联的当前状态信息输出到所述多个存储器区域之一中的指令还包括当设置所述跟踪位时,将与所述子分组相关联的引用输出到所述多个存储器区域之一中的指令;以及基于所述引用,在渲染期间获取存储在所述多个附加存储器区域之一中的被引用的信息的指令。
37.如权利要求36所述的机器可读介质,其中,将所选择的状态组信息存储到所述多个附加存储器区域中的指令还包括将与慢状态功能相关联的状态变量存储到所述多个附加存储器区域中的指令。
38.如权利要求37所述的机器可读介质,其中,定义对所述多个附加存储器区域的引用的指令还包括定义指向其中存储了慢状态信息的所述附加存储器区域的指针的指令。
全文摘要
本发明提供了一种机制,用于利用硬件状态入库逻辑,并与用以生成图形化图像的基于平铺层的区带渲染方法结合使用,从而跟踪并管理图形状态。硬件中只维护动态状态变量的当前值。动态状态变量包括但不局限于被认为可能在图元之间改变的状态变量。将动态状态变量的集合划分成子分组。每个状态分组都和逐库跟踪位阵列相关联。只要遇到状态改变,就为所有的库设置对应于相关联的状态组的跟踪位。在将图元置于库中之前,检查与该库相关联的跟踪位,并将对应于所设置的跟踪位的当前状态插入到该库中所述图元之前。然后清除用于该库的跟踪位。
文档编号G06T15/00GK1610926SQ02826465
公开日2005年4月27日 申请日期2002年12月12日 优先权日2001年12月31日
发明者彼得·多伊尔 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1