Иногда в chromium подобных браузерах начинают очень криво отображаться страницы. Не то что бы “не по стандарту”, а с пропуском части контента и миганиями.

История

В большей своей массе проблемы рендеринга были просто “неудобные”, временами вообще не давали пользоваться браузером. Усугублялось все тем, что все основные часть браузера “показываются” через web-view - а значит с этими ошибками.

В основном проблема отображения заключались в:

  • блоки меняют свое положение;
  • контент мигает;
  • часть или целая страница оказывается “не видимой”.

Из-за редкой повторяемости и простого (оказалось что как повезет) решения, даже не копал в сторону поиска и решения проблемы. Обычно просто переключал флаг Preferred Ozone platform на странице флагов и жил дальше.

Но в последний раз это оказалось не возможным: из-за вышеописанного (страница флагов - это web-view) она открывалась просто пустой, без каких-либо видимых контролов. Если поводить мышкой над страницей, то можно было увидеть что указатель менялся. Проблема в том, что я не помню наизусть где какой контрол находиться 😥.

Поиски причин

Так как сбой были явно связаны не с версткой, а с процессом рендеринга (и лечились переключение настройками рендеринга), решено было глянуть логи. В логах нашлось интересное:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Vertex SKSL
#extension GL_NV_shader_noperspective_interpolation: require
uniform float4 sk_RTAdjust;in float2 position;in half4 color;flat out half4 vcolor_S0;void main() {// Primitive Processor QuadPerEdgeAAGeometryProcessor
vcolor_S0 = color;sk_Position = position.xy01;}
// Fragment SKSL
#extension GL_NV_shader_noperspective_interpolation: require
flat in half4 vcolor_S0;void main() {// Stage 0, QuadPerEdgeAAGeometryProcessor
half4 outputColor_S0;outputColor_S0 = vcolor_S0;const half4 outputCoverage_S0 = half4(1);{ // Xfer Processor: Porter Duff
sk_FragColor = outputColor_S0 * outputCoverage_S0;}}
// Vertex GLSL
#version 300 es
#extension GL_NV_shader_noperspective_interpolation : require
precision mediump float;
precision mediump sampler2D;
uniform highp vec4 sk_RTAdjust;
in highp vec2 position;
in mediump vec4 color;
flat out mediump vec4 vcolor_S0;
void main() {
    vcolor_S0 = color;
    gl_Position = vec4(position, 0.0, 1.0);
    gl_Position = vec4(gl_Position.xy * sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w);
}
// Fragment GLSL
#version 300 es
#extension GL_NV_shader_noperspective_interpolation : require
precision mediump float;
precision mediump sampler2D;
out mediump vec4 sk_FragColor;
flat in mediump vec4 vcolor_S0;
void main() {
    mediump vec4 outputColor_S0;
    outputColor_S0 = vcolor_S0;
    {
        sk_FragColor = outputColor_S0;
    }
}
Errors:
link failed but did not provide an info log
[6430:6430:0716/231329.938336:ERROR:shared_context_state.cc(81)] Skia shader compilation error

Это сообщение повторялось раз за разом. При этом глаз зацепился за Skia shader compilation error, что-то про GPU и шейдер. В надежде (ну да 🙃), что это проблема не только у меня, решил поискать “собратьев по счастью”. Наткнулся на баг: https://bugs.chromium.org/p/chromium/issues/detail?id=1442633.

Решение

Поискал упоминание этого бага и везде, как и в самом баг-репорте, советуют удалить папку с GPU кешем: GPUCache. Найти ее можно по пути:

1
~/.config/chromium/Default/GPUCache

Для других браузеров пути похожи, только нужно заменить название браузера в пути. В общем-то сбрасывать кеш GPU - задачка не сложная. Но есть особенности:

  • проблема время от времени повторяется;
  • браузеров несколько;
  • лень запоминать пути и прочее.

Поэтому добавил в свой zsh функцию-скрипт, что бы было человеческое автодополнение и можно было все “починить за пару табов”:

1
2
3
4
5
6
7
function chromium-render-fix() {
    for browser in chromium BraveSoftware google-chrome yandex-browser
    do 
        local searchdir="$HOME/.config/$browser/"
        [ -d "$searchdir" ] && find "$searchdir" -type d -name "GPUCache" | xargs rm -rf
    done
}

Скрипт удалит кеш еще и для расширений. Дополнительные браузеры можно вписать во второй строке.