mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-27 04:04:23 +08:00
2179a7f4d7
Add support for the Xilinx ZynqMP DPSub display driver, used with the onboard Mali-400 GPU. Signed-off-by: Sean Anderson <sean.anderson@seco.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27370>
259 lines
9.9 KiB
ReStructuredText
259 lines
9.9 KiB
ReStructuredText
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``
|
||
- Xilinx ZynqMP: ``zynqmp-dpsub``
|
||
|
||
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
|