Chromium GPU Workarounds

Published: by Creative Commons Licence

  • Categories:

GPU Workarounds

//gpu 模块为了兼容不同的GPU,维护了一长串 GPU 兼容(Workarounds)列表,这个列表记录在json文件中,例如:

// file path: gpu/config/gpu_driver_bug_list.json
{
  "name": "gpu driver bug list",
  "entries": [
    ...
   {
      "id": 109,
      "cr_bugs": [449150, 514510],
      "description": "MakeCurrent is slow on Linux with NVIDIA drivers",
      "vendor_id": "0x10de",
      "os": {
        "type": "linux"
      },
      "gl_vendor": "NVIDIA.*",
      "features": [
        "use_virtualized_gl_contexts"
      ]
    },
    ...
  ]
}

该json文件的详细格式定义见 gpu/config/gpu_control_list_format.txt

上面的 json 描述的意思是如果当前系统是linux,gl厂商是 NVIDIA,厂商id是 0x10de 时,需要启用 use_virtualized_gl_contexts 功能(使用虚拟Context)。

该json文件会在编译时被 gpu/config/process_json.py 转换成C++代码,并在程序运行时被保存在 gpu::GpuFeatureInfo::enabled_gpu_driver_bug_workarounds 中。 另外,在 third_party/skia/src/gpu/gpu_workaround_list.txtgpu/config/gpu_workaround_list.txt 文件中记录了 Chromium 支持的所有的兼容列表。

可以通过命令行等方式来覆盖默认的兼容列表,比如启动时添加 --use_virtualized_gl_contexts=0 可以强制关闭虚拟Context的使用。

chrome://gpu 页面中可以查看当前应用的所有workarounds,下面是在我电脑上的检测结果:

Driver Bug Workarounds

  • adjust_src_dst_region_for_blitframebuffer
  • clear_uniforms_before_first_program_use
  • disable_discard_framebuffer
  • exit_on_context_lost
  • force_cube_complete
  • init_gl_position_in_vertex_shader
  • init_vertex_attributes
  • pack_parameters_workaround_with_pack_buffer
  • reset_base_mipmap_level_before_texstorage
  • scalarize_vec_and_mat_constructor_args
  • unpack_alignment_workaround_with_unpack_buffer
  • unpack_overlapping_rows_separately_unpack_buffer
  • use_virtualized_gl_contexts
  • disabled_extension_GL_KHR_blend_equation_advanced
  • disabled_extension_GL_KHR_blend_equation_advanced_coherent
  • disabled_extension_GL_MESA_framebuffer_flip_y

可以看到在我的电脑上启用了 use_virtualized_gl_contexts 功能。

背景信息

//gpu 模块提供的核心功能是 CommandBuffer,包括 CommandBuffer 的夸进程 IPC 通信,GL 命令序列化以及 GPU 的兼容性及性能测试。此外,它还负责收集并向其他模块提供当前系统的GPU的硬件信息,扩展信息,驱动信息等。对接 skia ganesh 也在这里实现。