发明内容
本发明解决的是多视图渲染技术的过程中,图形处理器的数据传输效率较低、功耗较大的技术问题。
为解决上述技术问题,本发明提供一种图形处理器,包括:几何着色建器、调度执行核心及顶点数据缓冲区,其中:所述几何着色器,用于在各视图中至少两个视图的图元数目不同时,构造几何着色器线程并发送给调度执行核心;所述调度执行核心,用于接收所述几何着色器线程,以顶点为单位向所述顶点数据缓冲区依次输出每一个视图对应的属性数据及顶点结束指示、视图结束指示;所述顶点数据缓冲区,用于基于所述顶点结束指示与所述视图结束指示,确定每一个视图的视图标识,以及每一个视图中各顶点的顶点标识;将所述每一个视图的视图标识、每一个视图中各顶点的顶点标识发送至所述几何着色器。
可选的,所述几何着色器,用于在接收到所述每一个视图的视图标识、每一个视图中各顶点的顶点标识之后,计算每一个线程组所需的点数空间。
可选的,所述每一个线程组中,各视图对应的点数空间相等。
可选的,所述图形处理器还包括:图元生成器以及多核心工作收集器;所述几何着色器,还用于将所述每一个视图的视图标识、每一个视图中各顶点的顶点标识输出至所述图元生成器;所述图元生成器,用于根据所述每一个视图的视图标识、每一个视图中各顶点的顶点标识,生成每一个视图对应的图元,并依次输出每一个视图的图元顶点标识至所述多核心工作收集器;所述多核心工作收集器,用于基于所述每一个视图的图元顶点标识,依次从所述顶点数据缓冲区中读取关联的图元属性数据。
可选的,所述多核心工作收集器的工作模式配置为单视图模式。
本发明还提供了另一种图形处理器,包括:外壳着色器线程、调度执行核心、顶点数据缓冲区、曲面细分器,其中:所述外壳着色器线程,用于生成外壳着色线程,并将所述外壳着色线程输出至所述调度执行核心;所述调度执行核心,用于以视图为单位将每一个视图中的面片的曲面细分因子输出至所述顶点数据缓冲区;所述曲面细分器,用于根据所述视图的个数,以视图为单位从所述顶点数据缓冲区中依次读取每一个视图中的面片的曲面细分因子,并对相应面片进行曲面细分。
可选的,所述图形处理器还包括域着色器;所述曲面细分器,还用于将每一个视图的视图标识输出至所述域着色器;所述域着色器,用于根据所述每一个视图的视图标识,对相应面片的顶点进行编程。
可选的,所述图形处理器还包括:输入加载模块;所述域着色器,用于将所述每一个视图的视图标识发送至输入加载模块;基于输入加载指令,从所述输入加载模块中读取所述输入加载指令指示的视图标识,对所述输入加载指令指示的面片的顶点进行编程。
可选的,所述域着色器的工作模式配置为单视图模式。
本发明还提供了一种图形处理设备,包括上述提供的任一种图形处理器。
与现有技术相比,本发明的技术方案具有以下有益效果:
几何着色器在检测到至少两个视图的图元数目不同时,构造几何着色程序并发送给调度执行核心;调度执行核心接收到几何着色程序,以顶点为单位向顶点数据缓冲区依次输出每一个视图对应的属性数据及顶点结束指示、视图结束指示;顶点数据缓冲区将每一个视图的视图标识、每一个视图中各顶点的顶点标识发送至几何着色器。由此,在几何着色器完成对多视图的展开。由于将多视图的展开后移至硬件侧的几何着色器,能够有效降低图形处理器的工作负载,提高图形处理器的数据传输效率,降低图形处理器的功耗。
具体实施方式
在一些复杂的应用场景,如顶点着色器(Vertex Shader,VS)+几何着色器(Geometry Shader,GS)+像素着色器(Pixel Shader,PS),视图标识(ID)的依赖编程出现在几何着色器。又如,顶点着色器(Vertex Shader,VS)+外壳着色器线程(Hull Shader,HS)+域着色器(Domain Shader,DS)+像素着色器(Pixel Shader,PS),视图标识(ID)的依赖编程出现在外壳着色器线程。
由于几何着色器具有图元(primitive)数目缩放功能,外壳着色器线程的曲面细分因子(tessellation factors)若被视图ID差异化编程,都会导致不同的视图对应的图元数目可能不同的情况。
在现有技术中,通常在软件侧对多视图进行展开,硬件侧会接收到多个绘制命令(draw call),导致图形处理器的工作负载大大增加,图形处理器的数据传输效率较低、功耗较大
在本发明实施例中,在几何着色器完成对多视图的展开。由于将多视图的展开后移至硬件侧的几何着色器,能够有效降低图形处理器的工作负载,提高图形处理器的数据传输效率,降低图形处理器的功耗。
为使本发明的上述目的、特征和有益效果能够更为明显易懂,下面结合附图对本发明的具体实施例做详细的说明。
参照图1,本发明实施例提供了一种图形处理器,包括几何着色器11、调度执行核心12以及顶点数据缓冲区13。以下对本发明实施例中提供的图形处理器进行具体说明。
在具体实施中,待展开的视图的个数可以为多个。各视图中,至少两个视图对应的图元数目不同。例如,待展开的视图包括视图1与视图2,视图1对应的图元数目为10个,视图2对应的图元数目为20个。
在此场景下,几何着色器11的线程构造器(Geometry Shader constructor)可以构造几何着色器11线程,并将几何着色器线程输出至调度执行核心12。调度执行核心12接收到几何着色器11线程,按照每一视图每一顶点(per view per vertex)的方式,向顶点数据缓冲区13输出属性数据(attributes);在完成一个顶点对应的属性数据的输出以及一个视图的所有属性数据输出之后,调度执行核心12还可以输出顶点结束指示(vertex end)以及视图结束指示(view end)。
上述的每一视图每一顶点的方式,可以如下示例表征:view0.vertex0,view0.vertex1,view0.vertex2,……,view0.vertexN,view1.vertex0,view1.vertex1,……,view1.vertexM,view2. vertex0,view2.vertex1,……。在本示例中,N与M不等,view0对应的图元数目与view1对应的图元数目不等。
顶点数据缓冲区13接收到所有视图对应的属性数据、每一个视图对应的顶点结束指示、每一个视图对应的视图结束指示,产生每一个视图对应的视图标识信息(view id),以及每一个视图中各个顶点的标识信息(vertex id)。顶点数据缓冲区13将每一个视图对应的视图标识信息、每一个视图中各个顶点的标识信息输出至几何着色器11的线程构造器。
继续参照上述示例,顶点数据缓冲区13接收到第一个视图的第一个顶点对应的属性数据以及顶点结束指示,确定第一个视图的第一个顶点的标识为view0.vertex0;顶点数据缓冲区13接收到第一个视图的第二个顶点对应的属性数据以及顶点结束指示,确定第一个视图的第二个顶点的标识为view0.vertex1,以此类推,接收到第一个视图的第N个顶点对应的属性数据、顶点结束指示以及视图结束指示,确定第一个视图的第N个顶点的标识为view0.vertexN。接收到第二个视图的第一个顶点的对应的属性数据以及顶点结束指示,由于根据视图结束标识确定完成接收第一个视图的所有顶点的属性数据,故确定第二个视图的第一个顶点的标识为view1.vertex0,以此类推。
几何着色器11的线程构造器接收到每一个视图对应的视图标识信息,以及每一个视图中各个顶点的标识信息。由此可见,多视图已经在几何着色器11侧展开。
在具体实施中,图形处理器还可以包括图元生成器14,图元生成器14可以从几何着色器11中获取所有视图对应的有效顶点信息。
具体地,几何着色器11可以根据每一视图每一图元(per view per prim)的顺序,向图元生成器14输出每一视图中每一顶点的标识信息(per view vertex id)。图元生成器14获取到每一视图中每一顶点的标识信息,生成每一视图中每一图元的顶点信息(perview prim vertex id),并将其输出至多核心工作收集器15。
多核心工作收集器15配置视图个数(view_num)为1,这是因为多视图已经在几何着色器11展开,故其接收到的顶点标识信息是以每一视图每一图元(per view per prim)为单位的,故其对应的场景实质上与单视图(single view)相同。换言之,多核心工作收集器15相当于工作在单视图模式。
多核心工作收集器15可以根据每一个图元的标识,向顶点数据缓冲区13发送图元对应的属性数据请求(prim data req)。顶点数据缓冲区13接收到属性数据请求,向多核心工作收集器15下发与该属性数据请求对应的图元属性数据(primitives attributes)。
在具体实施中,几何着色器11的线程构造器可以基于配置的视图的个数,计算一个线程组(warp)所需的点数空间大小。
在本发明实施例中,根据驱动器(driver)配置的几何着色器11输出顶点个数(gs_out_vnum)信息预留单个视图空间,每个视图空间的占用空间保持一致。
具体地,几何着色器11可以仅声明1个输出顶点个数,不同的视图可以按需缩减输出量。
综上可见,在几何着色器完成对多视图的展开。由于将多视图的展开后移至硬件侧的几何着色器,能够有效降低图形处理器的工作负载,提高图形处理器的数据传输效率,降低图形处理器的功耗。
参照图2,本发明实施例还提供了另一种图形处理器,包括:外壳着色器21、调度执行核心22、顶点数据缓冲区23、曲面细分器24。
在本发明实施例中,对于外壳着色器21中使用视图标识(view id)对曲面细分因子(tessellation factors)进行编程的场景,不同视图输出的图元数目可以不同。
在具体实施中,随着编译器(compiler)指令层面上的视图循环(view loop),外壳着色器21的线程构造器可以构建外壳着色器线程,并将外壳着色器线程发送至调度执行核心22。
调度执行核心22接收到外壳着色器线程,以视图为单位,逐视图(per view)地将各面片(patch,组成图元的点的集合)的曲面细分因子输出至顶点数据缓冲区23。
在曲面细分器24(tessellator)侧,基于配置的视图的个数,逐视图地从顶点数据缓冲区23读取各patch的曲面细分因子,进行曲面细分。
具体地,曲面细分器24可以向顶点数据缓冲区23发送每一视图每一面片的曲面细分因子请求(per view per patch tessellation factors req),该请求用于读取每一视图对应的每一面片的曲面细分因子。
顶点数据缓冲区23接收到上述请求,向曲面细分器24发送每一视图每一面片的曲面细分因子(per view per patch tessellation factors)。
由此,在曲面细分器24,将多个视图展开。由于曲面细分器24可以每一视图每一图元的形式输出顶点信息,故相应地,域着色器25(domain shader)工作在单视图(singleview)模式。
在域着色器25中使用视图标识(view id)进行编程时,曲面细分器24还可以视图为单位向域着色器25的线程构造器发送每一个视图的标识信息(per view id)。
域着色器25接收到每一个视图的标识信息,并将其存放至输入加载模块(inputloading buffer)。域着色器25可以根据输入加载指令(input loading指令),从输入加载模块中读取输入加载指令指示的视图标识,对输入加载指令指示的面片的顶点属性进行编程。
在具体实施中,可以在输入加载指令中增加对视图标识加载的支持,输入加载模块可以将视图标识加载到域着色器25对应的面片顶点属性进行编程。
在后续阶段中,由于已经将多视图展开,故其他硬件的执行方式可以参照单视图(single view)模式的方式进行相应的处理。如,对于图元生成器、多核心工作收集器等的处理方式,可以单视图模式进行相应处理。
综上,由曲面细分器对多视图进行展开,由于将多视图的展开后移至硬件侧的曲面细分器,能够有效降低图形处理器的工作负载,提高图形处理器的数据传输效率,降低图形处理器的功耗。
本发明还提供了一种图形处理设备,包括上述任一实施例中提供的图形处理器。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指示相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。