diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | COPYING | 428 | ||||
-rw-r--r-- | Makefile | 16 | ||||
-rw-r--r-- | graphics.tex | 407 | ||||
-rw-r--r-- | img/Mesa_layers_of_crap_2016.svg | 1628 | ||||
-rw-r--r-- | img/ape_fwk_graphics.png | bin | 0 -> 39757 bytes | |||
-rw-r--r-- | img/glitches.jpg | bin | 0 -> 112262 bytes | |||
-rw-r--r-- | img/odroid-u_block_diagram.jpg | bin | 0 -> 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/ @@ -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 Binary files differnew file mode 100644 index 0000000..e1cf0bd --- /dev/null +++ b/img/ape_fwk_graphics.png diff --git a/img/glitches.jpg b/img/glitches.jpg Binary files differnew file mode 100644 index 0000000..976a1e2 --- /dev/null +++ b/img/glitches.jpg diff --git a/img/odroid-u_block_diagram.jpg b/img/odroid-u_block_diagram.jpg Binary files differnew file mode 100644 index 0000000..8940ea6 --- /dev/null +++ b/img/odroid-u_block_diagram.jpg |