Hi,

This is a heads-up that I'm preparing a v2 of this series incorporating
all the feedback received so far.

I plan to submit it imminently (tomorrow?) and several patches have
diverged quite a bit; so please hold on for a few hours on any review
you might have planned.

Thanks!

Eduardo

On 11/15/2017 02:22 PM, Eduardo Lima Mitev wrote:
> Hello,
>
> This series is the first chunk of our on-going work to support 
> GL_ARB_gl_spirv [1] and GL_ARB_spirv_extensions [2] in Mesa and i965. It adds 
> API entry-points, API error checking, most of driver-agnostic setup and 
> housekeeping, and a few basic i965 bits. It is based off initial work that 
> Nicolai Hähnle did back in July.
>
> In the case of GL_ARB_spirv_extensions, we consider our work on this 
> extension to be completed.
>
> For GL_ARB_gl_spirv, this is the high level explanation of what we do:
>
> * When the user calls glShaderBinary() with a SPIR-V binary, we mark the 
> shader as a SPIR-V shader and save the binary module within it.
>
> * Upon a call to glSpecializeShaderARB(), we perform a pass over the saved 
> binary module to validate that the given specialization constants and entry 
> point are ok. For this, we use a modified version of spirv_to_nir() that 
> doesn't generate any NIR, but simply performs the validation we need. If 
> everything went ok, we then save the specialization constants and entry point 
> within the shader object as well.
>
> * Upon program linking, and before calling driver-specific LinkShader(), we 
> generate gl_linked_shader objects and associate them with the SPIR-V data 
> that has been recorded in gl_shader (namely: the binary module, the 
> specialization constants and the entry point name).
>
> * We also introduce a convenient spirv_to_nir() wrapper for backends that use 
> NIR.
>
> This is all this series does. At this point, driver-specific linkers have all 
> the SPIR-V information they need (attached to the gl_shader and 
> gl_linked_shader objects of a program) to implement whatever linking strategy 
> they choose. For i965, we are planning to go for a (mostly) pure NIR linking 
> approach (see below).
>
>
> This is the series' logical break down:
>
> - Patch 1 introduces the extension in Mesa and adds 'mesa/main/glspirv.c/h' 
> files to hold its implementation.
>
> - Patch 2 adds a flag to gl_shader to tell SPIR-V and GLSL shaders apart.
>
> - Patch 3 adds error checks introduced by the extension.
>
> - Patches 4 to 6 make glShaderBinary() load SPIR-V, associating the SPIR-V 
> binary with the shader for later use.
>
> - Patches 7 to 9 add SPIR-V capabilities to a GL context. This information is 
> an extension requirement. In our case, we already fill it up for i965.
>
> - Patches 10 to 14 implement GL_ARB_spirv_extensions.
>
> - Patches 15 and 16 implement glSpecializeShaderARB().
>
> - Patches 17 to 22 fork the linking code for GLSL or SPIR-V programs, to 
> avoid using the GLSL linker on SPIR-V shaders. The GLSL linker expects 
> GLSL-IR to be present, and that's NULL for SPIR-V shaders.
>
> - Patches 23 and 24 do the same as above but for i965, plus also generate the 
> NIR out of each SPIR-V shader.
>
>
> A tree of this series can be found at 
> <https://github.com/Igalia/mesa/commits/arb_gl_spirv-series1-v1>.
>
> A tree of the larger branch from which this series is taken can be found at 
> <https://github.com/Igalia/mesa/commits/wip/igalia/arb_gl_spirv>. Note that 
> this is still very experimental and will change a lot constantly.
>
>
> What's our plan going forward?
>
> In Mesa we have a single linker that is heavily interwined with GLSL-IR. So, 
> if we want to link SPIR-V shaders, we have basically two approaches:
>
> 1. Convert the SPIR-V to GLSL-IR and reuse the existing linker: Introduces 
> yet another conversion in the shader compilation process, but allows us to 
> reuse a battle-tested linker.
>
> 2. Write a new linker: Obviously a lot of work.
>
> Or use a combination of the two approaches, a mixed (or incremental) solution 
> where we aim at writing a new linker, but for specific cases and/or 
> temporarily we generate some minimal GLSL-IR that would allow us to reuse 
> hard-to-rewrite parts of the existing GLSL linker.
>
> After spending weeks prototyping different solutions, we have more or less 
> settled for a mixed approach: write a pure NIR linker from scratch, that will 
> reuse parts of the GLSL linker, but trying to avoid generating any GLSL-IR to 
> feed the GLSL linker directly (doing that only when really needed).
>
> We have prototyped some bits of this NIR linker already with a promising 
> degree of success. At this point, we are confident that with this mixed 
> approach we can write clean, efficient linking code; while at the same time 
> have the flexibility to use the current GLSL linker to fill gaps.
>
> If you are interested in more details about our approach, we encourage you to 
> check the snapshot of our development branch at [3]. We would really 
> appreaciate early feedback! (don't forget to 
> MESA_EXTENSION_OVERRIDE="GL_ARB_gl_spirv").
>
> Another deciding factor was recent discussions in Mesa, which suggests that a 
> NIR linker can be useful to other backends, or for other purposes such as a 
> later-stage shader cache. There is also the work Timothy started, which 
> aligns well and complements what we need for GL_ARB_gl_spirv.
>
> Another important aspect is testing, and here the work Ian is doing to 
> generate SPIR-V binaries from GLSL is crucial. It will allow us to feed the 
> NIR linker with a much larger set of shaders. We look forward to incorporate 
> this conversion in our code-path and development workflow.
>
> There is obviously a lot of work ahead to have a NIR linker at the same level 
> of quality as the GLSL linker. Ideally, this would be a joint effort by those 
> in the community who see value in having a pure NIR linker.
>
> Comments?
> Thanks for reviewing!
>
> Eduardo
>
> [1] https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gl_spirv.txt
> [2] 
> https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_spirv_extensions.txt
> [3] https://github.com/Igalia/mesa/commits/wip/igalia/arb_gl_spirv
>
>
> Alejandro Piñeiro (8):
>   spirv_extensions: rename nir_spirv_supported_extensions
>   i965: initialize SPIR-V capabilities
>   spirv_extensions: add GL_ARB_spirv_extensions boilerplate
>   spirv_extensions: add list of extensions and to_string method
>   spirv_extensions: define spirv_extensions_supported
>   spirv_extensions: add spirv_supported_extensions on gl_constants
>   spirv_extensions: i965: initialize SPIR-V extensions
>   nir/spirv: add gl_spirv_validation method
>
> Eduardo Lima Mitev (9):
>   mesa/glspirv: Add struct gl_shader_spirv_data
>   mesa/main: Add a 'spirv' flag to gl_shader_program_data
>   mesa/glspirv: Add a _mesa_spirv_link_shaders() placeholder
>   mesa/program: Link SPIR-V shaders using the SPIR-V code-path
>   mesa: Add a reference to gl_shader_spirv_data to gl_linked_shader
>   mesa/glspirv: Create gl_linked_shader objects for a SPIR-V program
>   mesa/glspirv: Add a _mesa_spirv_to_nir() function
>   i965: Call spirv_to_nir() instead of glsl_to_nir() for SPIR-V shaders
>   i965: Don't call process_glsl_ir() for SPIR-V shaders
>
> Nicolai Hähnle (7):
>   mesa: add GL_ARB_gl_spirv boilerplate
>   mesa: add gl_shader::SpirVBinary and getter
>   mesa: refuse to compile SPIR-V shaders or link mixed shaders
>   mesa/glspirv: Add struct gl_spirv_module
>   mesa: implement SPIR-V loading in glShaderBinary
>   mesa: add gl_constants::SpirVCapabilities
>   mesa: Implement glSpecializeShaderARB
>
>  src/amd/vulkan/radv_shader.c                |   4 +-
>  src/compiler/Makefile.sources               |   2 +
>  src/compiler/spirv/nir_spirv.h              |  11 +-
>  src/compiler/spirv/spirv_extensions.c       |  90 ++++++++
>  src/compiler/spirv/spirv_extensions.h       |  81 +++++++
>  src/compiler/spirv/spirv_to_nir.c           | 160 ++++++++++++-
>  src/compiler/spirv/vtn_private.h            |   2 +-
>  src/intel/vulkan/anv_pipeline.c             |   4 +-
>  src/mapi/glapi/gen/ARB_gl_spirv.xml         |  21 ++
>  src/mapi/glapi/gen/ARB_spirv_extensions.xml |  13 ++
>  src/mapi/glapi/gen/Makefile.am              |   2 +
>  src/mapi/glapi/gen/gl_API.xml               |   6 +
>  src/mapi/glapi/gen/gl_genexec.py            |   1 +
>  src/mesa/Makefile.sources                   |   4 +
>  src/mesa/drivers/dri/i965/brw_context.c     |  29 +++
>  src/mesa/drivers/dri/i965/brw_link.cpp      |   3 +-
>  src/mesa/drivers/dri/i965/brw_program.c     |   9 +-
>  src/mesa/main/context.c                     |   3 +
>  src/mesa/main/extensions_table.h            |   2 +
>  src/mesa/main/get.c                         |   6 +
>  src/mesa/main/get_hash_params.py            |   3 +
>  src/mesa/main/getstring.c                   |   7 +
>  src/mesa/main/glspirv.c                     | 345 
> ++++++++++++++++++++++++++++
>  src/mesa/main/glspirv.h                     | 108 +++++++++
>  src/mesa/main/mtypes.h                      |  27 +++
>  src/mesa/main/shaderapi.c                   |  56 ++++-
>  src/mesa/main/shaderobj.c                   |   3 +
>  src/mesa/main/spirvextensions.c             |  60 +++++
>  src/mesa/main/spirvextensions.h             |  49 ++++
>  src/mesa/main/tests/dispatch_sanity.cpp     |   3 +
>  src/mesa/program/ir_to_mesa.cpp             |  24 +-
>  31 files changed, 1111 insertions(+), 27 deletions(-)
>  create mode 100644 src/compiler/spirv/spirv_extensions.c
>  create mode 100644 src/compiler/spirv/spirv_extensions.h
>  create mode 100644 src/mapi/glapi/gen/ARB_gl_spirv.xml
>  create mode 100644 src/mapi/glapi/gen/ARB_spirv_extensions.xml
>  create mode 100644 src/mesa/main/glspirv.c
>  create mode 100644 src/mesa/main/glspirv.h
>  create mode 100644 src/mesa/main/spirvextensions.c
>  create mode 100644 src/mesa/main/spirvextensions.h
>

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to