一种基于显示缓冲区合成的渲染差异检测方法与流程

文档序号:32393344发布日期:2022-11-30 09:13阅读:28来源:国知局

1.本发明属于计算机图像处理技术领域,具体涉及一种基于显示缓冲区合成的渲染差异检测方法。


背景技术:

2.目前主要的图形渲染方式之一是采用专门的图形处理器(graphic processing unit,gpu)渲染三维图形的方式。gpu又称显示核心、视觉处理器、显示芯片,gpu是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器,采用gpu使显卡减少了对cpu的依赖,并进行部分原本cpu的工作,尤其是在3d图形处理时gpu所采用的核心技术有硬件t&l(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件t&l技术可以说是gpu的标志。gpu的生产商主要有nvidia、ati和amd。
3.gpu一般是通过标准api接口,如opengl、opengl es、vulkan、direct x等,提供图形渲染能力,这些接口通常被称为图形接口,图形应用通过调用这些图形接口最终实现图形绘制。每种图形接口都存在多个不同的版本,如opengl的最新版本是4.6,opengl es的最新版本是3.2。
4.现有的针对gpu的功能测试往往是验证其对某类图形接口的某个版本的支持性,主要的功能测试方式是采用cts(conformance test suite)测试集进行测试,这类测试是通过调用该接口该版本的所有api再根据返回值的正确性来进行验证gpu功能的完备性。然而,上述测试方式仅能够验证gpu是否实现了图形接口,但无法验证图形接口实现的正确性。


技术实现要素:

5.有鉴于此,本发明提供了一种基于显示缓冲区合成的渲染差异检测方法,能够实现对gpu图形接口实现的正确性验证。
6.本发明提供的一种基于显示缓冲区合成的渲染差异检测方法,包括以下步骤:步骤1、在同一计算平台上同时安装参考gpu和被测gpu,并为参考gpu和被测gpu各连接一台品牌和型号均相同的显示器,参考gpu选用验证为功能正确的gpu;步骤2、确定gpu测试程序,采用参考gpu运行gpu测试程序设定测试窗口的尺寸并使窗口的宽度满足simd指令操作数的字节数对齐,记录测试窗口的尺寸windowsize及系统帧率记为参考帧率;以windowsize作为窗口尺寸,采用被测gpu运行gpu测试程序得到系统帧率记为被测帧率;以参考帧率和被测帧率中的较小者作为测试帧率;步骤3、修改计算平台的操作系统配置文件及显示器驱动程序配置,使参考gpu及被测gpu均以测试帧率运行gpu测试程序;步骤4、在计算平台上,以windowsize作为测试窗口尺寸使用参考gpu及被测gpu同时分别运行gpu测试程序,使测试窗口同时分别显示在两个显示器上,同步调整测试窗口的
位置使测试窗口的左上角横坐标满足simd指令操作数的字节数对齐;步骤5、在两个gpu测试程序进程运行过程中,对参考gpu所对应的缓冲区framebuffer-r及被测gpu所对应的缓冲区framebuffer-t中与gpu测试程序相关的数据进行逐位并以simd指令操作数的字节数为单位的异或运算,将异或运算的结果保存到framebuffer-t中,当被测gpu所连接的显示器上gpu测试程序所对应的窗口内显示纯黑色时判定被测gpu正确处理当前像素,否则判定被测gpu错误处理当前像素。
7.进一步地,所述步骤1中所述参考gpu选用nvidia或amd生产的gpu。
8.进一步地,所述步骤1中所述在同一计算平台上同时安装参考gpu和被测gpu的方式为:将参考gpu和被测gpu的图形驱动程序分别安装在不同目录下。
9.进一步地,所述步骤2中所述采用被测gpu运行gpu测试程序得到系统帧率记为被测帧率的方式为:在gpu测试程序启动加载程序时hook 图形接口上屏相关api,将系统刷新次数的初始值设置为零,在gpu测试程序执行过程中记录图形接口上下文的创建时间和销毁时间,并在所有上屏相关api被调用时均令系统刷新次数自加1,当gpu测试程序执行完毕后采用系统刷新次数与创建时间和销毁时间的差值的比值作为系统帧率。
10.进一步地,所述图形接口上屏相关api为opengl的glflush、glfinish和glswapbuffer。
11.进一步地,所述步骤3中所述修改计算平台的操作系统配置文件及显示器驱动程序配置,使参考gpu及被测gpu均以测试帧率运行gpu测试程序的方式为:修改操作系统的配置文件中显示器刷新率的垂直刷新率和水平刷新率,修改显示器驱动程序的垂直刷新率和水平刷新率属性。
12.进一步地,所述步骤5中所述当被测gpu所连接的显示器上gpu测试程序所对应的窗口内显示纯黑色时判定被测gpu正确处理当前像素,否则判定被测gpu错误处理当前像素的同时,记录出现的错误像素及其所在的帧数。
13.有益效果:本发明通过选取验证正确的参考gup,在同一计算平台上同时采用参考gup和被测gup以相同帧率运行gup测试程序,再对参考gup和被测gup相关缓冲区内gup测试程序相关数据进行异或运算,采用运算结果渲染生成被测gup所对应的像素,根据像素的显示情况即可判断被测gup图形接口实现的正确性,由此实现了图形标准无关、gpu性能无关的渲染差异比对方法,能够以可视化的方式有效验证gpu渲染的正确性。
具体实施方式
14.下面列举实施例,对本发明进行详细描述。
15.通常情况下,nvidia、amd等厂商生产的gpu对图形接口的支持性以及实现的正确性是经过验证的。因此,通过与这些厂商生产的gpu进行图形渲染对比测试,并分析图形渲染结果就能够判断某款gpu对图形接口实现的正确性,即通过图形渲染对比测试采用不同gpu运行复杂图形应用,如果采用不同gpu渲染出的每一帧图像都相同则可判定该gpu正确实现了图形接口。
16.基于上述分析,本发明提供了一种基于显示缓冲区合成的渲染差异检测方法,具体包括以下步骤:
步骤1、在同一计算平台上同时安装参考gpu和被测gpu,并为参考gpu和被测gpu各连接一台品牌和型号均相同的显示器。其中,参考gpu选用验证为功能正确的gpu,记为gpu-r;被测gpu记为gpu-t。
17.在同一计算平台上同时安装参考gpu和被测gpu时,将参考gpu和被测gpu的图形驱动程序分别安装在不同目录下,例如,将参考gpu的图形驱动程序安装在gpudriverdir-r目录下,将被测gpu的图形驱动程序安装在gpudriverdir-t目录下。
18.步骤2、确定gpu测试程序,采用参考gpu运行gpu测试程序设定测试窗口的尺寸并使窗口的宽度为simd指令操作数的字节数对齐,记录测试窗口的尺寸windowsize及系统帧率记为参考帧率framerate-r;以windowsize作为窗口尺寸,采用被测gpu运行gpu测试程序得到系统帧率记为被测帧率framerate-t;以framerate-r和framerate-t中的较小者作为测试帧率framerate。
19.对于标准的benchmark测试程序,往往在其执行完毕后会获取系统帧率,但是对于用户自己撰写的复杂图形应用或非标准测试程序,则需要执行以下操作获取系统帧率:在gpu测试程序启动加载程序时hook 图形接口上屏相关api,将系统刷新次数的初始值设置为零,在gpu测试程序执行过程中记录(opengl)图形接口上下文的创建时间和销毁时间,并在所有上屏相关api被调用时均令系统刷新次数自加1,当gpu测试程序执行完毕后采用系统刷新次数与创建时间和销毁时间的差值的比值作为系统帧率输出。例如,图形接口上屏相关api可为opengl的glflush、glfinish和glswapbuffer,或其他图形处理接口等。
20.步骤3、修改操作系统配置文件及显示器驱动程序配置,使参考gpu及被测gpu均以测试帧率framerate运行gpu测试程序。
21.具体来说,修改操作系统配置文件及显示器驱动配置的方式为:修改操作系统的配置文件中显示器刷新率的垂直刷新率和水平刷新率,修改显示器驱动程序的垂直刷新率和水平刷新率属性。通过上述修改使gpu测试程序和gpu驱动都认为当前显示器的系统帧率为测试帧率framerate。
22.步骤4、在计算平台上,以windowsize作为测试窗口尺寸使用参考gpu及被测gpu同时分别运行gpu测试程序,使测试窗口同时分别显示在两个显示器上,同步调整测试窗口的位置使测试窗口的左上角横坐标满足simd指令操作数的字节数对齐。
23.其中,使用参考gpu及被测gpu同时分别运行gpu测试程序的方式为:启动运行gpu测试程序时分别将图形库加载目录指向gpudriverdir-r和gpudriverdir-t。simd指令操作数的字节数一般为128或256字节等。
24.步骤5、在两个gpu测试程序进程运行过程中,对参考gpu所对应的缓冲区framebuffer-r及被测gpu所对应的缓冲区framebuffer-t中与gpu测试程序相关的数据进行逐位并以simd指令操作数的字节数为单位的异或运算,将异或运算的结果保存到framebuffer-t中,即渲染到被测gpu所连接的显示器上显示,当被测gpu所连接的显示器上gpu测试程序所对应的窗口内显示纯黑色时说明被测gpu对当前像素的处理正确,否则说明被测gpu对当前像素的处理错误。
25.具体来说,对参考gpu所对应的缓冲区framebuffer-r及被测gpu所对应的缓冲区framebuffer-t中的数据进行逐位的异或运算的过程中,若两个缓冲区内的数据相同则异或结果为0,对应的像素点显示为黑色;若两个缓冲区内的数据不同则异或结果为1,则对应
的像素点显示为非黑色。
26.此外,还可通过记录测试过程中出现的错误像素及其所在的帧数,实现检测后的还原分析及验证。
27.实施例:本实例采用本发明提供的一种基于显示缓冲区合成的渲染差异检测方法实现了linux平台上gpu图形接口实现正确性的验证,具体包括以下步骤:s1、构建测试环境。
28.在同一台计算机上,同时安装gpu-r和gpu-t,为gpu-r和gpu-t分别连接两台品牌、型号完全相同的显示器,安装gpu-r和gpu-t的图形驱动程序,并将两个图形驱动程序的opengl、opengl es等图形接口库配置到不同的目录,具体来说,将gpu-r的图形驱动程序的目录记为gpudriverdir-r,将gpu-t的图形驱动程序的目录记为gpudriverdir-t。其中,gpu-r选用nvidia、amd等大厂的gpu。
29.s2、确定gpu测试程序记为gpubenchapp,获取gpubenchapp在gpu-r和gpu-t下运行时的系统帧率,选择其中较小的系统帧率作为测试帧率framerate。
30.获取gpubenchapp在gpu-r和gpu-t下运行时的系统帧率的过程,包括以下步骤:s2.1、将图形库加载目录指向gpudriverdir-r,运行gpubenchapp;gpubenchapp生成的窗口为测试窗口,设置测试窗口的宽度为128字节对齐,记录测试窗口的大小记为windowsize,windowssize需小于显示器屏幕的大小;获取gpubenchapp在gpu-r下的系统帧率,记为framerate-r。
31.s2.2、将图形库加载目录指向gpudriverdir-t,运行gpubenchapp,获取gpubenchapp在gpu-t下的系统帧率,记为framerate-t。
32.上述获取系统帧率的过程中,如果gpubenchapp执行完毕后输出了测试帧率,则记该测试帧率为系统帧率;否则,重启gpubenchapp,并在加载程序时hook glflush、glfinish和glswapbuffer,并将系统刷新次数的初始值置为0,在gpu测试程序执行过程中记录opengl图形接口上下文的创建时间和销毁时间,在gpubenchapp的执行过程中每当glflush、glfinish及glswapbuffer被调用时令系统刷新次数自加1,当gpu测试程序执行完毕后采用系统刷新次数与创建时间和销毁时间的差值的比值作为系统帧率输出。
33.s3、伪造系统帧率强制gpubenchapp在gpu-r和gpu-t下运行时,都运行在测试帧率framerate下,也就是说通过修改系统配置使gpubenchapp和gpu驱动都认为当前显示器的帧率为测试帧率。修改方式如下:s3.1、修改操作系统配置文件中的显示器刷新率的相关配置,即垂直刷新率和水平刷新率,也就是修改linux系统的/etc/x11/xorg.conf文件中的vertrefresh和horizsync的属性,将两个属性值均设置为framerate。这一修改主要影响用户态程序。
34.s3.2、修改操作系统的显示器驱动中的垂直刷新率和水平刷新率属性,也就是修改linux的lcd显示器驱动,将vsync和hsync均修改为framerate。这一修改将对动态获取显示器刷新率的所有应用产生影响,包含用户态应用和内核态驱动。
35.s4、以windowsize作为测试窗口大小分别同时运行gpubenchapp的两个实例,并将运行结果分别显示在两个不同的显示器上,同步调整测试窗口的位置使测试窗口的左上角横坐标满足128字节对齐。在gpubenchapp启动时将图形库加载目录分别指向
gpudriverdir-r和gpudriverdir-t,以确保gpubenchapp的两个实例分别使用gpu-r和gpu-t。
36.s5、修改显示器驱动,实现gpubenchapp的两个实例在刷新显示器时的差异,若存在差异则说明被测gpu对当前帧的处理错误,否则说明被测gpu对当前帧的处理正确。具体过程如下:记gpu-r和gpu-t所连显示器的显示器驱动程序对象中的framebuffer分别为framebuffer-r和framebuffer-t。记gpubenchapp所在窗口的左上角坐标分别为(xr,yr)和(x
t
,y
t
),windowssize表示为(windowwidth,windowheight),显示器分辨率表示为(screenwidth,screenheight)。
37.当gpu-r所连显示器的显示器驱动程序准备刷新framebuffer-r时,即显示一帧内容时,将逐字节对framebuffer-r和framebuffer-t中与gpubenchapp相关的部分数据进行异或运算,并将异或运算的结果保存在framebuffer-t中gpubenchapp所占区域内,也就是在gpu-t所连显示器上gpubenchapp的窗口内显示的是二者每一帧的差异。例如,将a和b进行异或运算,若a与b两个值不同则异或结果为1,若a与b两个值相同则异或结果为0。可采用x86的simd指令实现的快速异或运算。
38.同时,可在gpu-r所连显示器上显示正常渲染内容,通过两者之间的直观的、可视化的对比即可快速检测出被测gpu功能的正确性。
39.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1