gallium: Add a cap for enabling lowering of image load/store intrinsics.
authorEric Anholt <eric@anholt.net>
Thu, 23 Jan 2020 18:52:39 +0000 (10:52 -0800)
committerMarge Bot <eric+marge@anholt.net>
Mon, 24 Feb 2020 18:25:02 +0000 (18:25 +0000)
The deref stuff is hard to handle in a backend supporting dynamic
indexing, while the lowering can easily turn that into the same kind of
dynamic indexing we do for textures, UBOs, and SSBOs.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3728>

src/gallium/auxiliary/util/u_screen.c
src/gallium/docs/source/screen.rst
src/gallium/include/pipe/p_defines.h
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 821bb16d5394988e96b7ed8176ada7a0243113b5..372094f77e69dea5b3dee8fb46f173777c2c9d89 100644 (file)
@@ -407,6 +407,8 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
    case PIPE_CAP_OPENCL_INTEGER_FUNCTIONS:
    case PIPE_CAP_INTEGER_MULTIPLY_32X16:
       return 0;
+   case PIPE_CAP_NIR_IMAGES_AS_DEREF:
+      return 1;
 
    case PIPE_CAP_FRONTEND_NOOP:
       /* Enables INTEL_blackhole_render */
index 5137418bd7c622916ffec571f9e2f21b620eb37c..6c4a1dd1abf3483458df20ea7d98009792084340 100644 (file)
@@ -567,6 +567,7 @@ The integer capabilities:
 * ``PIPE_CAP_MAX_VERTEX_BUFFERS``: Number of supported vertex buffers.
 * ``PIPE_CAP_OPENCL_INTEGER_FUNCTIONS``: Driver supports extended OpenCL-style integer functions.  This includes averge, saturating additiong, saturating subtraction, absolute difference, count leading zeros, and count trailing zeros.
 * ``PIPE_CAP_INTEGER_MULTIPLY_32X16``: Driver supports integer multiplication between a 32-bit integer and a 16-bit integer.  If the second operand is 32-bits, the upper 16-bits are ignored, and the low 16-bits are possibly sign extended as necessary.
+* ``PIPE_CAP_NIR_IMAGES_AS_DEREF``: Whether NIR image load/store intrinsics should be nir_intrinsic_image_deref_* instead of nir_intrinsic_image_*.  Defaults to true.
 
 .. _pipe_capf:
 
index ca6d27e9700a6079f766e4b8b8d660634f364959..3b1d93528b573f1ac7231a67011a39f939ba71a7 100644 (file)
@@ -914,6 +914,7 @@ enum pipe_cap
    PIPE_CAP_INTEGER_MULTIPLY_32X16,
    /* Turn draw, dispatch, blit into NOOP */
    PIPE_CAP_FRONTEND_NOOP,
+   PIPE_CAP_NIR_IMAGES_AS_DEREF,
 };
 
 /**
index ad104686310da7962b3edbef652e7dadc4b8b09e..d23719d49e8a738b9e6f88ea996463d905c01015 100644 (file)
@@ -941,6 +941,8 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog,
 
    st_nir_lower_uniforms(st, nir);
    st_nir_lower_samplers(screen, nir, shader_program, prog);
+   if (!screen->get_param(screen, PIPE_CAP_NIR_IMAGES_AS_DEREF))
+      NIR_PASS_V(nir, gl_nir_lower_images, false);
 
    if (finalize_by_driver && screen->finalize_nir)
       screen->finalize_nir(screen, nir, false);