[Mesa-dev] [PATCH 00/21] Towards NIR support for etnaviv

Philipp Zabel p.zabel at pengutronix.de
Tue Jun 5 14:38:24 UTC 2018


we have been interested in NIR support for etnaviv for a while, for the
obvious reasons: gaining access to common optimizations, better support
for non-trivial code transformations, better register allocation, and
the promise of OpenCL and SPIR-V support in the future.

Michael and I have used our annual exploratory "tech week" last year
and last week to get acquainted with NIR and the Vivante GPUs a bit and
to get started compiling NIR shaders from the GLSL compiler to Vivante
machine code.

The following patches are still very much work in progress. Until now,
this has only been tested with kmscube, weston, and glmark2 (and some
benchmarks are not working yet, missing instruction implementations).
We haven't even dared to run piglit yet. At this point we'd very much
like some feedback on where we are on the right path, and where things
could be done in a better way.
The NIR compiler is placed next to the current TGSI translation layer,
and still uses the same backend for code emission. NIR support is
disabled by default, and can be enabled using the etnaviv environment
option: ETNA_MESA_DEBUG="nir", so this could be merged without side
effects, once it is deemed acceptable, to support further development

Due to the shared global register file, reducing the amount of temporary
registers used by a shader is important for parallelism. We have added
added a layer of virtual registers with less than four components over
each vec4 base register using the register allocator utility, and use
source swizzles and destination write masks to reuse the free components
of partially occupied registers if possible.
We use the NIR global registers, indexed to represent the registers in
the global temporary register file, which allows us to do register
assignment in NIR and then reuse the current code emitter without
introducing another intermediate representation.

There are already a few Vivante specific lowering passes, but we
notably are still missing support for loops, and for lowering sin,
cos and log functions to the Vivante specific hardware instructions
that need prescaling and post-multiplication of the results' x and
y components (or to replace them with approximations where the
instructions are not supported).

The patches can also be found at:

  git://git.pengutronix.de/pza/mesa.git etnaviv-nir


Michael Tretter (10):
  etnaviv: extract get_mystery_meat_load_balancing
  etnaviv: compiler: extract compile shader from tgsi
  etnaviv: compiler: setup registers from nir
  etnaviv: compiler: avoid using tgsi_shader_info
  etnaviv: compiler: add code emitter for alu operations
  etnaviv: compiler: generate instructions for log2
  etnaviv: nir: remove undefined variables
  etnaviv: compiler: ignore nir_instr_type_ssa_undef
  etnaviv: nir: add extra mov for uniforms used as output
  etnaviv: nir: avoid multiple uniform src for alu ops

Philipp Zabel (11):
  etnaviv: prefix COMPARE_FUNC enum values in rnndb
  etnaviv: add debug option to report NIR as supported and preferred
    shader IR
  etnaviv: generate and optimize NIR
  etnaviv: nir: hardwire position location
  etnaviv: nir: merge mov of result into alu op
  etnaviv: nir: add virtual register classes
  etnaviv: nir: add a nop intrinsic to empty shaders
  etnaviv: compiler: generate texture loads
  etnaviv: nir: add texture fixup path before register assignment
  etnaviv: nir: implement conditionals
  etnaviv: nir: globalize local registers

 src/gallium/drivers/etnaviv/Makefile.am       |    5 +-
 src/gallium/drivers/etnaviv/Makefile.sources  |    2 +
 .../drivers/etnaviv/etnaviv_compiler.c        |  816 +++++++++++-
 src/gallium/drivers/etnaviv/etnaviv_debug.h   |    3 +
 src/gallium/drivers/etnaviv/etnaviv_nir.c     | 1108 +++++++++++++++++
 src/gallium/drivers/etnaviv/etnaviv_nir.h     |   39 +
 src/gallium/drivers/etnaviv/etnaviv_screen.c  |   23 +-
 src/gallium/drivers/etnaviv/etnaviv_shader.c  |   10 +
 src/gallium/drivers/etnaviv/etnaviv_shader.h  |    3 +
 src/gallium/drivers/etnaviv/hw/state_3d.xml.h |   16 +-
 10 files changed, 1956 insertions(+), 69 deletions(-)
 create mode 100644 src/gallium/drivers/etnaviv/etnaviv_nir.c
 create mode 100644 src/gallium/drivers/etnaviv/etnaviv_nir.h


More information about the mesa-dev mailing list