一个单帧(single frame)由一系列相关的渲染命令组成,每条命令会发送到一系列相应的待渲染表面。当今很多应用都采用多像素目标(multiple pixel targets),而且为了获得更加的渲染效果,可能会在单帧内频繁改变目标,比如说reflections(反射)和shadow maps(阴影图)。
为了在单帧内处理不同的渲染目标能够达到更加的效果,Larrabee的软件渲染器首先会创造出一个曲线图,这种曲线图的每个节点相当于一个RTset。之后,曲线图的每个节点再分派给PrimSets,PrimSets将会修饰渲染目标的节点。当一个RTset使用一个之后会被渲染成不同目标的渲染目标(比如一个纹理单元)时,一个dependency(属性)便会在两个RTsets之间建立。比如说,在shadow maps(阴影图)中,场景中的主要RTset都会有一个属性,为阴影图所用。
属性曲线图生成之后,其节点将会被无序渲染,以便满足属性的要求。比如一个两帧内的属性曲线图,这一场景需要渲染两个shadow maps(阴影图)。简单说,第一帧的阴影图还没有显示出来;该场景的第二帧还不能被渲染,除非第二帧的阴影图被渲染之后第二帧的场景才能显现出来。由于以下实例中的每一帧采用相同的存储单元back buffer以及depth buffer,第二帧也不能被渲染出来,除非第一帧的场景被渲染出来或者被复制到front buffer。尽管如此,第二帧的阴影图渲染可以与Frame 1的重叠,因为两者间没有属性。如果第二帧采用另一种buffer的话,将会去除虚线属性,这种渲染可以自动执行。
上图为RTset属性图表:PrimSet被分配到一个RTset节点,这个节点基于可以修饰的表面(渲染目标)。属性确保一个表面只有在可以修饰的PrimSet被渲染之后才能使用。
需要指出的是,与RTset联系在一起的PrimSet可以在任何必要时分成多个子集,只要顺序不变就行。如果一个RTset因为太大而不能作为一个单元有效执行的话就可以分为若干个子集,比如说,当需要提供一个比较精准的粒度调度时。并不是所有的Larrabee核心都需要在同一个RTset单元中同时执行PrimSet。RTset的这种任意分裂功能避免了某些tiling架构的局限性。