summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ludovino <dllud@riseup.net>2019-07-27 05:10:17 +0200
committerDavid Ludovino <dllud@riseup.net>2019-07-27 05:10:17 +0200
commitc5be7ffd5a0e0661a482fbd02f79b6fcde74e159 (patch)
tree2c53f14178c1cfd0a5370a4c74ddb249e77e14eb
downloadgraphics-presentation-c5be7ffd5a0e0661a482fbd02f79b6fcde74e159.tar.gz
graphics-presentation-c5be7ffd5a0e0661a482fbd02f79b6fcde74e159.tar.bz2
graphics-presentation-c5be7ffd5a0e0661a482fbd02f79b6fcde74e159.zip
Initial commitHEADmaster
First version of graphics acceleration presentation. JIT for July 2019 Replicant contributor meeting. Co-authored-by: Ricardo 'Grim' Cabrita <grimkriegor@krutt.org> Signed-off-by: David Ludovino <dllud@riseup.net>
-rw-r--r--.gitignore2
-rw-r--r--COPYING428
-rw-r--r--Makefile16
-rw-r--r--graphics.tex407
-rw-r--r--img/Mesa_layers_of_crap_2016.svg1628
-rw-r--r--img/ape_fwk_graphics.pngbin0 -> 39757 bytes
-rw-r--r--img/glitches.jpgbin0 -> 112262 bytes
-rw-r--r--img/odroid-u_block_diagram.jpgbin0 -> 64468 bytes
8 files changed, 2481 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a53351d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+output/
+svg-inkscape/
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..fd662a7
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,428 @@
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More_considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. Additional offer from the Licensor -- Adapted Material.
+ Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material
+ under the conditions of the Adapter's License You apply.
+
+ c. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter's License You apply must be a Creative Commons
+ license with the same License Elements, this version or
+ later, or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition
+ in any reasonable manner based on the medium, means, and
+ context in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+
+ including for purposes of Section 3(b); and
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public
+licenses. Notwithstanding, Creative Commons may elect to apply one of
+its public licenses to material it publishes and in those instances
+will be considered the “Licensor.” The text of the Creative Commons
+public licenses is dedicated to the public domain under the CC0 Public
+Domain Dedication. Except for the limited purpose of indicating that
+material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the
+public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c1de437
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,16 @@
+TEXFLAGS ?= -halt-on-error -output-format pdf -output-directory output --shell-escape
+TITLE = graphics
+
+.PHONY: all clean
+
+all: output/$(TITLE).pdf
+
+output:
+ mkdir output
+
+output/$(TITLE).pdf: $(TITLE).tex img/Mesa_layers_of_crap_2016.svg output
+ pdflatex $(TEXFLAGS) '\providecommand\locale{en}\input{$(TITLE).tex}'
+ pdflatex $(TEXFLAGS) '\providecommand\locale{en}\input{$(TITLE).tex}'
+
+clean:
+ rm -rf output svg-inkscape
diff --git a/graphics.tex b/graphics.tex
new file mode 100644
index 0000000..aff263a
--- /dev/null
+++ b/graphics.tex
@@ -0,0 +1,407 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Beamer Presentation
+% LaTeX Template
+% Version 1.0 (10/11/12)
+%
+% This template has been downloaded from:
+% http://www.LaTeXTemplates.com
+%
+% License:
+% CC BY-NC-SA 3.0 (http://creativecommons.org/licenses/by-nc-sa/3.0/)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%-------------------------------------------------------------------------------
+% PACKAGES AND THEMES
+%-------------------------------------------------------------------------------
+
+\documentclass[table]{beamer}
+
+\mode<presentation> {
+\usetheme{Madrid}
+ % Replaces footer line with a simple slide count.
+ \setbeamertemplate{footline}[page number]
+ % Remove navigation symbols.
+ \setbeamertemplate{navigation symbols}{}
+}
+
+\usepackage{color}
+% Allows the use of \toprule, \midrule and \bottomrule in tables
+%\usepackage{booktabs}
+\usepackage[utf8]{inputenc}
+%T1 fontenc does not work on Parabola
+%\usepackage[T1]{fontenc}
+\usepackage{datetime}
+\usepackage{listings}
+\usepackage{graphicx}
+\usepackage{svg}
+
+% Use symbols instead of numerals for footnotes.
+\renewcommand{\thefootnote}{\fnsymbol{footnote}}
+% Reset footnote counter every section.
+\makeatletter
+\@addtoreset{footnote}{subsection}
+\makeatother
+
+
+%-------------------------------------------------------------------------------
+% TITLE PAGE
+%-------------------------------------------------------------------------------
+
+% Short title appears at the bottom of every slide.
+% Full title only on the title page.
+\title[graphics]{Graphics acceleration on Replicant}
+
+\author{David Ludovino (@dllud) \and Ricardo Cabrita (@GrimKriegor)\thanks{\footnotesize with great support from Joonas Kylmälä (@Putti)}}
+
+% Your institution as it will appear on the bottom of every slide.
+\institute[NLnet]
+{
+% Your institution for the title page.
+NLnet - NGI0 PET Fund\\
+}
+\newdate{date}{27}{07}{2019}
+\date{\displaydate{date}}
+
+\begin{document}
+
+\begin{frame}
+ % Print the title page as the first slide.
+ \titlepage
+\end{frame}
+
+%-------------------------------------------------------------------------------
+% PRESENTATION SLIDES
+%-------------------------------------------------------------------------------
+
+\section{Motivation}
+\begin{frame}
+ \frametitle{Motivation}
+ All supported devices lack a free software GPU driver.\\\bigskip
+ Replicant 6 relies on libAGL which uses the libpixelflinger software render (both deprecated since 2013).
+\end{frame}
+\begin{frame}
+ \frametitle{Motivation}
+ Lack of GLES 2.0 leads some critical applications to crash (e.g. Firefox)\\\bigskip
+ Rendering performance has degraded throughout Android versions.\\\bigskip
+ Replicant relies on patches to the Android framework to make things like the camera application work.
+\end{frame}
+
+
+\section{Objectives}
+\begin{frame}
+ \frametitle{Objectives}
+ Put together a graphics stack:\\
+ \begin{itemize}
+ \item Compatible with Android 9's HALs.
+ \item Provides at least GLES 2.0.
+ \item Flexible enough to do rendering with both Mesa and SwiftShader.
+ \item Uses hardware rendering on devices with a free GPU driver.
+ \end{itemize}
+\end{frame}
+
+
+\section{Graphics hardware architecture}
+\begin{frame}
+ \Huge{\centerline{Graphics hardware architecture}}
+\end{frame}
+
+\subsection{Exynos 4412 SoC components}
+\begin{frame}
+ \frametitle{Graphics hardware architecture — Exynos 4412 SoC components}
+ \begin{center}
+ \includegraphics[width=0.9\textwidth]{img/odroid-u_block_diagram.jpg}
+ \footnote{Source: Hardkernel Co., Ltd.}
+ \end{center}
+\end{frame}
+
+
+\section{Graphics software architecture}
+\begin{frame}
+ \Huge{\centerline{Graphics software architecture}}
+\end{frame}
+
+\subsection{Android 9 graphics architecture}
+\begin{frame}
+ \frametitle{Graphics software architecture — Android 9}
+ \begin{center}
+ \includegraphics[height=0.8\textheight]{img/ape_fwk_graphics.png}
+ \footnote{Source: Android Open Source Project under CC BY 4.0}
+ \end{center}
+\end{frame}
+
+\subsection{Replicant 9 graphics components}
+\subsubsection{Hardware Composer HAL}
+\begin{frame}
+ \frametitle{Graphics software architecture — Replicant 9 HWC HAL}
+ Hardware Composer HAL: drm\_hwcomposer
+ \begin{itemize}
+ \item Supports HWC2 HAL.
+ \item Works on top of DRM (can use hardware composing acceleration).
+ \item Under active maintenance (hosted by freedesktop.org).
+ \item Also used by Android-x86.\\\bigskip
+ \end{itemize}
+\end{frame}
+
+\subsubsection{Gralloc HAL}
+\begin{frame}
+ \frametitle{Graphics software architecture — Replicant 9 Gralloc HAL}
+ Gralloc HAL: gbm\_gralloc
+ \begin{itemize}
+ \item Implements Android Gralloc HAL API version 0 and 1.
+ \item Compatible with drm\_hwcomposer.
+ \item Compatible with Mesa.
+ \item Uses Mesa's GBM (Generic Buffer Management) for buffer allocation through libgbm. GBM then calls DRM.
+ \item Supports PRIME fd.
+ \item Originally by Rob Herring, now maintained by Android-x86.
+ \end{itemize}
+\end{frame}
+
+\subsubsection{OpenGL ES renderer}
+\begin{frame}
+ \frametitle{Graphics software architecture — Replicant 9 GLES}
+ OpenGL ES renderer: Mesa
+ \begin{itemize}
+ \item Support for both software and hardware rendering.
+ \item Big and active community (maintained for years to come).\\\bigskip
+ \end{itemize}
+ Mesa driver: kms\_swrast
+ \begin{itemize}
+ \item Uses any Gallium software renderer as backend (softpipe or llvmpipe).
+ \item Does mode setting through the kernel (KMS).\\\bigskip
+ \end{itemize}
+ Alternative GLES renderer: SwiftShader
+ \begin{itemize}
+ \item Optimized for ARM CPUs.
+ \item Has Vulkan software rendering.
+ \end{itemize}
+\end{frame}
+
+\section{Implementation}
+\begin{frame}
+ \Huge{\centerline{Implementation}}
+\end{frame}
+
+\subsection{drm\_hwcomposer + gbm\_gralloc}
+\begin{frame}
+ \frametitle{Implementation — drm\_hwcomposer + gbm\_gralloc}
+ Initially both required the use of the drm/exynos master node
+ \begin{enumerate}
+ \item DRM Auth hack (both on /dev/dri/card0)
+ \item DRM vGEM inclusion (gbm\_gralloc on /dev/dri/card1)
+ \item DRM allow dumb buffers (gbm\_gralloc on /dev/dri/renderD128)\\\bigskip
+ \end{enumerate}
+ At the time we had some graphical glitches we thought were due to inter driver memory sync.\\\bigskip
+ Running on the same driver does not require memory synchronization.\\\bigskip
+ Allows drm/exynos to allocate memory where adequate according to the type of plane (primary, overlay or cursor).
+\end{frame}
+
+\subsection{Allow kms\_swrast to use drm/exynos}
+\begin{frame}
+ \frametitle{Implementation — Allow kms\_swrast to use drm/exynos}
+ Small tweak: Add exynos to the kms\_swrast list on external\_mesa3d.\\\bigskip
+ How to upstream this?
+\end{frame}
+
+\subsection{HW planes + devfreq}
+\begin{frame}
+ \frametitle{Implementation — HW planes + devfreq}
+ We were then using kms\_swrast with the softpipe backend.\\\bigskip
+ Enabling DRM hardware planes was another attempt at squeezing some extra performance out of the hardware.\\\bigskip
+ However this led to some interesting shenenigans.
+\end{frame}
+\begin{frame}
+ \frametitle{Implementation — HW planes + devfreq}
+ \begin{center}
+ \includegraphics[width=\textwidth]{img/glitches.jpg}
+ \end{center}
+\end{frame}
+\begin{frame}
+ \frametitle{Implementation — HW planes + devfreq}
+ Tentative explanation by ahajda:
+ \begin{enumerate}
+ \item devfreq lowers display clock frequencies too aggressively.
+ \item DMA transfers of overlays are too slow and result in screen corruption.\\\bigskip
+ \end{enumerate}
+ Temporary fix: disable devfreq.
+\end{frame}
+
+\subsection{Testing software renderers}
+\subsubsection{llvmpipe}
+\begin{frame}
+ \frametitle{Implementation — llvmpipe}
+ kms\_swrast with softpipe was unbearably slow, even with DRM HW planes enabled.\\\bigskip
+ Required:
+ \begin{itemize}
+ \item Finding out what Android-x86 had previously done.
+ \item Porting it to Android 9.
+ \end{itemize}
+\end{frame}
+\begin{frame}
+ \frametitle{Implementation — llvmpipe}
+ android: Enable llvmpipe when using the swrast driver\\
+ https://gitlab.freedesktop.org/mesa/mesa/merge\_requests/1403\\\bigskip
+ android: Fix build with LLVM for Android 9\\
+ https://gitlab.freedesktop.org/mesa/mesa/merge\_requests/1402
+\end{frame}
+
+\subsubsection{SwiftShader}
+\begin{frame}
+ \frametitle{Implementation — SwiftShader}
+ Required:
+ \begin{itemize}
+ \item UDIV and SDIV instruction emulation (in the kernel).
+ \item Android emulator composer: ranchu.
+ \item Default Android gralloc.\\\bigskip
+ \end{itemize}
+ Proved to be 1.5 - 2x faster than llvmpipe.
+\end{frame}
+
+\subsection{Performance}
+\begin{frame}
+ \frametitle{Performance}
+ \centerline{SwiftShader \textgreater{} llvmpipe \textgreater{} softpipe}
+\end{frame}
+
+\subsubsection{SwiftShader with LLVM}
+\begin{frame}[fragile]
+ \frametitle{Performance — SwiftShader with LLVM}
+ We managed to find a SwiftShader revision that uses LLVM as a backend instead of SubZero and is still compatible with our frameworks\_native.\\
+ \lstset{language=C}
+ \begin{lstlisting}
+Lineage 16 / Android 9 / Replicant 9
+SurfaceFlinger: OpenGL ES 2.0 SwiftShader 4.0.0.4
+
+Android Q
+fde88d96a58b92beab76035393b3acd849445160
+Default to LLVM 7.0 JIT in Android build
+SurfaceFlinger: OpenGL ES 3.0 SwiftShader 4.1.0.5
+ \end{lstlisting}
+ No noticeable performance difference.
+\end{frame}
+
+\subsection{Why is Replicant 6 much faster?}
+\begin{frame}
+ \frametitle{Performance — Why is Replicant 6 much faster?}
+ Emulator switches? NO\\
+ ro.kernel.qemu=1\\\bigskip
+ High end graphics options? NO\\
+ ro.config.avoid\_gfx\_accel=1\\\bigskip
+ Pixel format (RGB565)? Paul says YES (very hardware dependent)
+\end{frame}
+
+
+\section{Future}
+\begin{frame}
+ \Huge{\centerline{Future}}
+\end{frame}
+
+\subsection{RGB565 across entire stack}
+\begin{frame}
+ \frametitle{Future — RGB565 across entire stack}
+ \begin{itemize}
+ \item gbm\_gralloc
+ \item drm\_hwcomposer
+ \item drm/exynos\smallskip
+ \end{itemize}
+ All using RGB565.\\~\\
+ Potential performance breakthrough.\\\smallskip
+ If so, how to futureproof this?
+\end{frame}
+
+\subsection{devfreq: which device needs clock boost? enable devfreq}
+\begin{frame}
+ \frametitle{Future — devfreq: which device needs clock boost?}
+ \begin{enumerate}
+ \item Test each device independently through sysfs.
+ \item Identify which one is causing the corruption (tip: FIMD/LCD path).
+ \item Boost clock/voltage on userspace or kernel config.
+ \item Re-enable devfreq.
+ \item Workout patch to fix upstream.
+ \end{enumerate}
+\end{frame}
+
+\subsection{SwiftShader + drm\_hwcomposer}
+\begin{frame}
+ \frametitle{Future — SwiftShader + drm\_hwcomposer}
+ Advantages (vs ranchu):\\
+ \begin{itemize}
+ \item hardware planes
+ \item DRM node instead of direct framebuffer
+ \end{itemize}
+\end{frame}
+
+\subsection{Profiling, benchmarks and conformance}
+\begin{frame}
+ \frametitle{Future — Profiling, benchmarks and conformance}
+ Profiling: turn on profiling switch on Mesa + simpleperf?\\\bigskip
+ Benchmarks: ask Android-x86 (proprietary?)\\\bigskip
+ Conformance: dEQP (drawElements Quality Program) and piglit
+\end{frame}
+
+\subsection{2D acceleration on drm\_hwcomposer}
+\begin{frame}
+ \frametitle{Future — 2D acceleration on drm\_hwcomposer}
+ Software-based: Pixman (has ARM NEON fast path)\\\bigskip
+ Hardware-based: Exynos FIMG2D (Fully Integrated Mobile Graphics 2D)
+\end{frame}
+
+\subsection{SDIV/UDIV on compiler-rt}
+\begin{frame}
+ \frametitle{Future — SDIV/UDIV on compiler-rt}
+ \begin{itemize}
+ \item Patch with kernel emulation of SDIV/UDIV is not optimized.\\\bigskip
+ \item Try compiler-rt's builtins instead.
+ \end{itemize}
+\end{frame}
+
+\subsection{ARM NEON on llvmpipe}
+\begin{frame}[fragile]
+ \frametitle{Future — ARM NEON on llvmpipe}
+ ARM NEON: SIMD instructions\\\bigskip
+ How to use:
+ \begin{itemize}
+ \item<1-> Tune \textbf{auto-vectorization} on LLVM: easy to try; possible to upstream.
+ \item<3-> Ne10 library: easy to use; difficult to upstream (requires new deps).
+ \item<4-> \textbf{Neon intrinsics}: nice compromise between performance and code complexity; possible to upstream.
+ \lstset{language=C}
+ \begin{lstlisting}
+ #include <arm_neon.h>
+ uint8x8_t va, vb, vr;
+ vr = vadd_u8(va, vb);
+ \end{lstlisting}
+ \item<2-> Neon assembly: too cumbersome (e.g. manual register allocation).\\\bigskip
+ \end{itemize}
+ Borrow ideas from Pixman, Skia and libyuv (all these have NEON fast paths).
+\end{frame}
+\begin{frame}
+ \frametitle{Future — ARM NEON on llvmpipe}
+ \begin{center}
+ \includesvg[width=0.8\textwidth,inkscapeformat=png]{img/Mesa_layers_of_crap_2016.svg}
+ \footnote{Source: ScotXW on Wikimedia under CC0}
+ \end{center}
+ How to use intrinsics when llvmpipe must output LLVM IR?\\\medskip
+ Can LLVM IR contain ARM NEON assembly code?
+\end{frame}
+
+
+\subsection{Lima}
+\begin{frame}
+ \frametitle{Future — Lima}
+ The holy grail.\\\bigskip
+ Quite active now. New commits every week.\\
+ No idea of current compliance (asked devs to update \texttt{features.txt}).\\\bigskip
+ Planned approach: offload implemented GL operations to Lima.
+ \begin{itemize}
+ \item Where in the stack should we intercept GL operations? GLSL IR? TGSI?\\
+ \item Won't the overhead of interception, introspection and dispatch kill any performance gains?
+ \end{itemize}
+\end{frame}
+
+%with software render fallback for missing GLES functions
+
+\begin{frame}
+ \Huge{\centerline{Questions?\footnote{Ask Putti the hard ones. xD}}}
+\end{frame}
+
+\end{document}
diff --git a/img/Mesa_layers_of_crap_2016.svg b/img/Mesa_layers_of_crap_2016.svg
new file mode 100644
index 0000000..4f15fd4
--- /dev/null
+++ b/img/Mesa_layers_of_crap_2016.svg
@@ -0,0 +1,1628 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="960"
+ height="540"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ viewBox="0 0 960 540"
+ sodipodi:docname="Mesa layers of crap 2014.svg">
+ <title
+ id="title21433">Mesa layers of crap 2014</title>
+ <defs
+ id="defs4">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker23928"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path23930" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker23922"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ inkscape:connector-curvature="0"
+ transform="scale(0.8,0.8)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ id="path23924" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker23902"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path23904"
+ d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="scale(0.8,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker21044"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path21046" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker20656"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path20658" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker20052"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path20054"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker19764"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL"
+ inkscape:collect="always">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path19766" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker18464"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path18466"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker18152"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path18154"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker17834"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL"
+ inkscape:collect="always">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path17836" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker17540"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path17542"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker17218"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path17220"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker16920"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path16922"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker16622"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path16624"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker15622"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path15624" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker15300"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path15302" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker14828"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path14830" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker14608"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path14610" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker14388"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path14390" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker13986"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path13988"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker13776"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL"
+ inkscape:collect="always">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path13778" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker13472"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path13474"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker13276"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path13278"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker13086"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path13088"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker12908"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path12910"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker12736"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path12738"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker12564"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path12566" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker12398"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path12400" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5601"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="TriangleOutL"
+ inkscape:collect="always">
+ <path
+ transform="scale(0.8)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ id="path5604" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutL"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path5426"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutM"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5541"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.4)" />
+ </marker>
+ <clipPath
+ id="clipPath3369"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3371"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3381"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3383"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3389"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3391"
+ d="m 1.4,-1.4 720,0 0,43.3 -720,0 0,-43.3 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3405"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3407"
+ d="m 37.3,0 647.6,0 0,43.2 -647.6,0 0,-43.2 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3421"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3423"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3451"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3453"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3471"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path3473"
+ d="m 183,88.5 525.6,0 0,311 -525.6,0 0,-311 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath3909"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3911"
+ d="m 360,25 0,0 0,355.1 0,0 0,-355.1 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5039"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5041"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5051"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5053"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5059"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5061"
+ d="m 1.4,-1.4 720,0 0,43.3 -720,0 0,-43.3 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5075"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5077"
+ d="m 37.3,0 647.6,0 0,43.2 -647.6,0 0,-43.2 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5091"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5093"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5121"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5123"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5141"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path5143"
+ d="m 233.4,43.8 475.2,0 0,356.5 -475.2,0 0,-356.5 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath5645"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5647"
+ d="m 360,25 0,0 0,355.1 0,0 0,-355.1 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6928"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path6930"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6940"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path6942"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6948"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6950"
+ d="m 1.4,-1.4 720,0 0,43.3 -720,0 0,-43.3 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6964"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path6966"
+ d="m 37.3,0 647.6,0 0,43.2 -647.6,0 0,-43.2 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath6980"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path6982"
+ d="M 0,0 720,0 720,43.2 0,43.2 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath7010"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path7012"
+ d="M 0,0 720,0 720,405 0,405 0,0 Z" />
+ </clipPath>
+ <clipPath
+ id="clipPath7030"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ style="clip-rule:evenodd"
+ inkscape:connector-curvature="0"
+ id="path7032"
+ d="m 134.5,66.8 578.2,0 0,319 -578.2,0 0,-319 z" />
+ </clipPath>
+ <clipPath
+ id="clipPath7626"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ inkscape:connector-curvature="0"
+ id="path7628"
+ d="m 360,25 0,0 0,355.1 0,0 0,-355.1 z" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.80859375"
+ inkscape:cx="523.87478"
+ inkscape:cy="336.09666"
+ inkscape:document-units="px"
+ inkscape:current-layer="boxes"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="987"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-page="true"
+ inkscape:snap-grids="false"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="true"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-bbox-midpoints="true"
+ inkscape:snap-global="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-paths="true"
+ inkscape:snap-smooth-nodes="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-midpoints="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Mesa layers of crap 2014</dc:title>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>Intermediate Representation</rdf:li>
+ <rdf:li>Intermediate Layer</rdf:li>
+ <rdf:li>graphics driver</rdf:li>
+ <rdf:li>compiler optimization</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <dc:language>en-US</dc:language>
+ <dc:date>2016-02-05</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Shmuel Csaba Otto Traian Xerxes</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Shmuel Csaba Otto Traian Xerxes</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:contributor>
+ <cc:Agent>
+ <dc:title>Matt Turner, Eduardo Lima Mitev, John Carmack</dc:title>
+ </cc:Agent>
+ </dc:contributor>
+ <dc:description>Illustrates the diverse Intermediate Representations (IRs) used Mesa 3D</dc:description>
+ <cc:license
+ rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Reproduction" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#Distribution" />
+ <cc:permits
+ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="boxes"
+ inkscape:groupmode="layer"
+ id="boxes"
+ style="display:inline">
+ <g
+ id="g3905"
+ transform="matrix(1.25,0,0,-1.25,20,528.125)">
+ <g
+ id="g3907" />
+ <g
+ id="g3913">
+ <g
+ clip-path="url(#clipPath3909)"
+ id="g3915"
+ style="opacity:0.5">
+ <g
+ id="g3917" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g5641"
+ transform="matrix(1.25,0,0,-1.25,35,996.125)">
+ <g
+ id="g5643" />
+ <g
+ id="g5649">
+ <g
+ clip-path="url(#clipPath5645)"
+ id="g5651"
+ style="opacity:0.5">
+ <g
+ id="g5653" />
+ </g>
+ </g>
+ </g>
+ <g
+ id="g7624"
+ transform="matrix(1.25,0,0,-1.25,-39,1471.125)" />
+ <g
+ id="g7630"
+ transform="matrix(1.25,0,0,-1.25,-39,1471.125)">
+ <g
+ style="opacity:0.5"
+ id="g7632"
+ clip-path="url(#clipPath7626)">
+ <g
+ id="g7634" />
+ </g>
+ </g>
+ <rect
+ style="fill:#8787de;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.41406476;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect12218"
+ width="117.43212"
+ height="63.338615"
+ x="1157.7869"
+ y="899.65466"
+ transform="matrix(1,0,-0.86596467,0.50010518,0,0)" />
+ <rect
+ transform="matrix(1,0,-0.86596467,0.50010518,0,0)"
+ y="535.45764"
+ x="548.16925"
+ height="63.338615"
+ width="117.43212"
+ id="rect12220"
+ style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.41406476;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="fill:#0071c5;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.41406476;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect12222"
+ width="117.43212"
+ height="63.338615"
+ x="857.62701"
+ y="352.57672"
+ transform="matrix(1,0,-0.86596467,0.50010518,0,0)" />
+ <rect
+ transform="matrix(1,0,-0.86596467,0.50010518,0,0)"
+ y="136.37056"
+ x="360.49579"
+ height="63.338615"
+ width="117.43212"
+ id="rect12224"
+ style="fill:#def3f7;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.41406476;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csc"
+ d="m 99.099,299.4611 c 68.0945,33.14967 238.0167,29.34905 376.9565,54.88029 3.7027,0.6804 3.6947,10.11608 3.6947,10.11608"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker15622)"
+ id="path12228"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ d="m 99.099,299.4611 100.9378,64.99637"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker15300)"
+ id="path12230"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ d="M 99.099,299.4611 60.0551,364.45747"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker14608)"
+ id="path12232"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="csc"
+ d="m 99.099,299.4611 c 50.4689,32.49818 170.7129,39.69117 227.1542,49.7213 13.8994,2.47005 13.7652,15.27507 13.7652,15.27507"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker14388)"
+ id="path12234"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="csc"
+ d="m 99.099,299.4611 c 9.3187,6.51667 442.9701,49.33698 515.3255,55.37951 5.3226,0.4445 5.5573,9.61686 5.5573,9.61686"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker14828)"
+ id="path12236"
+ inkscape:connector-curvature="0" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,-113.54812,175.72978)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="path12242"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,26.43355,175.72978)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12244"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,166.4153,175.72978)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12246"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,306.3969,175.72978)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12248"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,446.3786,175.72978)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12250"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,608.9932,69.663762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12252"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,726.3417,69.663762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12254"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,491.6445,70.266762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12256"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,139.5986,70.266762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12258"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,256.9473,70.266762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12260"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ transform="matrix(1.1976195,0,0,0.62772407,374.2959,70.266762)"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="39.234867"
+ sodipodi:r1="45.304523"
+ sodipodi:cy="339.88876"
+ sodipodi:cx="144.95689"
+ sodipodi:sides="6"
+ id="use12262"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.153337;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12264"
+ d="m 340.0184,413.71481 32.7347,29.32459"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5601)"
+ d="m 480.0001,413.71481 -25.7374,28.14861"
+ id="path12266"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12268"
+ d="m 602.73,208.00142 297.215,50.39003"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker16920)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12270"
+ d="m 595.8357,208.00142 186.7607,50.39003"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker17218)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12272"
+ d="m 590.6208,208.00142 74.6269,50.99303"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker17540)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12274"
+ d="M 585.8137,208.00142 143.1979,267.78513"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker16622)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12276"
+ d="m 901.0372,104.89725 -222.297,67.4282"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker21044)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12278"
+ d="m 799.1022,104.89725 -162.5198,65.9282"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker20656)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12280"
+ d="m 661.6984,104.89725 -65.9358,63.36144"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker19764)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12282"
+ d="M 284.257,99.875592 511.8314,183.84017"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13776)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path12290"
+ d="m 273.6954,44.5 0,17.638516"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13472)" />
+ <ellipse
+ ry="20.85965"
+ rx="98.513855"
+ cy="84.037605"
+ cx="476.29419"
+ id="ellipse12296"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <ellipse
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="ellipse12298"
+ cx="661.69836"
+ cy="84.037605"
+ rx="85.9823"
+ ry="20.85965" />
+ <ellipse
+ ry="20.85965"
+ rx="50.51355"
+ cy="84.037605"
+ cx="799.10217"
+ id="ellipse12300"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <ellipse
+ ry="20.85965"
+ rx="50.51355"
+ cy="84.037605"
+ cx="901.03723"
+ id="use12302"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="fill:#8dd35f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.41406476;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect13270"
+ width="117.43212"
+ height="63.338615"
+ x="195.03278"
+ y="136.37056"
+ transform="matrix(1,0,-0.86596467,0.50010518,0,0)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13986)"
+ d="M 111.0413,99.875592 495.1782,193.21784"
+ id="path13984"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker17834)"
+ d="m 590.6208,208.00142 -42.7217,50.99303"
+ id="path17832"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path18150"
+ d="M 590.6208,208.00142 430.5505,258.99445"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker18152)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path18462"
+ d="m 590.6208,208.00142 -277.419,50.99303"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker18464)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker20052)"
+ d="m 476.2942,104.89725 70.678,61.65589"
+ id="path20050"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker23902)"
+ d="m 410.00927,482.06634 0,14.63331"
+ id="path6082"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4509"
+ y="452.62598"
+ x="199.44165"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan4511"
+ y="452.62598"
+ x="199.44165"
+ sodipodi:role="line">machine code</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ y="468.25098"
+ x="199.44165"
+ sodipodi:role="line"
+ id="tspan4513">for:</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ y="483.87598"
+ x="199.44165"
+ sodipodi:role="line"
+ id="tspan4521">all TeraScale GPUs</tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ y="499.50098"
+ x="203.20142"
+ sodipodi:role="line"
+ id="tspan5376">from R600 to Cayman </tspan><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ y="515.12598"
+ x="199.44165"
+ sodipodi:role="line"
+ id="tspan4515" /></text>
+ <path
+ sodipodi:type="star"
+ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.52540004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path23906"
+ sodipodi:sides="6"
+ sodipodi:cx="144.95689"
+ sodipodi:cy="339.88876"
+ sodipodi:r1="45.304523"
+ sodipodi:r2="39.234867"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 190.26142,339.88876 -22.65226,39.23487 -45.30453,0 -22.65226,-39.23487 22.65226,-39.23486 45.30453,0 z"
+ transform="matrix(0.90724966,0,0,0.47370261,278.49718,359.11405)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="456.01025"
+ y="517.97919"
+ id="text23910"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan23912"
+ x="456.01025"
+ y="517.97919">The LLVM code generator is not part of Mesa 3D; it is distributed as part</tspan><tspan
+ sodipodi:role="line"
+ x="456.01025"
+ y="530.47919"
+ id="tspan23914">of LLVM; radeonsi requires the approriate LLVM version to be installed as well!</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path23920"
+ d="m 200.03675,413.65376 0,14.63331"
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker23922)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker23928)"
+ d="M 273.6954,44.5 132.6276,65.320497"
+ id="path23926"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text23932"
+ y="55.152672"
+ x="276.56198"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ id="tspan23936"
+ y="55.152672"
+ x="276.56198"
+ sodipodi:role="line">Translation takes place on end user's computer</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="4.4335856"
+ y="56.324402"
+ id="text23940"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="4.4335856"
+ y="56.324402"
+ id="tspan23944">Translation takes place on developer's computer</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker13472)"
+ d="M 56.033564,44.5 81.831006,64.32474"
+ id="path3578"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3580"
+ y="111.64542"
+ x="8.549901"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ id="tspan3584"
+ y="111.64542"
+ x="8.549901"
+ sodipodi:role="line">Distributed as SPIR-V</tspan></text>
+ <rect
+ style="opacity:1;fill:#8dd35f;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3590"
+ width="129"
+ height="39"
+ x="5.5"
+ y="5.5"
+ rx="20"
+ ry="20" />
+ <use
+ x="0"
+ y="0"
+ xlink:href="#rect3590"
+ id="use3592"
+ transform="translate(203.69531,-6.7845281e-7)"
+ width="100%"
+ height="100%" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3594"
+ style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:7.66129017;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker14828)"
+ d="m 899.9449,307.64879 c -9.3187,6.51667 -122.37621,150.43787 -194.73161,156.4804 -5.3226,0.4445 -236.48795,1.63075 -236.48795,1.63075"
+ sodipodi:nodetypes="csc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="text">
+ <text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="584.23438"
+ y="199.45348"
+ id="text12212"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="584.23438"
+ y="199.45348"
+ id="tspan12214"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-align:center;text-anchor:middle">NIR</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12304"
+ y="29.792969"
+ x="469.36621"
+ style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ id="tspan12308"
+ y="29.792969"
+ x="469.36621"
+ sodipodi:role="line"
+ style="font-size:30px">Mesa compilation stack (2016+)</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12310"
+ y="24.378782"
+ x="273.48657"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:20px;text-align:center;text-anchor:middle"
+ y="24.378782"
+ x="273.48657"
+ id="tspan12312"
+ sodipodi:role="line">Shaders</tspan><tspan
+ style="font-size:11.25px;text-align:center;text-anchor:middle"
+ id="tspan12314"
+ y="40.657227"
+ x="273.48657"
+ sodipodi:role="line">written in GLSL</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="274.17871"
+ y="91.317871"
+ id="text12316"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="274.17871"
+ y="91.317871"
+ id="tspan12318"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-align:center;text-anchor:middle">GLSL IR</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="115.51465"
+ y="290.90338"
+ id="text12324"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="115.51465"
+ y="290.90338"
+ id="tspan12326"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-align:center;text-anchor:middle">TGSI</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12328"
+ y="473.04999"
+ x="410.64404"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-align:center;text-anchor:middle"
+ id="tspan12330"
+ y="473.04999"
+ x="410.64404"
+ sodipodi:role="line">LLVM IR</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12332"
+ y="291.07916"
+ x="548.86731"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan12334"
+ y="291.07916"
+ x="548.86731"
+ sodipodi:role="line">i965</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="59.21521"
+ y="394.35959"
+ id="text12336"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="59.21521"
+ y="394.35959"
+ id="tspan12338"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle">r300g</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12340"
+ y="394.35959"
+ x="199.1969"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan12342"
+ y="394.35959"
+ x="199.1969"
+ sodipodi:role="line">r600g</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="479.80481"
+ y="394.65744"
+ id="text12344"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="479.80481"
+ y="394.65744"
+ id="tspan12346"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle">llvmpipe</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12348"
+ y="396.54221"
+ x="338.93445"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan12350"
+ y="396.54221"
+ x="338.93445"
+ sodipodi:role="line">radeonsi</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="619.91345"
+ y="394.54514"
+ id="text12352"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="619.91345"
+ y="394.54514"
+ id="tspan12354"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle">nouveau</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12356"
+ y="290.16855"
+ x="666.27454"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan12358"
+ y="290.16855"
+ x="666.27454"
+ sodipodi:role="line">vc4</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="783.34985"
+ y="290.47617"
+ id="text12360"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="783.34985"
+ y="290.47617"
+ id="tspan12362"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle">freedreno</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12364"
+ y="290.50299"
+ x="431.52847"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan12366"
+ y="290.50299"
+ x="431.52847"
+ sodipodi:role="line">swrast</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="314.17007"
+ y="291.07916"
+ id="text12368"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="314.17007"
+ y="291.07916"
+ id="tspan12370"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle">i915</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="476.59692"
+ y="89.555183"
+ id="text12376"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="476.59692"
+ y="89.555183"
+ id="tspan12378"
+ style="font-size:20px;text-align:center;text-anchor:middle">fragment pipeline</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12380"
+ y="89.555183"
+ x="661.93274"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:20px;text-align:center;text-anchor:middle"
+ id="tspan12382"
+ y="89.555183"
+ x="661.93274"
+ sodipodi:role="line">vertex pipeline</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="799.57092"
+ y="89.247566"
+ id="text12384"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="799.57092"
+ y="89.247566"
+ id="tspan12386"
+ style="font-size:20px;text-align:center;text-anchor:middle">ARB vp</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text12388"
+ y="89.555183"
+ x="901.50598"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-size:20px;text-align:center;text-anchor:middle"
+ id="tspan12390"
+ y="89.555183"
+ x="901.50598"
+ sodipodi:role="line">ARB fp</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text13272"
+ y="91.317871"
+ x="107.41675"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold Italic';text-align:center;text-anchor:middle"
+ id="tspan13274"
+ y="91.317871"
+ x="107.41675"
+ sodipodi:role="line">SPIR-V</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text23916"
+ y="527.41028"
+ x="409.38428"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan23918"
+ y="527.41028"
+ x="409.38428"
+ sodipodi:role="line">LLVM</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3566"
+ y="290.47617"
+ x="898.66071"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:monospace;-inkscape-font-specification:monospace;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;font-family:monospace;-inkscape-font-specification:monospace;text-align:center;text-anchor:middle"
+ id="tspan3568"
+ y="290.47617"
+ x="898.66071"
+ sodipodi:role="line">radv</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="69.79126"
+ y="24.378782"
+ id="text3572"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3574"
+ x="69.79126"
+ y="24.378782"
+ style="font-size:20px;text-align:center;text-anchor:middle">Shaders</tspan><tspan
+ sodipodi:role="line"
+ x="69.79126"
+ y="40.657227"
+ id="tspan3576"
+ style="font-size:11.25px;text-align:center;text-anchor:middle">written in HLSL</tspan></text>
+ </g>
+</svg>
diff --git a/img/ape_fwk_graphics.png b/img/ape_fwk_graphics.png
new file mode 100644
index 0000000..e1cf0bd
--- /dev/null
+++ b/img/ape_fwk_graphics.png
Binary files differ
diff --git a/img/glitches.jpg b/img/glitches.jpg
new file mode 100644
index 0000000..976a1e2
--- /dev/null
+++ b/img/glitches.jpg
Binary files differ
diff --git a/img/odroid-u_block_diagram.jpg b/img/odroid-u_block_diagram.jpg
new file mode 100644
index 0000000..8940ea6
--- /dev/null
+++ b/img/odroid-u_block_diagram.jpg
Binary files differ