[Mesa-dev] [PATCH v2 2/3] nir: Add a discard optimization pass
Matt Turner
mattst88 at gmail.com
Wed Jul 4 17:00:28 UTC 2018
On Wed, Jul 4, 2018 at 9:59 AM Jason Ekstrand <jason at jlekstrand.net> wrote:
>
> Many fragment shaders do a discard using relatively little information
> but still put the discard fairly far down in the shader for no good
> reason. If the discard is moved higher up, we can possibly avoid doing
> some or almost all of the work in the shader. When this lets us skip
> texturing operations, it's an especially high win.
>
> One of the biggest offenders here is DXVK. The D3D APIs have different
> rules for discards than OpenGL and Vulkan. One effective way (which is
> what DXVK uses) to implement DX behavior on top of GL or Vulkan is to
> wait until the very end of the shader to discard. This ends up in the
> pessimal case where we always do all of the work before discarding.
> This pass helps some DXVK shaders significantly.
>
> v2 (Jason Ekstrand):
> - Fix a couple of typos (Grazvydas, Ian)
> - Use the new nir_instr_move helper
> - Find all movable discards before moving anything so we don't
> accidentally re-order anything and break dependencies
> ---
> src/compiler/Makefile.sources | 1 +
> src/compiler/nir/meson.build | 1 +
> src/compiler/nir/nir.h | 10 +
> src/compiler/nir/nir_opt_discard.c | 396 +++++++++++++++++++++++++++++
> 4 files changed, 408 insertions(+)
> create mode 100644 src/compiler/nir/nir_opt_discard.c
>
> diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources
> index 9e3fbdc2612..8600ce81281 100644
> --- a/src/compiler/Makefile.sources
> +++ b/src/compiler/Makefile.sources
> @@ -271,6 +271,7 @@ NIR_FILES = \
> nir/nir_opt_cse.c \
> nir/nir_opt_dce.c \
> nir/nir_opt_dead_cf.c \
> + nir/nir_opt_discard.c \
> nir/nir_opt_gcm.c \
> nir/nir_opt_global_to_local.c \
> nir/nir_opt_if.c \
> diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build
> index 28aa8de7014..e339258bb94 100644
> --- a/src/compiler/nir/meson.build
> +++ b/src/compiler/nir/meson.build
> @@ -156,6 +156,7 @@ files_libnir = files(
> 'nir_opt_cse.c',
> 'nir_opt_dce.c',
> 'nir_opt_dead_cf.c',
> + 'nir_opt_discard.c',
> 'nir_opt_gcm.c',
> 'nir_opt_global_to_local.c',
> 'nir_opt_if.c',
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> index c40a88c8ccc..dac019c17e8 100644
> --- a/src/compiler/nir/nir.h
> +++ b/src/compiler/nir/nir.h
> @@ -2022,6 +2022,13 @@ typedef struct nir_shader_compiler_options {
> */
> bool vs_inputs_dual_locations;
>
> + /**
> + * Whether or not derivatives are still a safe operation after a discard
> + * has occurred. Optimization passes may be able to be a bit more
> + * agressive if this is true.
s/agressive/aggressive/
More information about the mesa-dev
mailing list