Mi archivo favorito en la base de código de Chromium

El código Chromium es muy extenso, allí todos encontrarán algo a su gusto. Y ahora decidí hablar sobre mi archivo favorito (¿tiene uno?). Este archivo refleja todo: dolor, desilusión, esperanza, perseverancia, fuerza de voluntad, responsabilidad por los fracasos de otras personas y sacrificio personal. A veces lo leo y lloro y entiendo lo que una gran parte del iceberg está oculto bajo el agua. Esto, en general, ni siquiera es un archivo de código. Este es un archivo con una configuración que describe los errores de la tarjeta de video que Chromium debe omitir para mostrar sus páginas en diferentes plataformas. Aquí está: https://cs.chromium.org/chromium/src/gpu/config/gpu_driver_bug_list.json

De que estamos hablando Recordemos cómo funciona el navegador: escribe alguna dirección en la barra de direcciones, el navegador carga el contenido y lo muestra. El buen artículo "¿Qué sucede cuando escribes google.com en tu navegador y presionas Intro?". Cuenta un poco más sobre esto . (y de inmediato varias traducciones de él en Habré). Uno de los últimos puntos se menciona en él, dicen, "y ahora que todo está listo, dibujamos una imagen en la pantalla". Sí, tómalo y dibújalo así, por supuesto.


Para empezar, en los lenguajes de programación por alguna razón no hay una función "tomar y dibujar esto en la pantalla" fuera de la caja. Los idiomas y sus bibliotecas estándar no están interesados ​​en tales bagatelas. En consecuencia, el código universal multiplataforma para dibujar no es tan fácil de escribir. Todo tipo de juegos geniales de AAA eluden esta restricción de manera bastante directa: “Deberías tener una consola o un sistema operativo con una tarjeta de video por $ 800, entonces funcionará de alguna manera. Probablemente ". Gracias por el consejo! Pero el navegador no es un juego. El navegador debería funcionar siempre y en todas partes. El usuario de incluso la PC más muerta, comprada hace 10 años (e incluso entonces, en una venta) no espera jugar el último Witcher, pero se sentirá realmente indignado si no puede abrir su correo en el navegador o googlear algo. Por otro lado, el jugador que donó un riñón para una tarjeta de video querrá ver videos de 8k en el navegador , girar modelos 3D e incluso puede desplazarse suavemente por la cinta de Facebook.

Todo esto hace que los desarrolladores de Chromium literalmente exploten: por un lado, aún admiten el dibujo con tecnologías antiguas como GDI y DirectX9 para trabajar en equipos obsoletos, pero por otro lado vieron soporte para las últimas versiones de OpenGL, DirectX11 (¿o ya 12?) Y Vulkan, que permite la implementación en dispositivos modernos completos (incluidos los móviles).

Pero todo esto habría sido la mitad del problema si todo este zoológico funcionara como debería funcionar de acuerdo con las especificaciones. Lo que no sucede en absoluto. El hardware real y sus controladores rompen todo: promesas de marketing para los clientes, especificaciones técnicas, estándares generalmente aceptados, pruebas de certificación, compatibilidad del sistema operativo, planes de actualización, etc. Pero, además del hardware real y sus controladores, no tenemos nada más. Por lo tanto, tienes que trabajar en lo que es. Esto es lo que dice el archivo gpu_driver_bug_list.json mencionado anteriormente .

Por cierto, la medida en que el navegador está tratando de "sobrevivir a toda costa" merece respeto. Entonces, con problemas no críticos, por ejemplo, con DirectX11, se harán intentos para deshabilitar ciertas partes de su funcionalidad, sacrificando el rendimiento, pero manteniendo la operatividad. Para errores más graves: DirectX11 se deshabilitará y el navegador cambiará a DirectX9, donde también (si es necesario) los componentes problemáticos se "cortarán y desecharán". Bueno, con una falla completa del sistema DirectX, habrá un cambio a GDI, que afectará el consumo de procesador y RAM, pero aún mantendrá el rendimiento de las páginas normales (sin video pesado o 3D) en un nivel en el que el usuario probablemente ni siquiera entienda que algo va mal Donde otros programas ya le pedirán que actualice el controlador o cambie la tarjeta de video, Chromium simplemente continuará funcionando. El impresionante

Veamos el contenido del archivo que mencioné. El número de entradas individuales en él: 215 piezas. 215 veces cuando el desarrollador de hierro mintió, era demasiado vago, era estúpido o codicioso. 215 veces tuve que buscar la configuración correcta de hardware y software para reproducir el problema y encontrar su solución. Es difícil decir cuántas veces se decidió no solucionar el problema, pero dado que hay muchas personas a nuestro alrededor con hierro viejo y de alguna manera muy pocas que tienen "Google no se abre en Chrome", podemos suponer que hubo muy pocos casos de este tipo.

La siguiente observación interesante es la distribución por sistema operativo: 89 - android, 44 - macosx, 34 - linux, 26 - win, 8 - chromeos. Las conclusiones a partir de aquí pueden hacerse diferentes. Por un lado, es obvio que Android es una plataforma clave para Google y se destruyeron enormes fondos para solucionar errores. Por otro lado, no está claro por qué fueron pirateados en correcciones en la base de código de Chromium, y no en los controladores o el sistema operativo (después de todo, Google tiene un nivel de control bastante alto en todas las etapas). Las correcciones allí beneficiarían a todo el software en Android, y aquí solo Chromeium. Lo más probable es que la cuestión esté en la interacción de los departamentos, cuando es más fácil para el programador de Chromium solucionar el problema en su código aquí y ahora que escalarlo 3-4 niveles hacia arriba, luego hacia un lado y luego 3-4 niveles hacia abajo. Hay menos personas interesadas en esto en cualquier empresa de lo que sería necesario.

Me sorprendió mucho que hubiera casi dos veces más errores de renderizado en Mac Os que en Windows. Me pareció que todo lo que hay allí es muy limitado en hardware y lamido por los controladores. Pero resultó que el zoológico de Windows es dos veces más tenaz y estable. Directamente "Catedral y Bazar" en las ilustraciones. ¿O los desarrolladores de Google solo están probando el código solo en amapolas?

La división de proveedores también es interesante: Nvidia - 22, AMD / ATI - 17, Intel - 30. No creo que el software o hardware Intel sea directamente peor, sino que afecta la producción en masa. Es probable que todos los que no compren específicamente una "computadora para juegos" compren algo con una tarjeta gráfica Intel integrada. Un error que ocurre con el 0.001% de los usuarios vivirá en la tarjeta de video de NVidia o ATI durante años, pero conducirá a un grupo de usuarios enojados en foros y redes sociales en el caso de Intel. "El gran poder conlleva una gran responsabilidad".

La separación entre los errores de OpenGL y DirectX parece divertida: OpenGL es 16, DirectX es 0. Pero esto no se debe a que OpenGL es tan malo, y DirectX es tan bueno. La cuestión es que todos los errores en la categoría de "ganar" (esas son 26 piezas) son en realidad errores de DirectX (bueno, está bien, no todos, pero casi todos).

Pero está bien, deja de culpar a todos en una fila generalizada. Seamos personales , y allí, antes de la pelea, ya ves, ¡no muy lejos !

Aquí, por ejemplo, la entrada 211 , que se refiere al error 672380 . Para las personas, el menos unario y la función de arco tangente en algunos equipos de Intel y NVidia dejaron de funcionar en el código. ¡Unario menos , maldita sea, y trigonometría básica ! Parecería, ¿qué más creer? Pero no, lo arreglaron y funciona.

O aquí hay registros de "colores mostrados incorrectamente" como el número 185 , 219 , 220 y algunos otros. El programador hizo todo bien, todas las funciones funcionaron y devolvió "éxito", pero en la pantalla, como resultado, se muestra un píxel del color incorrecto. Ah, sí, solo en estas tarjetas de video y estas versiones de controlador. Por cierto, una pregunta para los fanáticos de la teoría de que las pruebas pueden cubrir todo: ¿cómo cubrirían esto con las pruebas?

Aquí hay otra cosa interesante, # 224 : "La decodificación VPx no es compatible mucho antes de la actualización de los creadores de Windows 10". Bueno, es decir, salió el sistema operativo, todos anunciaron que ella había acelerado la decodificación de tal o cual video. Pero en la práctica resultó que existe, pero sería mejor que no existiera en absoluto. Y es mejor apagarlo. Como resultado, el desarrollador del sistema operativo vende otros mil millones de sistemas operativos pagos, y el desarrollador del navegador gratuito recoge las quejas de que el video no se reproduce tan bien como nos gustaría, ¡aunque parece que tanto el hardware como el sistema operativo deberían permitirlo! “¿Dónde están mis 60 fps y por qué su navegador consumió 4 GB de RAM?”, Una conversación familiar, ¿verdad?

Y de inmediato la atrapa el número de registro 225 : "La decodificación de VPx es demasiado lenta en Intel Broadwell, Skylake y CherryView". Desarrollamos, lo que significa que desarrollamos nuevas generaciones de procesadores uno tras otro, anunciados, vendidos. Pero los problemas del usuario final son los problemas del usuario final, a quien le importan. Deje que los solicitantes de alguna manera lo aplasten con una muleta, y luego lo arreglaremos.

Una canción separada son los llamados "gráficos intercambiables", que participan activamente en los vendedores de las tiendas. Bueno, dicen, qué buena computadora portátil con dos tarjetas de video: todo será rápido en los juegos, pero en los programas de oficina (como un navegador) será muy eficiente en términos de energía, ¡funcionará durante diez horas! Y ahora miramos la amarga verdad de la vida: en Windows esto conducirá a un rechazo completo de DirectX11 (registro No. 100 ), y en las amapolas se bloqueará tan a menudo que es mejor que apaguemos por completo una tarjeta no discreta (registro No. 228 ).

O aquí está el número 242 : "El código producido por la inicialización de la variable local a menudo provoca bloqueos en el controlador Marshmallow Adreno". La solución también está bien: "dont_initialize_uninitialized_locals". Bueno, ¿qué tipo de personas normales estarían de acuerdo en escribir algo debajo de la plataforma, donde las variables locales no se pueden inicializar durante la declaración, porque el controlador se bloquea por esto? Pero en el código de un producto tan masivo como Chromium, tienes que vivir con esto.

Núm. 26 : "Desactivar el uso de Direct3D 11 en Windows Vista". DirectX10 fue una de las características principales de Vista durante el lanzamiento, y después de algún tiempo que apareció DirectX11, todavía recuerdo las cajas de tarjetas de video de aquellos tiempos con orgullosas inscripciones "DirectX11 compatible". Y para muchos, esta fue generalmente la única razón para cambiar de un XP familiar y estable. Pasaron los años, y ahora el soporte para DirectX11 (producto de Microsoft) en Windows Vista (producto de Microsoft) está calificado como "no compatible". ¡Reconocimiento directo de mérito!

Bien, estoy cansado de elegir uno en particular, lea el resto usted mismo: las razones de los errores y las muletas implementadas están bien descritas allí, además de que hay enlaces al rastreador de errores (el campo "cr_bugs").

Moraleja


En primer lugar, todos mienten. En segundo lugar, incluso en condiciones en las que todos mienten, todavía es posible escribir software de alta calidad. Y en tercer lugar, la próxima vez que alguien le cuente cómo la web moderna llegó al éxito gracias al "poder de HTML, CSS y el hermoso lenguaje Javascript", muéstrele este artículo y pregúntele cómo funcionaría y a quién era necesario sin este heroico trabajo de personas invisibles en un esfuerzo por "despegar con toda esta basura".

Source: https://habr.com/ru/post/es424369/


All Articles