[Mesa-dev] [PATCH v5 00/70] ARB_shader_storage_buffer_object (mesa, i965)

Iago Toral Quiroga itoral at igalia.com
Thu Sep 10 06:35:16 PDT 2015


Hi,

this is the latest version of the ARB_shader_storage_buffer_object
implementation. A good part of the frontend bits for this are already in
master, but this adds some more missing pieces, specifically std430 and
memory qualifiers. Additionally, this provides the i965 implementation.

Changes in this version include:

- A new implementation of std430: we no longer have to propagate the layout
qualifier information down to the type of each buffer variable, which makes
the implementation a lot easier.

- Added a Nir/Vec4 implementation for all the pieces: loads, stores, atomics
and unsized arrays.

- A new implementation for computing the length of unsized arrays in SSBO
definitions that pushes less work to the backends.

- A bunch of fixes to various patches throughout the series.

- All the review feedback addressed.

This branch no longer depends on other uncommitted work, the few  remaining
patches we needed (a vec4 implementation of Curro's IR builder together with
some helper functions) are now part of this series (patches 33-35).

We have not dropped the old vec4_visitor implementation from the patch set,
however, now that Nir/Vec4 has been enabled by default and that there are
patches in the mailing list that address the shader-db regressions it looks
like we might not be interested in these patches any more, feel free to skip
the review of these if that is the case, they are patches:

Patch 16: i965/vec4: Implement ir_unop_get_buffer_size
Patch 39: i965/vec4: Implement __intrinsic_store_ssbo
Patch 43: i965/vec4: Implement __intrinsic_load_ssbo
Patch 53: i965/vec4: Implement lowered SSBO atomic intrinsics

Finally, notice that there are 23 patches in this series that already have
a Reviewed-by.

Development branch:

https://github.com/Igalia/mesa.git
branch itoral-ARB_shader_storage_buffer_object-v5

Piglit:

All SSBO piglit tests are in piglit master under
tests/spec/arb_shader_storage_buffer_object.

Samuel has a modified version of Ian's branch for random testing of UBOs that
he used to verify the implementation of std430. We found a few bugs thanks to
that! If someone wants to play with it, this modified version is here:

https://github.com/Igalia/piglit.git
branch ssbo-random-tests-std430

Antia Puentes (1):
  glsl: Mark as active all elements of shared/std140 block arrays

Francisco Jerez (3):
  i965/vec4: Introduce VEC4 IR builder.
  i965/vec4: Import helpers to convert vectors into arrays and back.
  i965/vec4: Import surface message builder functions.

Iago Toral Quiroga (29):
  i965: Use 16-byte offset alignment for shader storage buffers
  i965: Implement DriverFlags.NewShaderStorageBuffer
  i965: Set MaxShaderStorageBuffers for compute shaders
  i965: Upload Shader Storage Buffer Object surfaces
  i965: handle visiting of ir_var_shader_storage variables
  i965/fs: Do not split buffer variables
  nir: Implement __intrinsic_store_ssbo
  i965/nir/fs: Implement nir_intrinsic_store_ssbo
  i965/nir/vec4: Implement nir_intrinsic_store_ssbo
  i965/vec4: Implement __intrinsic_store_ssbo
  nir: Implement __intrinsic_load_ssbo
  i965/nir/fs: Implement nir_intrinsic_load_ssbo
  i965/nir/vec4: Implement nir_intrinsic_load_ssbo
  i965/vec4: Implement __intrinsic_load_ssbo
  nir/glsl_to_nir: ignore an instruction's dest if it hasn't any
  glsl: Rename atomic counter functions
  glsl: Add atomic functions from ARB_shader_storage_buffer_object
  glsl: lower SSBO atomic intrinsics
  nir: Implement lowered SSBO atomic intrinsics
  i965/nir/fs: Implement nir_intrinsic_ssbo_atomic_*
  i965/nir/vec4: Implement nir_intrinsic_ssbo_atomic_*
  i965/vec4: Implement lowered SSBO atomic intrinsics
  glsl: First argument to atomic functions must be a buffer variable
  mesa: Add queries for GL_SHADER_STORAGE_BUFFER
  glsl: Allow use of memory qualifiers with
    ARB_shader_storage_buffer_object.
  glsl: Apply memory qualifiers to buffer variables
  glsl: Do not allow assignments to read-only buffer variables
  glsl: Do not allow reads from write-only buffer variables
  docs: Mark ARB_shader_storage_buffer_object as done for i965

Kristian Høgsberg (1):
  glsl: atomic counters can be declared as buffer-qualified variables

Samuel Iglesias Gonsalvez (36):
  mesa: set MAX_SHADER_STORAGE_BUFFERS to 15.
  i965: set ARB_shader_storage_buffer_object related constant values
  glsl: return error if unsized arrays are found in OpenGL ES
  glsl: add support for unsized arrays in shader storage blocks
  glsl: Add parser/compiler support for unsized array's length()
  glsl: implement unsized array length
  nir: Implement ir_unop_get_buffer_size
  i965/vec4: Implement VS_OPCODE_GET_BUFFER_SIZE
  i965/vec4/nir: implement nir_intrinsic_get_buffer_size
  i965/vec4: Implement ir_unop_get_buffer_size
  i965/fs: Implement FS_OPCODE_GET_BUFFER_SIZE
  i965/fs/nir: implement nir_intrinsic_get_buffer_size
  i965/wm: emit null buffer surfaces when null buffers are attached
  i965/wm: surfaces should have the API buffer size, not the drm buffer
    size
  glsl: layout qualifier can appear more than once since OpenGL 4.20
  glsl: ignore default qualifier declarations when checking for
    duplicate layout qualifiers
  glsl: refactor parser processing of an interface block definition
  glsl: allow default qualifiers for shader storage block definitions
  glsl: Add std430 related member functions to glsl_type class
  glsl: Add parser/compiler support for std430 interface packing
    qualifier
  glsl: Add std430 interface packing support to
    program_resource_visitor's member functions
  glsl: add std430 interface packing support to ssbo related operations
  glsl: a shader storage buffer must be smaller than the maximum size
    allowed
  glsl: number of active shader storage blocks must be within allowed
    limits
  glsl: ignore buffer variables when counting uniform components
  glsl: shader storage blocks use different max block size values than
    uniforms
  glsl: use ir_rvalue instead of ir_dereference in auxiliary functions
  mesa: add glShaderStorageBlockBinding()
  glsl: fix UNIFORM_BUFFER_START or UNIFORM_BUFFER_SIZE query when no
    buffer object is bound
  glsl: Allow memory qualifiers on shader storage buffer blocks
  main: Add SHADER_STORAGE_BLOCK and BUFFER_VARIABLE support for
    ARB_program_interface_query
  main/tests: add ARB_shader_storage_buffer_object tokens to
    enum_strings
  glapi: add ARB_shader_storage_block_buffer_object
  mesa: Add getters for the GL_ARB_shader_storage_buffer_object max
    constants
  mesa: enable ARB_shader_storage_buffer_object extension for GLES 3.1
  i965: Enable ARB_shader_storage_buffer_object extension for gen7+

 docs/GL3.txt                                       |   4 +-
 src/glsl/ast.h                                     |   9 +
 src/glsl/ast_array_index.cpp                       |   3 +-
 src/glsl/ast_function.cpp                          |  50 +-
 src/glsl/ast_to_hir.cpp                            | 222 +++++++-
 src/glsl/ast_type.cpp                              |   2 +
 src/glsl/builtin_functions.cpp                     | 215 +++++++-
 src/glsl/glsl_lexer.ll                             |  10 +-
 src/glsl/glsl_parser.yy                            | 196 +++----
 src/glsl/glsl_parser_extras.cpp                    | 141 ++++-
 src/glsl/glsl_parser_extras.h                      |   9 +-
 src/glsl/glsl_types.cpp                            | 238 +++++++-
 src/glsl/glsl_types.h                              |  33 +-
 src/glsl/ir.cpp                                    |   8 +
 src/glsl/ir.h                                      |  33 +-
 src/glsl/ir_uniform.h                              |   5 +
 src/glsl/ir_validate.cpp                           |  11 +
 src/glsl/link_uniform_block_active_visitor.cpp     |  23 +
 src/glsl/link_uniform_blocks.cpp                   |  51 +-
 src/glsl/link_uniforms.cpp                         | 107 +++-
 src/glsl/linker.cpp                                | 174 ++++--
 src/glsl/linker.h                                  |   7 +-
 src/glsl/lower_ubo_reference.cpp                   | 435 ++++++++++++++-
 src/glsl/nir/glsl_to_nir.cpp                       | 184 ++++++-
 src/glsl/nir/nir_intrinsics.h                      |  55 +-
 src/glsl/nir/nir_lower_phis_to_scalar.c            |   2 +
 .../glapi/gen/ARB_shader_storage_buffer_object.xml |  36 ++
 src/mapi/glapi/gen/GL4x.xml                        |  18 +-
 src/mapi/glapi/gen/Makefile.am                     |   1 +
 src/mapi/glapi/gen/gl_API.xml                      |   6 +-
 src/mesa/drivers/dri/i965/Makefile.sources         |   3 +
 src/mesa/drivers/dri/i965/brw_context.c            |  16 +
 src/mesa/drivers/dri/i965/brw_context.h            |   6 +
 src/mesa/drivers/dri/i965/brw_defines.h            |   4 +
 src/mesa/drivers/dri/i965/brw_fs.cpp               |   1 +
 src/mesa/drivers/dri/i965/brw_fs.h                 |   5 +
 .../dri/i965/brw_fs_channel_expressions.cpp        |   2 +
 src/mesa/drivers/dri/i965/brw_fs_generator.cpp     |  47 ++
 src/mesa/drivers/dri/i965/brw_fs_nir.cpp           | 235 ++++++++
 .../drivers/dri/i965/brw_fs_vector_splitting.cpp   |   1 +
 src/mesa/drivers/dri/i965/brw_shader.cpp           |   6 +
 src/mesa/drivers/dri/i965/brw_state_upload.c       |   1 +
 src/mesa/drivers/dri/i965/brw_vec4.cpp             |   1 +
 src/mesa/drivers/dri/i965/brw_vec4.h               |  11 +
 src/mesa/drivers/dri/i965/brw_vec4_builder.h       | 602 +++++++++++++++++++++
 src/mesa/drivers/dri/i965/brw_vec4_generator.cpp   |  31 ++
 src/mesa/drivers/dri/i965/brw_vec4_nir.cpp         | 306 +++++++++++
 .../drivers/dri/i965/brw_vec4_surface_builder.cpp  | 332 ++++++++++++
 .../drivers/dri/i965/brw_vec4_surface_builder.h    |  69 +++
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp     | 369 ++++++++++++-
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c   |  72 ++-
 src/mesa/drivers/dri/i965/intel_buffer_objects.c   |   2 +
 src/mesa/drivers/dri/i965/intel_extensions.c       |   1 +
 src/mesa/main/config.h                             |   2 +-
 src/mesa/main/get.c                                |  44 +-
 src/mesa/main/get_hash_params.py                   |  16 +
 src/mesa/main/mtypes.h                             |   3 +-
 src/mesa/main/program_resource.c                   |   7 +-
 src/mesa/main/shader_query.cpp                     | 265 ++++++++-
 src/mesa/main/tests/enum_strings.cpp               |  15 +
 src/mesa/main/uniforms.c                           |  52 ++
 src/mesa/main/uniforms.h                           |   4 +
 src/mesa/program/ir_to_mesa.cpp                    |   2 +
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp         |   5 +
 64 files changed, 4511 insertions(+), 315 deletions(-)
 create mode 100644 src/mapi/glapi/gen/ARB_shader_storage_buffer_object.xml
 create mode 100644 src/mesa/drivers/dri/i965/brw_vec4_builder.h
 create mode 100644 src/mesa/drivers/dri/i965/brw_vec4_surface_builder.cpp
 create mode 100644 src/mesa/drivers/dri/i965/brw_vec4_surface_builder.h

-- 
1.9.1



More information about the mesa-dev mailing list