Chromium Gpu SoftWareRenderList
Chrome可以通过访问 chrome://gpu,查看当前浏览器 Gpu特性。信息大体如下
Graphics Feature Status
Canvas: Hardware accelerated
Flash: Hardware accelerated
Flash Stage3D: Hardware accelerated
Flash Stage3D Baseline profile: Hardware accelerated
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
Native GpuMemoryBuffers: Software only. Hardware acceleration disabled
Out-of-process Rasterization: Disabled
Hardware Protected Video Decode: Unavailable
Rasterization: Hardware accelerated
Skia Deferred Display List: Disabled
Skia Renderer: Disabled
Surface Synchronization: Enabled
Video Decode: Hardware accelerated
Viz Service Display Compositor: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
.. .
可以看出,某些Gpu特性是关闭(Disable)的。 那么Chrome,是如何判断关闭哪些GPU特性?
Chrome使用Chromium内核,Chromium内核的GPU模块中,定义了一张SoftWareRender表。Chromium通过该表,判断是否将某些GPU特性加入到黑名单(Disable)中。
SoftWareRenderList
代码路径:chromium/src/gpu/config/software_rendering_list.json。该文件中,使用Json,定义了一系列需要加入到黑名单中的GPU特性。 下面为部分代码:id53,对于Intel GMA500,关闭flash_stage3d GPU Feature。
{
"id" : 53 ,
"description" : "The Intel GMA500 is too slow for Stage3D" ,
"cr_bugs" : [ 152096 ] ,
"vendor_id" : "0x8086" ,
"device_id" : [ "0x8108" , "0x8109" ] ,
"features" : [
"flash_stage3d"
]
} ,
原理:这里简单说一下,这个json文件,Chromium是如何使用的。
Chromium编译时,根据software_rendering_list.json,编译生成相关的文件(software_rendering_list_autogen.cc)。 software_rendering_list_autogen.cc中定义了一个名为“kSoftwareRenderingListEntries”的数组类型。该数组类型中,加入了json文件中定义的规则。 Chromium Gpu模块的GpuBlacklist(gpu_blacklist.cc),在初始化时,使用kSoftwareRenderingListEntries这个数组。 Chromium中使用GpuBlacklist,进行GPU特性的判断。