[Mesa-dev] [PATCH 00/11] Add atomic counters and partial buffer support to gallium

Ilia Mirkin imirkin at alum.mit.edu
Sat Sep 26 23:33:16 PDT 2015


This series is enough to get atomic counters going on freedreno. I
half-heartedly started adding image and generic buffer support, but
some freedreno-side issues (to do with instruction encoding) would
have prevented me from testing it all the way.

The idea is that BUFFER[n] represents a shader buffer, and IMAGE[n]
represents a shader image. The LOAD/STORE/ATOM* instructions can take
either as a resource, and treat the offset/coordinate argument
accordingly. I didn't double-check if any image functions ever need
more than 4 coordinate args, if so a LOAD2 variant can be added later.

Atomic counters are then implemented as LOAD + ATOMUADD on top of
buffers. For the TGSI -> NIR bits (required for freedreno), that all
gets reimplemented on top of the ssbo intrinsics.

The two outstanding issues are that atomic buffer bindings are messed
up, see Timothy Arceri's patch

[PATCH 14/24] i965: fix atomic buffer index for bindings other than 0

If that gets accepted, a similar solution can be implemented in
st/mesa. The other issue is that freedreno doesn't treat discards the
way the piglit test likes. This is the age-old "should discard exit
the shader" question, and the spec seems to say yes. However I seem to
recall there being applications which relied on the answer to be "no"
due to derivatives. Either way, this issue shouldn't really block this
series.

Note that nouveau support for this is blocked on figuring out how to
get global memory access to actually work from the graphics
pipeline. I have no plans on looking at either r600 or radeonsi for
this functionality.

Ilia Mirkin (11):
  tgsi: add ureg support for image decls
  ureg: add buffer support to ureg
  tgsi: add a is_store property
  tgsi: update atomic op docs
  gallium: add PIPE_SHADER_CAP_MAX_BUFFERS
  st/mesa: add atomic buffer support
  ttn: add buffer support
  freedreno: add support for state tracking shader buffers
  freedreno/ir3: upload shader buffer addresses after ubos
  freedreno/ir3: add support for ssbo intrinsics
  freedreno: enable ARB_shader_atomic_counters

 docs/relnotes/11.1.0.html                          |   1 +
 src/gallium/auxiliary/gallivm/lp_bld_limits.h      |   1 +
 src/gallium/auxiliary/nir/tgsi_to_nir.c            | 118 +++++-
 src/gallium/auxiliary/tgsi/tgsi_build.c            |  62 +--
 src/gallium/auxiliary/tgsi/tgsi_dump.c             |  10 +-
 src/gallium/auxiliary/tgsi/tgsi_exec.h             |   1 +
 src/gallium/auxiliary/tgsi/tgsi_info.c             | 446 ++++++++++-----------
 src/gallium/auxiliary/tgsi/tgsi_info.h             |   1 +
 src/gallium/auxiliary/tgsi/tgsi_parse.c            |   4 +-
 src/gallium/auxiliary/tgsi/tgsi_parse.h            |   2 +-
 src/gallium/auxiliary/tgsi/tgsi_strings.c          |   3 +-
 src/gallium/auxiliary/tgsi/tgsi_text.c             |  10 +-
 src/gallium/auxiliary/tgsi/tgsi_ureg.c             | 104 +++++
 src/gallium/auxiliary/tgsi/tgsi_ureg.h             |  10 +
 src/gallium/docs/source/screen.rst                 |   4 +
 src/gallium/docs/source/tgsi.rst                   |  93 ++---
 src/gallium/drivers/freedreno/freedreno_context.h  |   2 +
 src/gallium/drivers/freedreno/freedreno_draw.c     |   8 +
 src/gallium/drivers/freedreno/freedreno_resource.c |   8 +
 src/gallium/drivers/freedreno/freedreno_screen.c   |   2 +
 src/gallium/drivers/freedreno/freedreno_state.c    |  24 ++
 src/gallium/drivers/freedreno/ir3/ir3.c            |   2 +-
 src/gallium/drivers/freedreno/ir3/ir3.h            |  20 +
 .../drivers/freedreno/ir3/ir3_compiler_nir.c       |  77 +++-
 src/gallium/drivers/freedreno/ir3/ir3_depth.c      |   3 +-
 src/gallium/drivers/freedreno/ir3/ir3_legalize.c   |   4 +-
 src/gallium/drivers/freedreno/ir3/ir3_shader.c     |  42 ++
 src/gallium/drivers/freedreno/ir3/ir3_shader.h     |   4 +-
 .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  12 +-
 src/gallium/drivers/nouveau/nv30/nv30_screen.c     |   2 +
 src/gallium/drivers/nouveau/nv50/nv50_screen.c     |   1 +
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c     |   1 +
 src/gallium/drivers/r300/r300_screen.c             |   2 +
 src/gallium/drivers/r600/r600_pipe.c               |   1 +
 src/gallium/drivers/radeonsi/si_pipe.c             |   2 +
 src/gallium/drivers/svga/svga_screen.c             |   3 +
 src/gallium/drivers/vc4/vc4_screen.c               |   2 +
 src/gallium/include/pipe/p_defines.h               |   3 +-
 src/gallium/include/pipe/p_shader_tokens.h         |   8 +-
 src/mesa/Makefile.sources                          |   1 +
 src/mesa/program/ir_to_mesa.cpp                    |   4 +-
 src/mesa/state_tracker/st_atom.c                   |   5 +
 src/mesa/state_tracker/st_atom.h                   |   5 +
 src/mesa/state_tracker/st_atom_atomicbuf.c         | 151 +++++++
 src/mesa/state_tracker/st_cb_bufferobjects.c       |   3 +
 src/mesa/state_tracker/st_context.c                |   1 +
 src/mesa/state_tracker/st_context.h                |   1 +
 src/mesa/state_tracker/st_extensions.c             |  15 +
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp         | 133 +++++-
 49 files changed, 1089 insertions(+), 333 deletions(-)
 create mode 100644 src/mesa/state_tracker/st_atom_atomicbuf.c

-- 
2.4.9



More information about the mesa-dev mailing list