<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dh-electronics.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fgerstandl</id>
	<title>Wiki-DB - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dh-electronics.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Fgerstandl"/>
	<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=Special:Contributions/Fgerstandl"/>
	<updated>2026-04-13T00:48:52Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3547</id>
		<title>XLON</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3547"/>
		<updated>2021-11-10T07:36:52Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* XLON Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000; border-spacing: 2px; border: 1px solid darkgray;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:XLON Logo in Schwarz von SD Kopie.jpg|400px|XLON]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:LOGO_DH_electronics.jpg|180px|DH electronics]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
== XLON products ==&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:XLON U10.png|100px|XLON U10|link=]]&lt;br /&gt;
|&lt;br /&gt;
*&#039;&#039;&#039;[[XLON U10]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware Development ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software Development ==&lt;br /&gt;
=== XLON Configuration ===&lt;br /&gt;
The XLON Uxx LonWorks interfaces come with two different flavours of configuration:&lt;br /&gt;
# Vendor mode - does not appear as a serial port in the system.&lt;br /&gt;
# CDC/ACM mode - appears as a (virtual) serial port in the system.&lt;br /&gt;
This configuration can be replaced by using the xlon-util tool.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XLON Tools ===&lt;br /&gt;
With the following links you can download the xlon-util for different architectures:&lt;br /&gt;
* [[media:AAAu48iSX_j4TVGTrvtwGuqja|xlon-util packages]]&lt;br /&gt;
:  The xlon-util packages containes the xlon-util to configure the xlon-u10. It also contains the xlon-api libs to integrate the xlon-util functionality into a custom application.&lt;br /&gt;
* [[media:AAA8eq-wtunWfVFSOihXnh57a|dependency packages]]&lt;br /&gt;
:  The dependency packages contains libraries which are not in the debian repositories.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|development packages]]&lt;br /&gt;
:  The development packages contains the api header files to compile a custom application with the xlon-api libs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows Drivers ===&lt;br /&gt;
Drivers for various 32- and 64-Bit versions of Windows operating system:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Vendor mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86.zip|XLON-2G-Win7-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64.zip|XLON-2G-Win7-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86.zip|XLON-2G-Win8-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64.zip|XLON-2G-Win8-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86.zip|XLON-2G-Win8.1-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64.zip|XLON-2G-Win8.1-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86.zip|XLON-2G-Win10-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64.zip|XLON-2G-Win10-x64.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+CDC/ACM mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86-cdc-acm.zip|XLON-2G-Win7-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64-cdc-acm.zip|XLON-2G-Win7-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86-cdc-acm.zip|XLON-2G-Win8-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64-cdc-acm.zip|XLON-2G-Win8-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86-cdc-acm.zip|XLON-2G-Win8.1-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64-cdc-acm.zip|XLON-2G-Win8.1-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86-cdc-acm.zip|XLON-2G-Win10-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64-cdc-acm.zip|XLON-2G-Win10-x64-cdc-acm.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039;: If you experience an error about missing &#039;Microsoft Visual C 2010 redistributable&#039; when starting xlon_util.exe, &lt;br /&gt;
please download it from the [https://www.microsoft.com/de-de/download/details.aspx?id=5555 Microsoft site].&lt;br /&gt;
&lt;br /&gt;
== [[FAQ_General |&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;FAQ&amp;lt;/span&amp;gt;]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Series Manufacturing ==&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3546</id>
		<title>XLON</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3546"/>
		<updated>2021-11-10T07:31:01Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Software Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000; border-spacing: 2px; border: 1px solid darkgray;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:XLON Logo in Schwarz von SD Kopie.jpg|400px|XLON]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:LOGO_DH_electronics.jpg|180px|DH electronics]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
== XLON products ==&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:XLON U10.png|100px|XLON U10|link=]]&lt;br /&gt;
|&lt;br /&gt;
*&#039;&#039;&#039;[[XLON U10]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware Development ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software Development ==&lt;br /&gt;
=== XLON Configuration ===&lt;br /&gt;
The XLON Uxx LonWorks interfaces come with two different flavours of configuration:&lt;br /&gt;
# Vendor mode - does not appear as a serial port in the system.&lt;br /&gt;
# CDC/ACM mode - appears as a (virtual) serial port in the system.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ACM/CDC and Vendor configs for all xlon products can be downloaded here:&lt;br /&gt;
[[media:AAD_rGoV8YpnxMh9SWqAsT4Xa|xlon-util config]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be replaced by using the xlon-util tool. For example to update the config on the first device execute the following command:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
xlon-util -d0 -c&amp;lt;pathToConfig&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XLON Tools ===&lt;br /&gt;
With the following links you can download the xlon-util for different architectures:&lt;br /&gt;
* [[media:AAAu48iSX_j4TVGTrvtwGuqja|xlon-util packages]]&lt;br /&gt;
:  The xlon-util packages containes the xlon-util to configure the xlon-u10. It also contains the xlon-api libs to integrate the xlon-util functionality into a custom application.&lt;br /&gt;
* [[media:AAA8eq-wtunWfVFSOihXnh57a|dependency packages]]&lt;br /&gt;
:  The dependency packages contains libraries which are not in the debian repositories.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|development packages]]&lt;br /&gt;
:  The development packages contains the api header files to compile a custom application with the xlon-api libs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows Drivers ===&lt;br /&gt;
Drivers for various 32- and 64-Bit versions of Windows operating system:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Vendor mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86.zip|XLON-2G-Win7-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64.zip|XLON-2G-Win7-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86.zip|XLON-2G-Win8-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64.zip|XLON-2G-Win8-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86.zip|XLON-2G-Win8.1-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64.zip|XLON-2G-Win8.1-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86.zip|XLON-2G-Win10-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64.zip|XLON-2G-Win10-x64.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+CDC/ACM mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86-cdc-acm.zip|XLON-2G-Win7-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64-cdc-acm.zip|XLON-2G-Win7-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86-cdc-acm.zip|XLON-2G-Win8-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64-cdc-acm.zip|XLON-2G-Win8-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86-cdc-acm.zip|XLON-2G-Win8.1-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64-cdc-acm.zip|XLON-2G-Win8.1-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86-cdc-acm.zip|XLON-2G-Win10-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64-cdc-acm.zip|XLON-2G-Win10-x64-cdc-acm.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039;: If you experience an error about missing &#039;Microsoft Visual C 2010 redistributable&#039; when starting xlon_util.exe, &lt;br /&gt;
please download it from the [https://www.microsoft.com/de-de/download/details.aspx?id=5555 Microsoft site].&lt;br /&gt;
&lt;br /&gt;
== [[FAQ_General |&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;FAQ&amp;lt;/span&amp;gt;]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Series Manufacturing ==&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3545</id>
		<title>XLON</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3545"/>
		<updated>2021-11-10T07:28:17Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Software Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000; border-spacing: 2px; border: 1px solid darkgray;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:XLON Logo in Schwarz von SD Kopie.jpg|400px|XLON]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:LOGO_DH_electronics.jpg|180px|DH electronics]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
== XLON products ==&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:XLON U10.png|100px|XLON U10|link=]]&lt;br /&gt;
|&lt;br /&gt;
*&#039;&#039;&#039;[[XLON U10]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware Development ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software Development ==&lt;br /&gt;
The XLON Uxx LonWorks interfaces come with two different flavours of configuration:&lt;br /&gt;
# Vendor mode - does not appear as a serial port in the system.&lt;br /&gt;
# CDC/ACM mode - appears as a (virtual) serial port in the system.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
ACM/CDC and Vendor configs for all xlon products can be downloaded here:&lt;br /&gt;
[[media:AAD_rGoV8YpnxMh9SWqAsT4Xa|xlon-util config]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
This configuration can be replaced by using the xlon-util tool. For example to update the config on the first device execute the following command:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
xlon-util -d0 -c&amp;lt;pathToConfig&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XLON Tools ===&lt;br /&gt;
With the following links you can download the xlon-util for different architectures:&lt;br /&gt;
* [[media:AAAu48iSX_j4TVGTrvtwGuqja|xlon-util packages]]&lt;br /&gt;
:  The xlon-util packages containes the xlon-util to configure the xlon-u10. It also contains the xlon-api libs to integrate the xlon-util functionality into a custom application.&lt;br /&gt;
* [[media:AAA8eq-wtunWfVFSOihXnh57a|dependency packages]]&lt;br /&gt;
:  The dependency packages contains libraries which are not in the debian repositories.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|development packages]]&lt;br /&gt;
:  The development packages contains the api header files to compile a custom application with the xlon-api libs.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Windows Drivers ===&lt;br /&gt;
Drivers for various 32- and 64-Bit versions of Windows operating system:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Vendor mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86.zip|XLON-2G-Win7-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64.zip|XLON-2G-Win7-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86.zip|XLON-2G-Win8-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64.zip|XLON-2G-Win8-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86.zip|XLON-2G-Win8.1-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64.zip|XLON-2G-Win8.1-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86.zip|XLON-2G-Win10-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64.zip|XLON-2G-Win10-x64.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+CDC/ACM mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86-cdc-acm.zip|XLON-2G-Win7-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64-cdc-acm.zip|XLON-2G-Win7-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86-cdc-acm.zip|XLON-2G-Win8-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64-cdc-acm.zip|XLON-2G-Win8-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86-cdc-acm.zip|XLON-2G-Win8.1-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64-cdc-acm.zip|XLON-2G-Win8.1-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86-cdc-acm.zip|XLON-2G-Win10-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64-cdc-acm.zip|XLON-2G-Win10-x64-cdc-acm.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039;: If you experience an error about missing &#039;Microsoft Visual C 2010 redistributable&#039; when starting xlon_util.exe, &lt;br /&gt;
please download it from the [https://www.microsoft.com/de-de/download/details.aspx?id=5555 Microsoft site].&lt;br /&gt;
&lt;br /&gt;
== [[FAQ_General |&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;FAQ&amp;lt;/span&amp;gt;]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Series Manufacturing ==&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=DHCOM_STM32MP1_Linux&amp;diff=3457</id>
		<title>DHCOM STM32MP1 Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=DHCOM_STM32MP1_Linux&amp;diff=3457"/>
		<updated>2021-09-15T07:26:46Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* How is the Webbrowser Perfomance on the STM32MP1? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux virtual machine for development ==&lt;br /&gt;
:* Please have a look at: &#039;&#039;&#039;[[Virtual Machine for Application Development]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Sources: Look at page [[DHCOM iMX6ULL-D2#BSP Sources|i.MX6ULL BSP Sources]] === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to build a Kernel ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; |  style=&amp;quot;width: 98%; background: #f3f3f3;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
Get sources from Github&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
1. Start the Console on Linux&amp;lt;br/&amp;gt;&lt;br /&gt;
2. &amp;lt;tt&amp;gt;&#039;&#039;git clone https://github.com/dh-electronics/linux-stm32mp1.git --branch dev/5.4.69_dhsom&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
3. &amp;lt;tt&amp;gt;&#039;&#039;cd linux-stm32mp1&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Configure and build the Device Tree + Kernel&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
| &lt;br /&gt;
4. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make stm32mp1_dhsom_defconfig&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
5. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make menuconfig&#039;&#039;&amp;lt;/tt&amp;gt; (optional: If you want to add/remove Kernel features)&amp;lt;br/&amp;gt;&lt;br /&gt;
6. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make dtbs&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
7. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make zImage&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Create the FIT-image with our script ([[media:Dh-create-fitimage_1.0_all.deb|Download link]])&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Interactive mode for selecting device trees&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Device trees are set as parameter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
8. &amp;lt;tt&amp;gt;&#039;&#039;create_fitimage&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enter the numbers (space seperated) of the device trees to include (e.g. if you want to include the device tree for the PDK2 include the number of &amp;lt;tt&amp;gt;&#039;&#039;./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2.dtb&#039;&#039;&amp;lt;/tt&amp;gt; (usually 3).&amp;lt;br/&amp;gt;&lt;br /&gt;
Enter the numbers (space seperated) of the device trees overlays to include (e.g. for the PDK2 enter the files which contain &amp;lt;tt&amp;gt;&#039;&#039;PDK2&#039;&#039;&amp;lt;/tt&amp;gt; (usually 8 9 10 11 12 13 14).&lt;br /&gt;
|&lt;br /&gt;
(Example is for the PDK2) &amp;lt;br&amp;gt;&lt;br /&gt;
8. &amp;lt;tt&amp;gt;&#039;&#039;create_fitimage --dtb ./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2.dtb --dtbo ./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-460-200-x11.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-497-200-x12.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-505-200-x12-ch101olhlwh.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-531-100-x21.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-531-100-x22.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-560-200-x12.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-638-100-x12-rpi7inch.dtbo&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kernel Userspace Interfaces to Access Hardware == &lt;br /&gt;
&lt;br /&gt;
=== RS-485 on picoITX ===&lt;br /&gt;
:&#039;&#039;&#039;RS-485 device&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM UART 2||&amp;lt;tt&amp;gt;/dev/ttySTM2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Compilation on target&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;gcc tty_rs485_test_v1.1.c -o tty_rs485_test&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;gcc tty_rs485_flags_v1.0.c -o tty_rs485_flags&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Show UART flags&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;./tty_rs485_flags /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Set tty device to raw mode&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;stty -F /dev/ttySTM2 115200 raw -echo -echoe&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Send data with demo program&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;echo -n -e &amp;quot;\n\rHallo RS485 Welt!&amp;quot; &amp;amp;brvbar; ./tty_rs485_test /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Receive data with demo program&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;./tty_rs485_test /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Download example source code&#039;&#039;&#039;&lt;br /&gt;
:* [[media:tty_rs485_test_v1.1.zip | tty_rs485_test_v1.1.c &amp;amp; tty_rs485_flags_v1.0.c]]&lt;br /&gt;
&lt;br /&gt;
=== CAN interface ===&lt;br /&gt;
:&#039;&#039;&#039;Setup CAN interface with baudrate 500kbit/sec.&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;ip link set can0 up type can bitrate 500000&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Start to listen on CAN port&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;candump can0&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Send test message&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;cansend can0 100#11.2233.44556677.88&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Deinitialize CAN port&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;ip link set can0 down&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UART Interfaces ===&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM UART 1 ||&amp;lt;tt&amp;gt;/dev/ttySTM0&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM UART 2 ||&amp;lt;tt&amp;gt;/dev/ttySTM2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM UART 3 ||&amp;lt;tt&amp;gt;/dev/ttySTM1&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== I2C Interfaces ===&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM I2C 1||&amp;lt;tt&amp;gt;/dev/i2c-1&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM I2C 2 ||&amp;lt;tt&amp;gt;/dev/i2c-0&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||On Module Devices ||&amp;lt;tt&amp;gt;/dev/i2c-2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
==== &#039;&#039;&#039;USB 1.1 problems: Custom board without USB 2.0 hub inbetween the MP1 USB host port?&#039;&#039;&#039; ====&lt;br /&gt;
And in that case, have a look at arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi and how the OHCI (!) is enabled there. And of course, make sure the kernel config options are enabled accordingly (like for the PicoITX machine)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | style=&amp;quot;width: 100%; color: #000000; background: #FFFFFF;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;meta-dhsom-stm32-bsp$ git grep OHCI&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | style=&amp;quot;width: 100%; color: #000000; background: #FFFFFF;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;recipes-kernel/linux/linux-stable/5.10/dh-stm32mp1-common/dh-stm32mp1-dhsom-common.cfg:CONFIG_USB_OHCI_HCD=y&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;recipes-kernel/linux/linux-stable/5.10/dh-stm32mp1-common/dh-stm32mp1-dhsom-common.cfg:CONFIG_USB_OHCI_HCD_PLATFORM=y&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi snippet:&lt;br /&gt;
 &amp;amp;usbh_ehci {&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbh_ohci { // &amp;lt;---------------- HERE&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbotg_hs {&lt;br /&gt;
          dr_mode = &amp;quot;otg&amp;quot;;&lt;br /&gt;
          pinctrl-0 = &amp;lt;&amp;amp;usbotg_hs_pins_a&amp;gt;;&lt;br /&gt;
          pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
          phy-names = &amp;quot;usb2-phy&amp;quot;;&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port1 0&amp;gt;;&lt;br /&gt;
          vbus-supply = &amp;lt;&amp;amp;vbus_otg&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc {&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port0 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port1 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;System stability or USB Host problems?&#039;&#039;&#039; ====&lt;br /&gt;
If a display with higher resolution and pixel clock &amp;gt; 48 MHz is used, then this can case USB host and/or system stability problems.&lt;br /&gt;
&lt;br /&gt;
Workaround:&lt;br /&gt;
The OSPEEDR must be set to OSPEEDR = 1 for LCD_CLK and OSPEEDR = 0 for all other LTDC signals.&lt;br /&gt;
 &amp;amp;pinctrl {&lt;br /&gt;
 	ltdc_pins_ customhmi: ltdc-dh-1 {&lt;br /&gt;
 		pins1 {&lt;br /&gt;
 			pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 14, AF14)&amp;gt;; /* LCD_CLK */&lt;br /&gt;
 			bias-disable;&lt;br /&gt;
 			drive-push-pull;&lt;br /&gt;
 			&#039;&#039;&#039;slew-rate = &amp;lt;1&amp;gt;;&#039;&#039;&#039;&lt;br /&gt;
 		};&lt;br /&gt;
 		pins2 {&lt;br /&gt;
 				pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 12, AF14)&amp;gt;, /* LCD_HSYNC */&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;I&#039;, 13, AF14)&amp;gt;, /* LCD_VSYNC */&lt;br /&gt;
                                  ...&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;K&#039;,  6, AF14)&amp;gt;; /* LCD_B7 */&lt;br /&gt;
 			bias-disable;&lt;br /&gt;
 			drive-push-pull;&lt;br /&gt;
 			&#039;&#039;&#039;slew-rate = &amp;lt;0&amp;gt;;&#039;&#039;&#039;&lt;br /&gt;
 		};&lt;br /&gt;
 	};&lt;br /&gt;
 	&lt;br /&gt;
 	ltdc_sleep_pins_ customhmi: ltdc-sleep-dh-1 {&lt;br /&gt;
 		pins {&lt;br /&gt;
 			pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 14, ANALOG)&amp;gt;, /* LCD_CLK */&lt;br /&gt;
                                  ...&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;K&#039;,  6, ANALOG)&amp;gt;; /* LCD_B7 */&lt;br /&gt;
 		};&lt;br /&gt;
 	};	&lt;br /&gt;
 };&lt;br /&gt;
==== &#039;&#039;&#039;USB OTG: Custom board where the USB-OTG port is only used as host?&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
On the DHCOM standard, the second USB port of the STM32MP1 is usually an USB-OTG port. If you have a custom board where you want to use the USB-OTG port in host mode only, you should consider the following:&lt;br /&gt;
&lt;br /&gt;
The USB-OTG controller on the STM32MP1, DWC2, does support host mode but is rather inefficient (in comparison to a dedicated USB host controller). The following block diagram shows, that it is possible on the STM32MP1 to alter the pinmuxing, so that the USB-OTG port is used with the USB Host controller of the STM32MP1 (instead of using the DWC2 OTG controller):   &lt;br /&gt;
&lt;br /&gt;
    Host port#1: EHCI/OHCI controller _________ HS PHY port #1 (SoC balls D+/D- #1)&lt;br /&gt;
       &lt;br /&gt;
       &lt;br /&gt;
    Host port#2: EHCI/OHCI controller __ &lt;br /&gt;
                                         \   &lt;br /&gt;
                                         |_____ HS PHY port #2 (SoC balls D+/D- #2)&lt;br /&gt;
    DWC2 OTG controller_________________/|&lt;br /&gt;
                                         |&lt;br /&gt;
            UTIM switch__________________|&lt;br /&gt;
&lt;br /&gt;
This change can be made in the device tree with disabling the DWC2 controller and adding the second usb_phyc port to the nodes of usbh_ehci and (if applicable) usbh_ohci. These nodes are usually in the .dtsi file of the board (e.g. for the PicoITX: arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi). Here a is snippet how this could look like:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;usbh_ehci {&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;&#039;&#039;&#039;, &amp;lt;&amp;amp;usbphyc_port1 1&amp;gt;&#039;&#039;&#039;; // &amp;lt;-------- HERE&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbh_ohci { &lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;&#039;&#039;&#039;, &amp;lt;&amp;amp;usbphyc_port1 1&amp;gt;&#039;&#039;&#039;; // &amp;lt;-------- HERE&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbotg_hs {&lt;br /&gt;
          &#039;&#039;&#039;status = &amp;quot;disabled&amp;quot;;&#039;&#039;&#039; // &amp;lt;-------- HERE&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc {&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port0 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port1 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;How to try QtWebengine&#039;&#039;&#039; ====&lt;br /&gt;
The QtWebengine is part of the DH default images. &lt;br /&gt;
Please stop the Weston desktop, before the start of the Browser.&lt;br /&gt;
 Older images: &amp;quot;systemctl stop weston@root.service&amp;quot;  &lt;br /&gt;
 Newer images: &amp;quot;systemctl stop weston.service&amp;quot;&lt;br /&gt;
How to start the Browser:&lt;br /&gt;
 QT_QPA_PLATFORM=eglfs QT_QPA_EGLFS_ALWAYS_SET_MODE=1 QT_QPA_EGLFS_KMS_CONFIG=/etc/default/qt5-eglfs-kms.json qtwebengine-minimal http://YOUR-TEST-PAGE/ --no-sandbox&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;How is the Browser Perfomance on the STM32MP1?&#039;&#039;&#039; ====&lt;br /&gt;
[https://wiki.dh-electronics.com/index.php/STM32MP1_Browser_Performance STM32MP1 Browser Performance]&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=DHCOM_STM32MP1_Linux&amp;diff=3456</id>
		<title>DHCOM STM32MP1 Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=DHCOM_STM32MP1_Linux&amp;diff=3456"/>
		<updated>2021-09-15T07:23:16Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* FAQ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux virtual machine for development ==&lt;br /&gt;
:* Please have a look at: &#039;&#039;&#039;[[Virtual Machine for Application Development]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Linux Kernel ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Sources: Look at page [[DHCOM iMX6ULL-D2#BSP Sources|i.MX6ULL BSP Sources]] === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to build a Kernel ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; |  style=&amp;quot;width: 98%; background: #f3f3f3;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
Get sources from Github&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
1. Start the Console on Linux&amp;lt;br/&amp;gt;&lt;br /&gt;
2. &amp;lt;tt&amp;gt;&#039;&#039;git clone https://github.com/dh-electronics/linux-stm32mp1.git --branch dev/5.4.69_dhsom&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
3. &amp;lt;tt&amp;gt;&#039;&#039;cd linux-stm32mp1&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Configure and build the Device Tree + Kernel&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
| &lt;br /&gt;
4. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make stm32mp1_dhsom_defconfig&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
5. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make menuconfig&#039;&#039;&amp;lt;/tt&amp;gt; (optional: If you want to add/remove Kernel features)&amp;lt;br/&amp;gt;&lt;br /&gt;
6. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make dtbs&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
7. &amp;lt;tt&amp;gt;&#039;&#039;ARCH=arm CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- make zImage&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Create the FIT-image with our script ([[media:Dh-create-fitimage_1.0_all.deb|Download link]])&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%; color: #000000; background: #ffffff;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Interactive mode for selecting device trees&#039;&#039;&#039;&lt;br /&gt;
| &#039;&#039;&#039;Device trees are set as parameter&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
8. &amp;lt;tt&amp;gt;&#039;&#039;create_fitimage&#039;&#039;&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Enter the numbers (space seperated) of the device trees to include (e.g. if you want to include the device tree for the PDK2 include the number of &amp;lt;tt&amp;gt;&#039;&#039;./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2.dtb&#039;&#039;&amp;lt;/tt&amp;gt; (usually 3).&amp;lt;br/&amp;gt;&lt;br /&gt;
Enter the numbers (space seperated) of the device trees overlays to include (e.g. for the PDK2 enter the files which contain &amp;lt;tt&amp;gt;&#039;&#039;PDK2&#039;&#039;&amp;lt;/tt&amp;gt; (usually 8 9 10 11 12 13 14).&lt;br /&gt;
|&lt;br /&gt;
(Example is for the PDK2) &amp;lt;br&amp;gt;&lt;br /&gt;
8. &amp;lt;tt&amp;gt;&#039;&#039;create_fitimage --dtb ./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2.dtb --dtbo ./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-460-200-x11.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-497-200-x12.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-505-200-x12-ch101olhlwh.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-531-100-x21.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-531-100-x22.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-560-200-x12.dtbo,./arch/arm/boot/dts/stm32mp157c-dhcom-pdk2-overlay-638-100-x12-rpi7inch.dtbo&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kernel Userspace Interfaces to Access Hardware == &lt;br /&gt;
&lt;br /&gt;
=== RS-485 on picoITX ===&lt;br /&gt;
:&#039;&#039;&#039;RS-485 device&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM UART 2||&amp;lt;tt&amp;gt;/dev/ttySTM2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Compilation on target&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;gcc tty_rs485_test_v1.1.c -o tty_rs485_test&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;gcc tty_rs485_flags_v1.0.c -o tty_rs485_flags&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Show UART flags&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;./tty_rs485_flags /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Set tty device to raw mode&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;stty -F /dev/ttySTM2 115200 raw -echo -echoe&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Send data with demo program&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;echo -n -e &amp;quot;\n\rHallo RS485 Welt!&amp;quot; &amp;amp;brvbar; ./tty_rs485_test /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Receive data with demo program&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;./tty_rs485_test /dev/ttySTM2&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Download example source code&#039;&#039;&#039;&lt;br /&gt;
:* [[media:tty_rs485_test_v1.1.zip | tty_rs485_test_v1.1.c &amp;amp; tty_rs485_flags_v1.0.c]]&lt;br /&gt;
&lt;br /&gt;
=== CAN interface ===&lt;br /&gt;
:&#039;&#039;&#039;Setup CAN interface with baudrate 500kbit/sec.&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;ip link set can0 up type can bitrate 500000&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Start to listen on CAN port&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;candump can0&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Send test message&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;cansend can0 100#11.2233.44556677.88&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Deinitialize CAN port&#039;&#039;&#039;&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;tt&amp;gt;&#039;&#039;ip link set can0 down&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UART Interfaces ===&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM UART 1 ||&amp;lt;tt&amp;gt;/dev/ttySTM0&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM UART 2 ||&amp;lt;tt&amp;gt;/dev/ttySTM2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM UART 3 ||&amp;lt;tt&amp;gt;/dev/ttySTM1&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=== I2C Interfaces ===&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 400px&amp;quot;&lt;br /&gt;
 ||DHCOM I2C 1||&amp;lt;tt&amp;gt;/dev/i2c-1&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||DHCOM I2C 2 ||&amp;lt;tt&amp;gt;/dev/i2c-0&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |-&lt;br /&gt;
 ||On Module Devices ||&amp;lt;tt&amp;gt;/dev/i2c-2&amp;lt;/tt&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
==== &#039;&#039;&#039;USB 1.1 problems: Custom board without USB 2.0 hub inbetween the MP1 USB host port?&#039;&#039;&#039; ====&lt;br /&gt;
And in that case, have a look at arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi and how the OHCI (!) is enabled there. And of course, make sure the kernel config options are enabled accordingly (like for the PicoITX machine)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | style=&amp;quot;width: 100%; color: #000000; background: #FFFFFF;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;meta-dhsom-stm32-bsp$ git grep OHCI&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; | style=&amp;quot;width: 100%; color: #000000; background: #FFFFFF;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;tt&amp;gt;recipes-kernel/linux/linux-stable/5.10/dh-stm32mp1-common/dh-stm32mp1-dhsom-common.cfg:CONFIG_USB_OHCI_HCD=y&amp;lt;/tt&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;recipes-kernel/linux/linux-stable/5.10/dh-stm32mp1-common/dh-stm32mp1-dhsom-common.cfg:CONFIG_USB_OHCI_HCD_PLATFORM=y&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi snippet:&lt;br /&gt;
 &amp;amp;usbh_ehci {&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbh_ohci { // &amp;lt;---------------- HERE&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbotg_hs {&lt;br /&gt;
          dr_mode = &amp;quot;otg&amp;quot;;&lt;br /&gt;
          pinctrl-0 = &amp;lt;&amp;amp;usbotg_hs_pins_a&amp;gt;;&lt;br /&gt;
          pinctrl-names = &amp;quot;default&amp;quot;;&lt;br /&gt;
          phy-names = &amp;quot;usb2-phy&amp;quot;;&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port1 0&amp;gt;;&lt;br /&gt;
          vbus-supply = &amp;lt;&amp;amp;vbus_otg&amp;gt;;&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc {&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port0 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port1 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;System stability or USB Host problems?&#039;&#039;&#039; ====&lt;br /&gt;
If a display with higher resolution and pixel clock &amp;gt; 48 MHz is used, then this can case USB host and/or system stability problems.&lt;br /&gt;
&lt;br /&gt;
Workaround:&lt;br /&gt;
The OSPEEDR must be set to OSPEEDR = 1 for LCD_CLK and OSPEEDR = 0 for all other LTDC signals.&lt;br /&gt;
 &amp;amp;pinctrl {&lt;br /&gt;
 	ltdc_pins_ customhmi: ltdc-dh-1 {&lt;br /&gt;
 		pins1 {&lt;br /&gt;
 			pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 14, AF14)&amp;gt;; /* LCD_CLK */&lt;br /&gt;
 			bias-disable;&lt;br /&gt;
 			drive-push-pull;&lt;br /&gt;
 			&#039;&#039;&#039;slew-rate = &amp;lt;1&amp;gt;;&#039;&#039;&#039;&lt;br /&gt;
 		};&lt;br /&gt;
 		pins2 {&lt;br /&gt;
 				pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 12, AF14)&amp;gt;, /* LCD_HSYNC */&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;I&#039;, 13, AF14)&amp;gt;, /* LCD_VSYNC */&lt;br /&gt;
                                  ...&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;K&#039;,  6, AF14)&amp;gt;; /* LCD_B7 */&lt;br /&gt;
 			bias-disable;&lt;br /&gt;
 			drive-push-pull;&lt;br /&gt;
 			&#039;&#039;&#039;slew-rate = &amp;lt;0&amp;gt;;&#039;&#039;&#039;&lt;br /&gt;
 		};&lt;br /&gt;
 	};&lt;br /&gt;
 	&lt;br /&gt;
 	ltdc_sleep_pins_ customhmi: ltdc-sleep-dh-1 {&lt;br /&gt;
 		pins {&lt;br /&gt;
 			pinmux = &amp;lt;STM32_PINMUX(&#039;I&#039;, 14, ANALOG)&amp;gt;, /* LCD_CLK */&lt;br /&gt;
                                  ...&lt;br /&gt;
 				 &amp;lt;STM32_PINMUX(&#039;K&#039;,  6, ANALOG)&amp;gt;; /* LCD_B7 */&lt;br /&gt;
 		};&lt;br /&gt;
 	};	&lt;br /&gt;
 };&lt;br /&gt;
==== &#039;&#039;&#039;USB OTG: Custom board where the USB-OTG port is only used as host?&#039;&#039;&#039; ====&lt;br /&gt;
&lt;br /&gt;
On the DHCOM standard, the second USB port of the STM32MP1 is usually an USB-OTG port. If you have a custom board where you want to use the USB-OTG port in host mode only, you should consider the following:&lt;br /&gt;
&lt;br /&gt;
The USB-OTG controller on the STM32MP1, DWC2, does support host mode but is rather inefficient (in comparison to a dedicated USB host controller). The following block diagram shows, that it is possible on the STM32MP1 to alter the pinmuxing, so that the USB-OTG port is used with the USB Host controller of the STM32MP1 (instead of using the DWC2 OTG controller):   &lt;br /&gt;
&lt;br /&gt;
    Host port#1: EHCI/OHCI controller _________ HS PHY port #1 (SoC balls D+/D- #1)&lt;br /&gt;
       &lt;br /&gt;
       &lt;br /&gt;
    Host port#2: EHCI/OHCI controller __ &lt;br /&gt;
                                         \   &lt;br /&gt;
                                         |_____ HS PHY port #2 (SoC balls D+/D- #2)&lt;br /&gt;
    DWC2 OTG controller_________________/|&lt;br /&gt;
                                         |&lt;br /&gt;
            UTIM switch__________________|&lt;br /&gt;
&lt;br /&gt;
This change can be made in the device tree with disabling the DWC2 controller and adding the second usb_phyc port to the nodes of usbh_ehci and (if applicable) usbh_ohci. These nodes are usually in the .dtsi file of the board (e.g. for the PicoITX: arch/arm/boot/dts/stm32mp15xx-dhcom-picoitx.dtsi). Here a is snippet how this could look like:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;usbh_ehci {&lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;&#039;&#039;&#039;, &amp;lt;&amp;amp;usbphyc_port1 1&amp;gt;&#039;&#039;&#039;; // &amp;lt;-------- HERE&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbh_ohci { &lt;br /&gt;
          phys = &amp;lt;&amp;amp;usbphyc_port0&amp;gt;&#039;&#039;&#039;, &amp;lt;&amp;amp;usbphyc_port1 1&amp;gt;&#039;&#039;&#039;; // &amp;lt;-------- HERE&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbotg_hs {&lt;br /&gt;
          &#039;&#039;&#039;status = &amp;quot;disabled&amp;quot;;&#039;&#039;&#039; // &amp;lt;-------- HERE&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc {&lt;br /&gt;
          status = &amp;quot;okay&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port0 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;usbphyc_port1 {&lt;br /&gt;
          phy-supply = &amp;lt;&amp;amp;vdd_usb&amp;gt;;&lt;br /&gt;
          vdda1v1-supply = &amp;lt;&amp;amp;reg11&amp;gt;;&lt;br /&gt;
          vdda1v8-supply = &amp;lt;&amp;amp;reg18&amp;gt;;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;How to try QtWebengine&#039;&#039;&#039; ====&lt;br /&gt;
The QtWebengine is part of the DH default images. &lt;br /&gt;
Please stop the Weston desktop, before the start of the Browser.&lt;br /&gt;
 Older images: &amp;quot;systemctl stop weston@root.service&amp;quot;  &lt;br /&gt;
 Newer images: &amp;quot;systemctl stop weston.service&amp;quot;&lt;br /&gt;
How to start the Browser:&lt;br /&gt;
 QT_QPA_PLATFORM=eglfs QT_QPA_EGLFS_ALWAYS_SET_MODE=1 QT_QPA_EGLFS_KMS_CONFIG=/etc/default/qt5-eglfs-kms.json qtwebengine-minimal http://YOUR-TEST-PAGE/ --no-sandbox&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;How is the Webbrowser Perfomance on the STM32MP1?&#039;&#039;&#039; ====&lt;br /&gt;
[https://wiki.dh-electronics.com/index.php/STM32MP1_Browser_Performance STM32MP1 Browser Performance]&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=Avenger96&amp;diff=3455</id>
		<title>Avenger96</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=Avenger96&amp;diff=3455"/>
		<updated>2021-09-15T07:21:24Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* DH Mainline based Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Avenger96 board is the official DHCOR STM32MP1 reference design!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|__TOC__&lt;br /&gt;
|[[Image:Avenger96Board.png|600px|COM Avenger96Board]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The AVENGER Board is a 96Boards compliant consumer edition board based on the STM32MP15 series of SoCs. The STM32MP15 series &lt;br /&gt;
is a highly integrated multi-market applications processor designed to enable secure and portable applications within the Internet of Things. &lt;br /&gt;
AVENGER board features Dual-core Arm® Cortex®-A7 processors operating at up to 650 MHz, Single core Arm® Cortex® M4 operating up to &lt;br /&gt;
209 MHz. In addition, an extensive set of interfaces and connectivity peripherals are included to interface to cameras, touch-screen displays, &lt;br /&gt;
MMC/SD cards and media processor engine. It also fully supports wireless communication, including WLAN and BLE.&lt;br /&gt;
&lt;br /&gt;
== Technical Details ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=&amp;quot;center&amp;quot; |  style=&amp;quot;width: 100%; color: #000000; background: #f3f3f3;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 50%; background: #076b8d; border: 0pt;&amp;quot; | &lt;br /&gt;
| style=&amp;quot;width: 50%; background: #076b8d; border: 0pt;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; style=&amp;quot;border: 0pt;&amp;quot; | &lt;br /&gt;
* &#039;&#039;&#039;STM32MP157AAC&lt;br /&gt;
**2x ARM® Cortex-A7 up to 650 MHz&lt;br /&gt;
**1x ARM® Cortex-M4 up to 209 MHz &lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;GPU&#039;&#039;&#039; 1x 3D GPU Vivante®  @ 533 MHz - OpenGL® ES 2.0&lt;br /&gt;
*&#039;&#039;&#039;PMIC&#039;&#039;&#039; STPMIC1A&lt;br /&gt;
*&#039;&#039;&#039;DDR3 DRAM&#039;&#039;&#039; 1024 Mbyte  @ 533 MHz&lt;br /&gt;
*&#039;&#039;&#039;eMMC Flash&#039;&#039;&#039; 8 Gbyte, v4.51 interface&lt;br /&gt;
*&#039;&#039;&#039;NOR Flash&#039;&#039;&#039; 2 Mbyte, Quad SPI interface&lt;br /&gt;
*&#039;&#039;&#039;EEPROM&#039;&#039;&#039; 128 byte&lt;br /&gt;
*&#039;&#039;&#039;microSD Socket&#039;&#039;&#039; UHS-I speed grade, v3.01&lt;br /&gt;
*&#039;&#039;&#039;USB Host&#039;&#039;&#039; 2x type A, 2.0 high-speed&lt;br /&gt;
*&#039;&#039;&#039;USB OTG&#039;&#039;&#039; 1x type micro-AB, 2.0 high-speed&lt;br /&gt;
*&#039;&#039;&#039;HDMI&#039;&#039;&#039; WXGA (1366x768) @ 60 fps, HDMI 1.4&lt;br /&gt;
*&#039;&#039;&#039;WiFi / Bluetooth&#039;&#039;&#039; &lt;br /&gt;
**WiFi 5 GHz &amp;amp; 2.4GHz IEEE 802.11a / b / g / n / ac&lt;br /&gt;
**Bluetooth® v4.2 (BR/EDR/BLE)&lt;br /&gt;
**PCB antenna&lt;br /&gt;
*&#039;&#039;&#039;Ethernet&#039;&#039;&#039; 10 / 100 / 1000 Mbit/s, IEEE 802.3-compliant&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; style=&amp;quot;border: 0pt;&amp;quot; |&lt;br /&gt;
*&#039;&#039;&#039;Push-Buttons&#039;&#039;&#039; Power and reset&lt;br /&gt;
*&#039;&#039;&#039;Battery Socket&#039;&#039;&#039; CR1216, CR1220 and CR1225&lt;br /&gt;
*&#039;&#039;&#039;LEDs&#039;&#039;&#039;&lt;br /&gt;
**4x green user controlled LEDs &lt;br /&gt;
**1x blue Bluetooth enabled &lt;br /&gt;
**1x yellow WiFi enabled&lt;br /&gt;
**1x red power supply okay&lt;br /&gt;
*&#039;&#039;&#039;Boot Mode&#039;&#039;&#039; 3 bit boot mode switch&lt;br /&gt;
*&#039;&#039;&#039;Debug Interface&#039;&#039;&#039; JTAG interface via tag-connect&lt;br /&gt;
*&#039;&#039;&#039;Supply (SYS_DCIN)&#039;&#039;&#039; 8 - 18 VDC&lt;br /&gt;
*&#039;&#039;&#039;Temperature Range&#039;&#039;&#039; 0 - 40 °C&lt;br /&gt;
*&#039;&#039;&#039;Dimensions &#039;&#039;&#039; 100 x 85 mm&lt;br /&gt;
*&#039;&#039;&#039;Serial Peripherals&#039;&#039;&#039;  &lt;br /&gt;
**2 x UART&lt;br /&gt;
**2 x I2C&lt;br /&gt;
**1 x I2S&lt;br /&gt;
**1 x SPI&lt;br /&gt;
**1 x GPIOs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[media:DOC_Getting-Started-588-200_R03_2020-05-29.pdf|Avenger96 588-200 Getting-Started R03]]&lt;br /&gt;
* [[media:USM_DHCOR-STM32MP1_R05_2019-12-12.pdf|&#039;&#039;&#039;NEW&#039;&#039;&#039; DHCOR STM32MP1 User Manual R05 &amp;lt;span style=&amp;quot;color:#FF0000&amp;quot;&amp;gt;&#039;&#039;&#039;IMPORTANT: Please have a look at NEW chapter 24. Hardware design checklist&#039;&#039;&#039;&amp;lt;/span&amp;gt;]]&lt;br /&gt;
:&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Please also have a look at the STM32 MPU wiki: [[Avenger96#Links | Links]]&lt;br /&gt;
&lt;br /&gt;
== Design Files ==&lt;br /&gt;
* [[media:SCH_588-200-HS00008-public_R07_2019-08-01.pdf|Avenger96 Schematic]]&lt;br /&gt;
* [[media:BOM_588-200-HS00008-public_R07_2019-08-01.xlsx|Avenger96 Bill of Material]]&lt;br /&gt;
* [[media:588-200_TOP_ASSEMBLY__R04_2019-04-12.pdf|Avenger96 Assembly Top]]&lt;br /&gt;
* [[media:588-200_BOTTOM_ASSEMBLY__R04_2019-04-12.pdf|Avenger96 Assembly Bottom]]&lt;br /&gt;
* [[media:BRD_588-200-with-DHCOR_2020-06-22.STEP|Avenger96 3D STEP file]]&lt;br /&gt;
* [[media:DHCOR-STM32MP1-Design-Symbols_2019-10-16.zip|DHCOR STM32MP1 Allegro/Orcad schematic and layout symbols (release date: 16.10.2019) &#039;&#039;&#039;Now with Allegro *.brd file and 3D information&#039;&#039;&#039;]]&lt;br /&gt;
* [[media:DHCOR_STM32MP1_3D_STEP_586-100_R02.zip|DHCOR STM32MP1 3D STEP file]]&lt;br /&gt;
* [[media:DHCOR-PinMux-TFBGA361-Avenger96-HW200_2019-05-03.zip|Avenger96 CubeMX configuration (release date: 03.05.2019)]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
=== DH Mainline based Linux ===&lt;br /&gt;
:&#039;&#039;&#039;Notes:&#039;&#039;&#039; &lt;br /&gt;
:- The Mainline based Linux offers Etnaviv GPU driver support!!!&lt;br /&gt;
:- Based on &#039;&#039;&#039;kernel 5.10.x&#039;&#039;&#039; and Yocto version dunfell&lt;br /&gt;
* [https://github.com/dh-electronics/dhcom_stm32mp1-bsp-platform Yocto meta layer --&amp;gt; Github]&lt;br /&gt;
* [[media:2021-02-09-dh-image-demo-dh-stm32mp1-dhcor-common-avenger96.wic.xz|&#039;&#039;&#039;NEW&#039;&#039;&#039; DH Mainline based Starter Image 2021-02-09 (based on 5.10 kernel)]]&lt;br /&gt;
* [[DHCOR_STM32MP1_Linux| Linux and bootloader documentation]]&lt;br /&gt;
:&amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;&#039;&#039;&#039;NEW How to start with custom DHCOR design?&#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
:The patch below is an example patch which applies on top of u-boot v2021.01 and implements a custom board derived from 3V3 option of DHCOR STM32MP1 SoM. That&#039;s pretty much all you have to change to implement the board. But, please tweak the DTs esp. where there are the FIXME comments.&lt;br /&gt;
:[[media:0001-ARM-dts-stm32-Add-DHCOR-based-FOO-board-u-boot-v2021.01.patch|&#039;&#039;&#039;NEW&#039;&#039;&#039; 0001-ARM-dts-stm32-Add-DHCOR-based-FOO-board-u-boot-v2021.01.patch]]&lt;br /&gt;
* [https://wiki.dh-electronics.com/index.php/STM32MP1_Browser_Performance STM32MP1 Browser Performance]&lt;br /&gt;
&lt;br /&gt;
=== OpenSTLinux ===&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#800000&amp;quot;&amp;gt; &#039;&#039;&#039;!!! This project is not longer maintenanced !!! --&amp;gt; Please use the &amp;quot;DH Mainline based Linux&amp;quot; version from DH electronics&#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
:&#039;&#039;&#039;Notes:&#039;&#039;&#039; &lt;br /&gt;
:- Based on OpenSTLinux v2.1&lt;br /&gt;
:- GPU support based on original vivante GPU driver.&lt;br /&gt;
:- Based on kernel 5.4.x and Yocto version dunfell&lt;br /&gt;
* [https://github.com/dh-electronics/manifest-av96 Yocto meta layer --&amp;gt; Github]&lt;br /&gt;
:DH electronics Github contains the meta-av96 layer for ST SDK. Please see readme.txt which describes the build process.&lt;br /&gt;
&lt;br /&gt;
* [[media:Avenger96_v6.9_2020-03-28.img.zip|OpenSTLinux-2.1 based on Yocto Dunfell LTS and Linux 5.4.56 - v6.9 Starter Image]] (Supported by Arrow Electronics) &lt;br /&gt;
:[[Starter Image Changelog]]&lt;br /&gt;
: This Image includes four different bootmodes to support some additional mezzanine boars. [https://wiki.dh-electronics.com/index.php/Starter_Image_Bootmode Click here to learn, how to change them.]&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;X-LINUX-AI OpenSTLinux Expansion Package:&#039;&#039;&#039; Description: Expansion Package that targets artificial intelligence for STM32MP1 Series devices.&lt;br /&gt;
* [https://wiki.st.com/stm32mpu/wiki/X-LINUX-AI_OpenSTLinux_Expansion_Package &#039;&#039;&#039;NEW&#039;&#039;&#039; X-LINUX-AI OpenSTLinux Expansion Package]&lt;br /&gt;
* [https://wiki.st.com/stm32mpu/wiki/How_to_install_X-LINUX-AI_v2.0.0_on_Avenger96_board &#039;&#039;&#039;NEW&#039;&#039;&#039; How to install X-LINUX-AI v2.0.0 on Avenger96 board]&lt;br /&gt;
&lt;br /&gt;
=== Debian ===&lt;br /&gt;
* [http://releases.linaro.org/96boards/avenger96/ Debian Buster Starter Image]&lt;br /&gt;
&lt;br /&gt;
== Useful instructions ==&lt;br /&gt;
&lt;br /&gt;
==== SPI Flash and eMMC Image Programming ====&lt;br /&gt;
*[[Avenger96 Image Programming | Avenger96 Image Programming]]&lt;br /&gt;
&lt;br /&gt;
== Mezzanine Boards by DH electronics ==&lt;br /&gt;
&lt;br /&gt;
==== DSI Display Adaptor Board ====&lt;br /&gt;
[[File:DSI Display Adaptor Board.jpg|thumb|DSI Display Adaptor Board]]&lt;br /&gt;
You can easily add an DSI display to your Avenger96 with the help of the DSI Display Adaptor Board. &lt;br /&gt;
The display can be activated easily on our Mainline Image with a device tree overlay as described [[DHCOR_STM32MP1_Linux| here]]. &lt;br /&gt;
To get one of the boards, simply reach out to us and we&#039;ll prepare one for you.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [https://wiki.st.com/stm32mpu/wiki/Main_Page STM32 MPU wiki]&lt;br /&gt;
* [https://wiki.st.com/stm32mpu/wiki/Category:Device_tree_configuration STM32 MPU wiki - Device tree configuration]&lt;br /&gt;
* [https://wiki.st.com/stm32mpu/index.php/STM32MP15_resources STM32MP15 resources]&lt;br /&gt;
* [https://www.96boards.org/ 96Boards]&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3453</id>
		<title>XLON</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3453"/>
		<updated>2021-09-06T13:44:28Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* XLON Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000; border-spacing: 2px; border: 1px solid darkgray;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:XLON Logo in Schwarz von SD Kopie.jpg|400px|XLON]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:LOGO_DH_electronics.jpg|180px|DH electronics]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
== XLON products ==&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:XLON U10.png|100px|XLON U10|link=]]&lt;br /&gt;
|&lt;br /&gt;
*&#039;&#039;&#039;[[XLON U10]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware Development ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software Development ==&lt;br /&gt;
The XLON Uxx LonWorks interfaces come with two different flavours of configuration:&lt;br /&gt;
# Vendor mode - does not appear as a serial port in the system.&lt;br /&gt;
# CDC/ACM mode - appears as a (virtual) serial port in the system.&lt;br /&gt;
This configuration can be replaced using xlon-util tool.&lt;br /&gt;
&lt;br /&gt;
=== XLON Tools ===&lt;br /&gt;
With the following links you can download the xlon-util for different architectures:&lt;br /&gt;
* [[media:AAAu48iSX_j4TVGTrvtwGuqja|xlon-util packages]]&lt;br /&gt;
:  The xlon-util packages containes the xlon-util to configure the xlon-u10. It also contains the xlon-api libs to integrate the xlon-util functionality into a custom application.&lt;br /&gt;
* [[media:AAA8eq-wtunWfVFSOihXnh57a|dependency packages]]&lt;br /&gt;
:  The dependency packages contains libraries which are not in the debian repositories.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|development packages]]&lt;br /&gt;
:  The development packages contains the api header files to compile a custom application with the xlon-api libs.&lt;br /&gt;
&lt;br /&gt;
=== Windows Drivers ===&lt;br /&gt;
Drivers for various 32- and 64-Bit versions of Windows operating system:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Vendor mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86.zip|XLON-2G-Win7-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64.zip|XLON-2G-Win7-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86.zip|XLON-2G-Win8-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64.zip|XLON-2G-Win8-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86.zip|XLON-2G-Win8.1-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64.zip|XLON-2G-Win8.1-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86.zip|XLON-2G-Win10-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64.zip|XLON-2G-Win10-x64.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+CDC/ACM mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86-cdc-acm.zip|XLON-2G-Win7-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64-cdc-acm.zip|XLON-2G-Win7-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86-cdc-acm.zip|XLON-2G-Win8-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64-cdc-acm.zip|XLON-2G-Win8-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86-cdc-acm.zip|XLON-2G-Win8.1-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64-cdc-acm.zip|XLON-2G-Win8.1-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86-cdc-acm.zip|XLON-2G-Win10-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64-cdc-acm.zip|XLON-2G-Win10-x64-cdc-acm.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039;: If you experience an error about missing &#039;Microsoft Visual C 2010 redistributable&#039; when starting xlon_util.exe, &lt;br /&gt;
please download it from the [https://www.microsoft.com/de-de/download/details.aspx?id=5555 Microsoft site].&lt;br /&gt;
&lt;br /&gt;
== [[FAQ_General |&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;FAQ&amp;lt;/span&amp;gt;]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Series Manufacturing ==&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3452</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3452"/>
		<updated>2021-08-23T07:56:43Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
With the Chrome Profiler one can make following conclusions:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube does not even show up on the screen.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Software Rendering (with no GPU) is no option on the STM32MP1 for graphical webinterfaces were responsiveness is required.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3451</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3451"/>
		<updated>2021-08-23T07:55:19Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Webgl example (aquarium) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube does not even show up on the screen.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Software Rendering (with no GPU) is no option on the STM32MP1 for graphical webinterfaces were responsiveness is required.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3410</id>
		<title>XLON</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=XLON&amp;diff=3410"/>
		<updated>2021-07-05T15:09:47Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* XLON Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000; border-spacing: 2px; border: 1px solid darkgray;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%; text-align: center;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 25%; text-align: center;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:XLON Logo in Schwarz von SD Kopie.jpg|400px|XLON]]&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; | [[Image:LOGO_DH_electronics.jpg|180px|DH electronics]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; color: #000000;&amp;quot; valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;| &lt;br /&gt;
&lt;br /&gt;
== XLON products ==&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:XLON U10.png|100px|XLON U10|link=]]&lt;br /&gt;
|&lt;br /&gt;
*&#039;&#039;&#039;[[XLON U10]]&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hardware Development ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software Development ==&lt;br /&gt;
The XLON Uxx LonWorks interfaces come with two different flavours of configuration:&lt;br /&gt;
# Vendor mode - does not appear as a serial port in the system.&lt;br /&gt;
# CDC/ACM mode - appears as a (virtual) serial port in the system.&lt;br /&gt;
This configuration can be replaced using xlon-util tool.&lt;br /&gt;
&lt;br /&gt;
=== XLON Tools ===&lt;br /&gt;
With the following links you can download the xlon-util for different architectures:&lt;br /&gt;
* [[media:AAAu48iSX_j4TVGTrvtwGuqja|xlon-util packages]]&lt;br /&gt;
:  The xlon-util packages containes the xlon-util to configure the xlon-u10. It also contains the xlon-api libs to integrate the xlon-util functionality into a custom application.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|dependency packages]]&lt;br /&gt;
:  The dependency packages contains libraries which are not in the debian repositories.&lt;br /&gt;
* [[media:AADI1WNNbNVhxeswBt43cWKMa|development packages]]&lt;br /&gt;
:  The development packages contains the api header files to compile a custom application with the xlon-api libs.&lt;br /&gt;
&lt;br /&gt;
=== Windows Drivers ===&lt;br /&gt;
Drivers for various 32- and 64-Bit versions of Windows operating system:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Vendor mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86.zip|XLON-2G-Win7-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64.zip|XLON-2G-Win7-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86.zip|XLON-2G-Win8-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64.zip|XLON-2G-Win8-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86.zip|XLON-2G-Win8.1-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64.zip|XLON-2G-Win8.1-x64.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86.zip|XLON-2G-Win10-x86.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64.zip|XLON-2G-Win10-x64.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+CDC/ACM mode Drivers&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!CPU x86&lt;br /&gt;
!CPU x64:&lt;br /&gt;
|-&lt;br /&gt;
!Windows 7&lt;br /&gt;
|[[media:XLON-2G-Win7-x86-cdc-acm.zip|XLON-2G-Win7-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win7-x64-cdc-acm.zip|XLON-2G-Win7-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8&lt;br /&gt;
|[[media:XLON-2G-Win8-x86-cdc-acm.zip|XLON-2G-Win8-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8-x64-cdc-acm.zip|XLON-2G-Win8-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 8.1&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x86-cdc-acm.zip|XLON-2G-Win8.1-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win8.1-x64-cdc-acm.zip|XLON-2G-Win8.1-x64-cdc-acm.zip]]&lt;br /&gt;
|-&lt;br /&gt;
!Windows 10&lt;br /&gt;
|[[media:XLON-2G-Win10-x86-cdc-acm.zip|XLON-2G-Win10-x86-cdc-acm.zip]]&lt;br /&gt;
|[[media:XLON-2G-Win10-x64-cdc-acm.zip|XLON-2G-Win10-x64-cdc-acm.zip]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039;: If you experience an error about missing &#039;Microsoft Visual C 2010 redistributable&#039; when starting xlon_util.exe, &lt;br /&gt;
please download it from the [https://www.microsoft.com/de-de/download/details.aspx?id=5555 Microsoft site].&lt;br /&gt;
&lt;br /&gt;
== [[FAQ_General |&amp;lt;span style=&amp;quot;color:black;&amp;quot;&amp;gt;FAQ&amp;lt;/span&amp;gt;]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Series Manufacturing ==&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10_1.9%2Bdeb10_armhf.zip&amp;diff=3409</id>
		<title>File:Xlon-u10 1.9+deb10 armhf.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10_1.9%2Bdeb10_armhf.zip&amp;diff=3409"/>
		<updated>2021-07-05T14:35:12Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10_1.9%2Bdeb9_amd64.zip&amp;diff=3408</id>
		<title>File:Xlon-u10 1.9+deb9 amd64.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10_1.9%2Bdeb9_amd64.zip&amp;diff=3408"/>
		<updated>2021-07-05T14:34:34Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-dev_1.9_win.zip&amp;diff=3407</id>
		<title>File:Xlon-u10-dev 1.9 win.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-dev_1.9_win.zip&amp;diff=3407"/>
		<updated>2021-07-05T14:34:17Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-dev_1.9.zip&amp;diff=3406</id>
		<title>File:Xlon-u10-dev 1.9.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-dev_1.9.zip&amp;diff=3406"/>
		<updated>2021-07-05T14:34:07Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-1.9-x64.zip&amp;diff=3405</id>
		<title>File:Xlon-u10-1.9-x64.zip</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Xlon-u10-1.9-x64.zip&amp;diff=3405"/>
		<updated>2021-07-05T14:33:53Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3373</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3373"/>
		<updated>2021-06-02T07:44:00Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube does not even show up on the screen.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Software Rendering (with no GPU) is no option on the STM32MP1 for graphical webinterfaces were responsiveness is required.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3372</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3372"/>
		<updated>2021-06-02T07:28:23Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests with software renderning (without GPU) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube does not even show up on the screen.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Software Rendering (with no GPU) is no option on the STM32MP1 for graphical webinterfaces were responsiveness is required.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3371</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3371"/>
		<updated>2021-06-02T07:25:40Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests with software renderning (without GPU) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube does not even show up on the screen.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3370</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3370"/>
		<updated>2021-06-02T07:24:19Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests with hardware acceleration (etnaviv) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 3D-animation and video as texture ===&lt;br /&gt;
[[File:3danimation.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
The cube runs very smooth with at least 40fps.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:3danimation.png&amp;diff=3369</id>
		<title>File:3danimation.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:3danimation.png&amp;diff=3369"/>
		<updated>2021-06-02T07:17:46Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3368</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3368"/>
		<updated>2021-06-02T07:10:05Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Heavy WebGL applications are not suited for this platform.&amp;lt;br&amp;gt;&lt;br /&gt;
Nevertheless appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3367</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3367"/>
		<updated>2021-06-02T07:03:47Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3366</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3366"/>
		<updated>2021-06-02T07:02:55Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC. Appealing web pages with responsive requirements on the STM32MP1 are possible.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3365</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3365"/>
		<updated>2021-06-02T06:58:58Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests with hardware acceleration (etnaviv) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3364</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3364"/>
		<updated>2021-06-02T06:57:29Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3363</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3363"/>
		<updated>2021-06-02T06:56:28Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3362</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3362"/>
		<updated>2021-06-02T06:56:00Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests with software renderning (without GPU) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3361</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3361"/>
		<updated>2021-06-02T06:49:08Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3360</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3360"/>
		<updated>2021-06-02T06:48:57Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /*  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with software renderning (without GPU) ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3359</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3359"/>
		<updated>2021-06-02T06:48:08Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3358</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3358"/>
		<updated>2021-06-02T06:47:23Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Performance Tests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests with hardware acceleration (etnaviv) ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3357</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3357"/>
		<updated>2021-06-02T06:45:31Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Webgl example (aquarium) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
http://webglsamples.org/aquarium/aquarium.html?numFish=1&amp;amp;canvasWidth=800&amp;amp;canvasHeight=480&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &#039;&#039;&#039;3fps&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3356</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3356"/>
		<updated>2021-06-02T06:42:56Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Webgl example (aquarium) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
[[File:Webgl aquarium.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
Running a webgl example page (fishtank) on the STM32MP1 (etnaviv) with Chromium under a resolution of 800x600 results in &lt;br /&gt;
{|&lt;br /&gt;
3fps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=File:Webgl_aquarium.png&amp;diff=3355</id>
		<title>File:Webgl aquarium.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=File:Webgl_aquarium.png&amp;diff=3355"/>
		<updated>2021-06-02T06:37:49Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3354</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3354"/>
		<updated>2021-06-02T06:36:39Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Glmark2 Benchmark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following results:&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3353</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3353"/>
		<updated>2021-06-02T06:36:06Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Glmark2 Benchmark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
A Glmark2 Benchmark was run on the STM32MP1 with an 800x600 resolution with the following command:&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
 root@dh-stm32mp1-dhcom-pdk2:~# glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
 =======================================================&lt;br /&gt;
     glmark2 2017.07&lt;br /&gt;
 =======================================================&lt;br /&gt;
     OpenGL Information&lt;br /&gt;
     GL_VENDOR:     etnaviv&lt;br /&gt;
     GL_RENDERER:   Vivante GC400 rev 4652&lt;br /&gt;
     GL_VERSION:    OpenGL ES 2.0 Mesa 20.2.2 (git-df2977f871)&lt;br /&gt;
 =======================================================&lt;br /&gt;
 [build] use-vbo=false: FPS: 182 FrameTime: 5.495 ms&lt;br /&gt;
 [build] use-vbo=true: FPS: 221 FrameTime: 4.525 ms&lt;br /&gt;
 [texture] texture-filter=nearest: FPS: 176 FrameTime: 5.682 ms&lt;br /&gt;
 [texture] texture-filter=linear: FPS: 174 FrameTime: 5.747 ms&lt;br /&gt;
 [texture] texture-filter=mipmap: FPS: 177 FrameTime: 5.650 ms&lt;br /&gt;
 [shading] shading=gouraud: FPS: 149 FrameTime: 6.711 ms&lt;br /&gt;
 [shading] shading=blinn-phong-inf: FPS: 89 FrameTime: 11.236 ms&lt;br /&gt;
 [shading] shading=phong: FPS: 51 FrameTime: 19.608 ms&lt;br /&gt;
 [shading] shading=cel: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [bump] bump-render=high-poly: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [bump] bump-render=normals: FPS: 141 FrameTime: 7.092 ms&lt;br /&gt;
 [bump] bump-render=height: FPS: 90 FrameTime: 11.111 ms&lt;br /&gt;
 [effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 25 FrameTime: 40.000 ms&lt;br /&gt;
 [effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 4 FrameTime: 250.000 ms&lt;br /&gt;
 [pulsar] light=false:quads=5:texture=false: FPS: 106 FrameTime: 9.434 ms&lt;br /&gt;
 [desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 11 FrameTime: 90.909 ms&lt;br /&gt;
 [desktop] effect=shadow:windows=4: FPS: 54 FrameTime: 18.519 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 31 FrameTime: 32.258 ms&lt;br /&gt;
 [buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 30 FrameTime: 33.333 ms&lt;br /&gt;
 [buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: FPS: 39 FrameTime: 25.641 ms&lt;br /&gt;
 [ideas] speed=duration: FPS: 41 FrameTime: 24.390 ms&lt;br /&gt;
 [jellyfish] &amp;lt;default&amp;gt;: FPS: 21 FrameTime: 47.619 ms&lt;br /&gt;
 Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0&lt;br /&gt;
 [terrain] &amp;lt;default&amp;gt;: Unsupported&lt;br /&gt;
 [shadow] &amp;lt;default&amp;gt;: FPS: 42 FrameTime: 23.810 ms&lt;br /&gt;
 [refract] &amp;lt;default&amp;gt;: FPS: 9 FrameTime: 111.111 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=0: FPS: 103 FrameTime: 9.709 ms&lt;br /&gt;
 [conditionals] fragment-steps=5:vertex-steps=0: FPS: 33 FrameTime: 30.303 ms&lt;br /&gt;
 [conditionals] fragment-steps=0:vertex-steps=5: FPS: 97 FrameTime: 10.309 ms&lt;br /&gt;
 [function] fragment-complexity=low:fragment-steps=5: FPS: 60 FrameTime: 16.667 ms&lt;br /&gt;
 [function] fragment-complexity=medium:fragment-steps=5: FPS: 27 FrameTime: 37.037 ms&lt;br /&gt;
 [loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms&lt;br /&gt;
 [loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 29 FrameTime: 34.483 ms&lt;br /&gt;
 =======================================================&lt;br /&gt;
                                   glmark2 Score: 75&lt;br /&gt;
 =======================================================&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3352</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3352"/>
		<updated>2021-06-02T06:27:53Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* drawElements Quality Program (deqp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 (etnaviv driver) gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3351</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3351"/>
		<updated>2021-06-02T06:27:29Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Glmark2 Benchmark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
{|&lt;br /&gt;
| &lt;br /&gt;
 glmark2-es2-drm --off-screen -s 800x600 --annotate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3350</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3350"/>
		<updated>2021-06-02T06:22:07Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Glmark2 Benchmark ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3349</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3349"/>
		<updated>2021-06-02T06:21:29Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing (deqp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== drawElements Quality Program (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3348</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3348"/>
		<updated>2021-06-02T06:20:14Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing (deqp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3347</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3347"/>
		<updated>2021-06-02T06:16:36Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing (deqp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started from the commandline with the following script (no display needed):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3346</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3346"/>
		<updated>2021-06-02T06:12:16Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing (deqp) ==&lt;br /&gt;
The drawElements Quality Program (deqp) is a benchmarking system for measuring the quality of GPUs and their drivers.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It can be started with the following script:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The deqp run on the STM32MP1 gives the following results:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3345</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3345"/>
		<updated>2021-06-01T14:59:51Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot; line&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Test run totals:  &lt;br /&gt;
        Passed:		1729/1783	97.0%  &lt;br /&gt;
        Failed:		  54/1783       33.0%  &lt;br /&gt;
        Not supported:	   0/1783        0.0%  &lt;br /&gt;
        Warnings:	   0/1783        0.0%&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The full logs can be found here:&amp;lt;br&amp;gt;&lt;br /&gt;
[[media:STM32MP1_deqp_logs.zip|STM32MP1_deqp_logs.zip]]&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3344</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3344"/>
		<updated>2021-06-01T14:47:03Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Functional GPU testing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 export GPU_TESTS=&#039;dEQP-GLES2.performance*&#039;&lt;br /&gt;
 &lt;br /&gt;
 export ETNA_MESA_DEBUG=nir&lt;br /&gt;
 export EGL_PLATFORM=surfaceless&lt;br /&gt;
 export XDG_RUNTIME_DIR=/var/run/user/`id -u`/&lt;br /&gt;
 &lt;br /&gt;
 # Observe that GPU is rendering:&lt;br /&gt;
 # dstat -i -I `grep gpu /proc/interrupts | cut -d : -f 1`&lt;br /&gt;
 &lt;br /&gt;
 cd /usr/share/deqp/gles2/&lt;br /&gt;
 &lt;br /&gt;
 unset LIBGL_ALWAYS_SOFTWARE&lt;br /&gt;
 unset GBM_ALWAYS_SOFTWARE&lt;br /&gt;
 &lt;br /&gt;
 ./deqp-gles2 \&lt;br /&gt;
          --deqp-surface-width=256 \&lt;br /&gt;
          --deqp-surface-height=256 \&lt;br /&gt;
          --deqp-surface-type=pbuffer \&lt;br /&gt;
          --deqp-gl-config-name=rgba8888d24s8ms0 \&lt;br /&gt;
          --deqp-visibility=hidden \&lt;br /&gt;
          --deqp-log-images=enable \&lt;br /&gt;
          --deqp-crashhandler=enable \&lt;br /&gt;
          --deqp-log-filename=hardware.qpa \&lt;br /&gt;
          -n ${GPU_TESTS} 2&amp;gt;&amp;amp;1 | tee hardware.log &lt;br /&gt;
 &lt;br /&gt;
 ../tools/testlog-to-xml hardware.qpa hardware.xml&lt;br /&gt;
 &lt;br /&gt;
 export LIBGL_ALWAYS_SOFTWARE=true &lt;br /&gt;
 &lt;br /&gt;
 # Observe results using a browser, run the following # $ ln -s ../tools/testlog.* .&lt;br /&gt;
 # $ python3 -m http.server \&lt;br /&gt;
 #       --bind 0.0.0.0 \&lt;br /&gt;
 #       --directory /usr/share/deqp/gles2/ 8080&lt;br /&gt;
 # Navigate to http://IP-of-the-board:8080&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3343</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3343"/>
		<updated>2021-06-01T14:37:03Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:- without GPU (Software Rendering)&lt;br /&gt;
:- &amp;lt; 1 fps&lt;br /&gt;
:- too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:- with GPU support&lt;br /&gt;
:- 20 - 30 fps&lt;br /&gt;
:- works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3342</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3342"/>
		<updated>2021-06-01T14:36:41Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;no GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:* without GPU (Software Rendering)&lt;br /&gt;
:* &amp;lt; 1 fps&lt;br /&gt;
:* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;with GPU&#039;&#039;&#039;&lt;br /&gt;
:[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
:* with GPU support&lt;br /&gt;
:* 20 - 30 fps&lt;br /&gt;
:* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3341</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3341"/>
		<updated>2021-06-01T14:36:09Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
* no GPU&lt;br /&gt;
:[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
:https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
:* without GPU (Software Rendering)&lt;br /&gt;
:* &amp;lt; 1 fps&lt;br /&gt;
:* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
==== with GPU ====&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3340</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3340"/>
		<updated>2021-06-01T14:35:40Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
==== no GPU =====&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
==== with GPU ====&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
	<entry>
		<id>https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3339</id>
		<title>STM32MP1 Browser Performance</title>
		<link rel="alternate" type="text/html" href="https://wiki.dh-electronics.com/index.php?title=STM32MP1_Browser_Performance&amp;diff=3339"/>
		<updated>2021-06-01T14:34:17Z</updated>

		<summary type="html">&lt;p&gt;Fgerstandl: /* Line-Chart Demo Application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tasks of the GPU ==&lt;br /&gt;
* For „simple“ webpages without 3D-features, the GPU is only used for „blitting“during a process step called „Raster(ization) and Compositing“&lt;br /&gt;
* „blitting“ = fast copy and move of memory objects&lt;br /&gt;
* By this, a strong relief of the CPU can be achieved&lt;br /&gt;
* this should be well possible with the STM32MP1&lt;br /&gt;
&lt;br /&gt;
== Performance Tests ==&lt;br /&gt;
=== &amp;quot;Infragistics Ignite UI&amp;quot; Demo Application ===&lt;br /&gt;
[[File:Infragistics.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
The &amp;quot;Infragistics Ignite UI&amp;quot; is a commercial WebUI framework based on Angular. &amp;lt;br&amp;gt;&lt;br /&gt;
To test the browser perfomance a WebUI based on that framework was used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:BardiagramIgnite.png|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
To open the screen in the above screenshot it takes approx. 3 seconds from menu click until content is fully visible&lt;br /&gt;
&lt;br /&gt;
To get some insights the chromium profiling was used.&lt;br /&gt;
[[File:ChromeProfilingIgnite.png|frameless]]&lt;br /&gt;
The Chrome Profiler shows following things:&lt;br /&gt;
* the CPU does most of the work&lt;br /&gt;
* there is no obvious point where CPU cycles would be spent excessively (perf doesn&#039;t indicate anything).&lt;br /&gt;
* approx. 70% of the time is spent interpreting Javascript. This is also to be expected, since this angular is full of complex Javascript.&lt;br /&gt;
* But that also means the slowness is caused by the CPU / website&lt;br /&gt;
* not much the GPU can do about this.&lt;br /&gt;
&lt;br /&gt;
=== QOpenGLWidget Example ===&lt;br /&gt;
&lt;br /&gt;
=== Line-Chart Demo Application ===&lt;br /&gt;
The Line-Chart demo application should show the differnces in performance between hardware acceleration and software rendering on the STM32MP1.&lt;br /&gt;
&lt;br /&gt;
==== no GPU ====&lt;br /&gt;
[[File:ChartLineWithoutGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/kprvgowf8kzod6a/ohne_GPU.MP4?dl=0&lt;br /&gt;
&lt;br /&gt;
* without GPU (Software Rendering)&lt;br /&gt;
* &amp;lt; 1 fps&lt;br /&gt;
* too slow to be usable&lt;br /&gt;
&lt;br /&gt;
==== with GPU ====&lt;br /&gt;
[[File:ChartLineWithGPU.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/323nv90lhp9wh02/mit_GPU.MP4?dl=0 &lt;br /&gt;
&lt;br /&gt;
* with GPU support&lt;br /&gt;
* 20 - 30 fps&lt;br /&gt;
* works very well&lt;br /&gt;
&lt;br /&gt;
=== DH demo from tradeshow ===&lt;br /&gt;
[[File:TradeshowDemo.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
https://www.dropbox.com/s/rzeu2qk95oxy4lw/sensorless_demo_filtered_idastroem_DH%20electronics.mp4?dl=0&lt;br /&gt;
&lt;br /&gt;
=== Webgl example (aquarium) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functional GPU testing ==&lt;br /&gt;
&lt;br /&gt;
== Some Toughts about Javascript performance ==&lt;br /&gt;
====Is it correct, that since js is interpreted and is not thread safe, js of a single webpage does not make use of multithreading/multiprocessing? ====&lt;br /&gt;
JS is interpreted, yes. However, both the chromium v8 engine and firefox tracemonkey are JIT compilers and turn that JS into code native to the architecture on which they are running. This leads to a huge performance boost compared to simple interpreting. The JS JIT compilation can be parallelized.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JS is synchronous and has no concept of threads. However, there are these Promise() things and events (like timer callbacks). The JS engines generally have separate thread(s) to deal with such events, so the JS code can set up some &amp;quot;async&amp;quot; operation by calling a function (e.g. load something from somewhere) that triggers a JS function on completion. What happens is that the JS itself runs on CPU0, while a thread doing that loading runs on CPU1, and suddenly your javascript  uses two CPU cores.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So if you add those two points above together, you get that contemporary JS engines and the way contemporary JS is written end up using multiple CPUs. It is just not done in the traditional manner and it does look like a lot of crutches indeed.&lt;br /&gt;
&lt;br /&gt;
== Profiling with Chrome DevTools ==&lt;br /&gt;
Chrome DevTools is a set of web developer tools built directly into the Google Chrome browser. It is possible to analyse the runtime performance of a website directly on the target or remote with an PC connected over ethernet.&lt;br /&gt;
With an remote connection you can measure the performance without interfering the measurment itself.&lt;br /&gt;
The Chrome DevTools can also be used with an qtWebengine.&lt;br /&gt;
&lt;br /&gt;
=== How to use Chrome DevTools with an remote connection ===&lt;br /&gt;
To be able to remote debug chromium on the target you need to start the chromium or qWebengine with the following parameters:	&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;-remote-debugging-port=9222 --user-data-dir=remote-profile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To access it from a different computer you need to forward the port with ssh:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;ssh -L 0.0.0.0:9223:localhost:9222 localhost -N&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This must be done before the webbrowser gets started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With an Chrome Browser on an computer connected with the target over ethernet you can now open the devtools with the IP of the target and the port &amp;quot;9223&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
This clip shows you how to open den chrome devtools within chrome: [[media:Devtools-open.mp4.mp4|devtools-open.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== DevTools analysis ===&lt;br /&gt;
The following tools can be used for performance anlaysis:&lt;br /&gt;
* CPU Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
:[[File:ChromeDevToolsCPU.png|frameless]]&lt;br /&gt;
:[[media:Devtools-performance-monitor-cpu.mp4|devtools-performance-monitor-cpu.mp4]]&lt;br /&gt;
:With this stat you can easily see when the CPU is under full load.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* GPU Usage:&lt;br /&gt;
:[[File:ChromeDevToolsGPU.png|frameless]]&lt;br /&gt;
:The graph shows when the GPU is under use. But it does not show the GPU load in percent.&amp;lt;br&amp;gt;&lt;br /&gt;
:It is a useful tool to see if the GPU is fully ocupied.&amp;lt;br&amp;gt;&lt;br /&gt;
:If the GPU is disabled (software rendering) this graph is absent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Frame Rendering Stats:&lt;br /&gt;
:[[File:ChromeDevToolsFrameRendering.png|frameless]]&lt;br /&gt;
:Newer chrome versions don&#039;t show live FPS anymore. But you can us &amp;quot;dropped&amp;quot; or &amp;quot;delayed&amp;quot; frames as indicator for good or bad performance. The higher the percentage value (frames rendered in time) the better. &amp;lt;br&amp;gt;&lt;br /&gt;
:A good explanation can be found here:&lt;br /&gt;
:https://groups.google.com/a/chromium.org/g/blink-dev/c/iHULoSyUxOQ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Performance Profile:&lt;br /&gt;
:[[File:ChromedevtoolsPerformanceProfiling.png|frameless]]&lt;br /&gt;
:[[media:Devtools-start-performance-profiling.mp4|devtools-start-performance-profiling.mp4]]&lt;br /&gt;
:The performance profile gives you an overview over all important stats at once. You can record it while browsing through an website on the target.&amp;lt;br&amp;gt;&lt;br /&gt;
:You can save such profiles and import it with any other chrome browser to analyse the profile offline.&lt;br /&gt;
&lt;br /&gt;
== Brief summary ==&lt;br /&gt;
* Webapplications must be optimized for particular embedded system resp. SOC&lt;br /&gt;
* Comprehensive analysis and profiling tools are available&lt;br /&gt;
* Thus, appealing web pages on embedded systems should be possible&lt;br /&gt;
* … where also the “responsiveness&amp;quot; is given&lt;/div&gt;</summary>
		<author><name>Fgerstandl</name></author>
	</entry>
</feed>