|  | Lima | 
|  | ==== | 
|  |  | 
|  | Lima is an open source graphics driver which supports Mali Utgard | 
|  | (Mali-4xx) embedded GPUs from ARM. It’s a reverse-engineered, | 
|  | community-developed driver, and is not endorsed by ARM. Lima was | 
|  | upstreamed in Mesa 19.1 and Linux kernel 5.2. | 
|  |  | 
|  | ========  ============ =========== | 
|  | Product   Architecture   Status | 
|  | ========  ============ =========== | 
|  | Mali-400     Utgard     Supported | 
|  | Mali-450     Utgard     Supported | 
|  | Mali-470     Utgard    Unsupported | 
|  | ========  ============ =========== | 
|  |  | 
|  | Newer Mali chips based on the Midgard/Bifrost architectures (Mali T or G | 
|  | series) are handled by the :doc:`Panfrost <panfrost>` driver, not Lima. | 
|  |  | 
|  | Note that the Mali GPU is only for rendering: the GPU does not control a | 
|  | display and has little to do with display-related issues. | 
|  | Each SoC has its own separate display engine to control the display | 
|  | output. To display the contents rendered by the Mali GPU to a screen, a | 
|  | separate `display driver <#display-drivers>`__ is also required, which | 
|  | is able to share buffers with the GPU. In Mesa, this is handled by | 
|  | ``kmsro``. | 
|  |  | 
|  | Supported APIs | 
|  | -------------- | 
|  |  | 
|  | Lima mainly targets **OpenGL ES 2.0**, as well as **OpenGL 2.1** | 
|  | (desktop) to some extent. | 
|  |  | 
|  | The OpenGL (desktop) implementation is enabled by Mesa and Gallium, | 
|  | where it is possible to reuse the same implementation backend. That way, | 
|  | it is possible to support running a majority of Linux desktop | 
|  | applications designed for OpenGL. It is not possible to fully support | 
|  | OpenGL (desktop), though, due to hardware limitations. Some (but not | 
|  | all) features of OpenGL 2.1 that are not supported directly in hardware | 
|  | are enabled by internal shader transformations. | 
|  | Check the `known hardware limitations <#known-hardware-limitations>`__ | 
|  | list for additional information. | 
|  |  | 
|  | **OpenGL ES 1.1** and **OpenGL 1.x** are also provided by Mesa and | 
|  | similarly supported to some extent in Lima. | 
|  |  | 
|  | Display drivers | 
|  | --------------- | 
|  |  | 
|  | These are some display drivers that have been tested with Lima: | 
|  |  | 
|  | - Allwinner: ``sun4i-drm`` | 
|  | - Amlogic: ``meson`` | 
|  | - Ericsson MCDE: ``mcde`` | 
|  | - Exynos: ``exynos`` | 
|  | - Rockchip: ``rockchip`` | 
|  | - Tiny DRM: ``tinydrm`` | 
|  |  | 
|  | Environment variables | 
|  | --------------------- | 
|  |  | 
|  | These are some Lima-specific environment variables that may aid in | 
|  | debugging. None of this is required for normal use. | 
|  |  | 
|  | .. envvar:: LIMA_DEBUG | 
|  |  | 
|  | accepts the following comma-separated list of flags: | 
|  |  | 
|  | ``bocache`` | 
|  | print debug info for BO cache | 
|  | ``diskcache`` | 
|  | print debug info for shader disk cache | 
|  | ``dump`` | 
|  | dump GPU command stream to ``$PWD/lima.dump`` | 
|  | ``gp`` | 
|  | print GP shader compiler result of each stage | 
|  | ``noblit`` | 
|  | use generic u_blitter instead of Lima-specific | 
|  | ``nobocache`` | 
|  | disable BO cache | 
|  | ``nogrowheap`` | 
|  | disable growable heap buffer | 
|  | ``notiling`` | 
|  | don’t use tiled buffers | 
|  | ``pp`` | 
|  | print PP shader compiler result of each stage | 
|  | ``precompile`` | 
|  | precompile shaders for shader-db | 
|  | ``shaderdb`` | 
|  | print shader information for shaderdb | 
|  | ``singlejob`` | 
|  | disable multi job optimization | 
|  |  | 
|  |  | 
|  | .. envvar:: LIMA_CTX_NUM_PLB | 
|  |  | 
|  | set number of PLB per context (used for development purposes) | 
|  |  | 
|  | .. envvar:: LIMA_PLB_MAX_BLK | 
|  |  | 
|  | set PLB max block (used for development purposes) | 
|  |  | 
|  | .. envvar:: LIMA_PPIR_FORCE_SPILLING | 
|  |  | 
|  | force spilling of variables in PPIR (used for development purposes) | 
|  |  | 
|  | .. envvar:: LIMA_PLB_PP_STREAM_CACHE_SIZE | 
|  |  | 
|  | set PP stream cache size (used for development purposes) | 
|  |  | 
|  | Known hardware limitations | 
|  | -------------------------- | 
|  |  | 
|  | Here are some known caveats in OpenGL support: | 
|  |  | 
|  | - ``glPolygonMode()`` with ``GL_LINE`` is not supported. This is not part of | 
|  | OpenGL ES 2.0 and so it is not possible to reverse engineer. | 
|  |  | 
|  | - Precision limitations in fragment shaders: | 
|  |  | 
|  | - In general, only | 
|  | `FP16 <https://en.wikipedia.org/wiki/Half-precision_floating-point_format>`__ | 
|  | precision is supported in fragment shaders. Specifying ``highp`` | 
|  | will have no effect. | 
|  | - Integers are not supported in hardware, they are lowered down to | 
|  | FP16. | 
|  | - There is a higher precision (FP24) path for texture lookups, if | 
|  | there is *no* math performed on texture coordinates obtained from | 
|  | varyings. If there is *any* calculation done in the texture | 
|  | coordinates, the texture coordinates will fall back to FP16 and | 
|  | that may affect the quality of the texture lookup. | 
|  |  | 
|  | - Lima supports FP16 textures in OpenGL ES (through | 
|  | :ext:`GL_OES_texture_half_float<GL_OES_texture_float>`), but not in OpenGL. | 
|  | This is because it would require :ext:`GL_ARB_texture_float` which would | 
|  | also require 32-bit float textures, that the Mali-4xx does not support. | 
|  | - Rendering to FP16 is possible, but the result is clamped to the | 
|  | [0.0,1.0] range. | 
|  |  | 
|  | Bug Reporting | 
|  | ------------- | 
|  |  | 
|  | Please try the latest Mesa development branch or at least Mesa latest | 
|  | release before reporting issues. Please review the | 
|  | :doc:`Mesa bug report guidelines <../bugs>`. | 
|  |  | 
|  | Issues should be filed as a `Mesa issue`_. | 
|  | Lima tags will be added accordingly by the developers. | 
|  |  | 
|  | `apitrace <https://github.com/apitrace/apitrace>`__ traces are very | 
|  | welcome in issue reports and significantly ease the debug and fix | 
|  | process. | 
|  |  | 
|  | FAQ | 
|  | --- | 
|  |  | 
|  | Will Lima support OpenGL 3.x+ / OpenGL ES 3.x+ / OpenCL / Vulkan ? | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | **No.** The Mali-4xx was designed to implement OpenGL ES 2.0 and OpenGL | 
|  | ES 1.1. The hardware lacks features to properly implement some features | 
|  | required by newer APIs. | 
|  |  | 
|  | How complete is Lima? Is reverse engineering complete? | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | At the time of writing, with local runs of the | 
|  | `OpenGL ES Conformance Tests <https://github.com/KhronosGroup/VK-GL-CTS/>`__ | 
|  | (dEQP) for OpenGL ES 2.0, Lima reports **97%** pass rate. | 
|  | This coverage is on par with coverage provided by the ARM Mali driver. | 
|  | Some tests that pass with Lima fail on Mali and vice versa. Some of | 
|  | these issues are related to precision limitations which likely don’t | 
|  | affect end user applications. | 
|  |  | 
|  | The work being done in Lima at this stage is largely decoupled from | 
|  | reverse engineering. Reverse engineering is still useful sometimes to | 
|  | obtain details on how to implement low level features (e.g. how to | 
|  | enable some missing legacy OpenGL ES 1.1 feature to support an | 
|  | additional application), but with the current information Lima is | 
|  | already able to cover most of OpenGL ES 2.0. | 
|  |  | 
|  | Much of the work to be done is related to plumbing features within the | 
|  | frameworks provided by Mesa, fixing bugs (e.g. artifacts or crashes in | 
|  | specific applications), shader compiler improvements, which are not | 
|  | necessarily related to new hardware bits and not related at all to the | 
|  | Mali driver. | 
|  |  | 
|  | When will Feature XYZ be supported? Is there a roadmap for features implementation? | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | There is no established roadmap for features implementation. | 
|  | Development is driven by improving coverage in existing OpenGL test | 
|  | frameworks, adding support to features that enable more existing Linux | 
|  | applications, and fixing issues reported by users in their applications. | 
|  | Development is fully based on community contributions. | 
|  |  | 
|  | If some desired feature is missing or there is an OpenGL-related bug | 
|  | while running some application, please do file a `Mesa issue`_. | 
|  | Issues that are not reproduced by an existing test suite or common | 
|  | application and are also not reported by users are just likely not going | 
|  | to be noticed and fixed. | 
|  |  | 
|  | How does Lima compare to Mali (blob)? How is performance? | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | By the fact that Lima is a fully open source driver and leverages a lot | 
|  | of Mesa and Linux functionality, feature-wise Lima is able to support | 
|  | many things that Mali does not. As already mentioned, supporting OpenGL | 
|  | 2.1 is one of them. This allows Lima to support many more Linux desktop | 
|  | applications out of the box. Through the abstractions implemented in | 
|  | Mesa, Lima supports a number of OpenGL and OpenGL ES extensions that | 
|  | originally the Mali did not support. Lima is also aligned with the | 
|  | current status of the Linux graphics stack and is therefore able to | 
|  | leverage modern features (such as zero copy pipelines) much more | 
|  | seamlessly. Finally, Lima continues to gain improvements as the Linux | 
|  | graphics ecosystem evolves. | 
|  |  | 
|  | The entire software stack of the Mali driver and the software stack with | 
|  | Lima are significantly different which makes it hard to offer a single | 
|  | number comparison for performance of the GPU driver. The difference | 
|  | really depends on the type of application. Keep in mind that hardware | 
|  | containing a Mali-4xx is usually quite limited for modern standards and | 
|  | it might not perform as well as hoped. For example: while it is now | 
|  | technically possible to run full GL modern desktop environments at 1080p | 
|  | (which might not have been even possible before due to limited GL | 
|  | support), that might not be very performant due to memory bandwidth, CPU | 
|  | and GPU limitations of the SoC with a Mali-4xx. | 
|  |  | 
|  | Overall performance with Lima is good for many applications where the | 
|  | Mali-4xx would be a suitable target GPU. | 
|  | But bottom line for a performance evaluation, you need to try with your | 
|  | target application. If performance with Lima does not seem right in some | 
|  | application where it should reasonably perform better, please file a | 
|  | `Mesa issue`_ (in which case some indication on why Lima in particular | 
|  | seems to be the bottleneck would also be helpful). | 
|  |  | 
|  | Communication channels | 
|  | ---------------------- | 
|  |  | 
|  | - `#lima channel <irc://irc.oftc.net/lima>`__ on `irc.oftc.net <https://webchat.oftc.net/>`__ | 
|  | - `lima mailing list <https://lists.freedesktop.org/mailman/listinfo/lima>`__ | 
|  | - `dri-devel mailing list <https://lists.freedesktop.org/mailman/listinfo/dri-devel>`__ | 
|  |  | 
|  | Dump tool | 
|  | --------- | 
|  |  | 
|  | A tool to dump the runtime of the closed source Mali driver for | 
|  | reverse engineering is available at: | 
|  | https://gitlab.freedesktop.org/lima/mali-syscall-tracker | 
|  |  | 
|  | Reference | 
|  | --------- | 
|  |  | 
|  | Luc Verhaegen’s original Lima site: | 
|  | https://web.archive.org/web/20180101212947/http://limadriver.org/ | 
|  |  | 
|  | .. _Mesa issue: https://gitlab.freedesktop.org/mesa/mesa/-/issues?label_name%5B%5D=lima |