On 03.07.2017 23:10, Connor Abbott wrote:
Hi Nicolai,

On Mon, Jul 3, 2017 at 6:23 AM, Nicolai Hähnle <nhaeh...@gmail.com> wrote:
Hi Connor,

On 27.06.2017 02:25, Connor Abbott wrote:

Ok, so I just looked into it a little further, and I guess that since
nir_to_llvm needs to know about the ABI to know where all the
"special" inputs/outputs like tess factors, position etc. are,
switching radv to using the normal input/output intrinsics would be
better done as part of your series, so I'll leave that to you. In the
meantime, though, I'm going to send out some patches which improve
radv's local variable handling which also remove one of the users of
radv_get_deref_offset() that ultimately needs to go. It'll cause some
rebase conflicts for you, but they shouldn't be so hard to solve.


So I just looked into this in more detail, and now I remember why I decided
to stick with passing on nir_lower_io during my first cut: non-constant
array offsets are a pain.

On GCN, we cannot actually do indirect indexing of vertex and fragment
shader inputs/outputs. We work around this by temporarily putting arrays
into LLVM vectors and using non-constant extract/insertelement instructions.

The problem is: if we don't have a bound on the array sizes, then this
becomes extremely inefficient. This is a big part of why TGSI has all the
ArrayID-fu.

I see that load_uniform and load_push_constant have a RANGE const_index
specifying the array size. So I'm thinking of adding this to
load_(per_vertex_)input and store_output as well.

Does that sound good?

i965 has a similar restriction, and it handles it by calling
nir_lower_io_to_temporaries() before nir_lower_io(), which does
exactly what you'd expect. I think radeonsi should probably use that
pass too. That will require us to call nir_lower_io() inside the
driver inside the state tracker, which now that I think about it, I
feel better about -- when Rob originally implemented st_glsl_to_nir, I
thought it would be better to push nir_lower_io down to the drivers
and let them set driver_location, but he disagreed since (IIRC)
Gallium has a fixed uniform/VBO layout that drivers need to respect,
so it wouldn't be that helpful for drivers to control the location
anyways. But now that we want to use the same compiler stuff for
Gallium and another API, we might want to reconsider that. It would be
nice if driver_location had a shared meaning across radeonsi and radv,
and we left location to mean the API location, and considered Gallium
to be just another API. I think this would also be a requirement for
any potential i965 Gallium driver. What do you think?

Okay, lowering to temporaries sounds good. Should end up the same as adding a RANGE in the typical cases, and likely handles weird stuff like arrays-of-structs-with-arrays better.

The mapping of default-block uniform variables to addresses and indeed also the mapping of VS inputs is something that st/mesa should control. TGSI is the same way. So this points at nir_lower_io being called in st_glsl_to_nir.

(BTW, this is actually also why I put nir_lower_uniforms_to_ubo into st_glsl_to_nir originally. In the TGSI world, constant buffer 0 isn't really very special, and so I thought the same makes sense in the NIR world.)

nir_lower_io_to_temporaries sounds useful here, but we as the driver want to be able to control where it's used. For example, for TES inputs and outputs we actually prefer to deal with dynamic indices ourselves, as those are simple buffer loads/stores that can have arbitrary indices.

What about a pair of shader caps that control calling nir_lower_io_to_temporaries from st_glsl_to_nir on a per-shader-stage basis?

Cheers,
Nicolai



Connor


Cheers,
Nicolai




On Mon, Jun 26, 2017 at 12:25 PM, Connor Abbott <cwabbo...@gmail.com>
wrote:

Forgot to mention... I think I'll take a pass at doing this today.
It'll distract me from some weird bug I've been trying to fight with
the AMD_shader_ballot stuff :)

On Mon, Jun 26, 2017 at 12:24 PM, Connor Abbott <cwabbo...@gmail.com>
wrote:

So, I think that rather than doing this, we should make radv call
nir_lower_io instead. There's currently a bunch of code in the
NIR-to-LLVM translation to calculate dereference offsets and split up
loads, which is just silly - use the lowering pass instead!

On Mon, Jun 26, 2017 at 7:09 AM, Nicolai Hähnle <nhaeh...@gmail.com>
wrote:

From: Nicolai Hähnle <nicolai.haeh...@amd.com>

Existing NIR drivers return 1 here, since that reflects the current
behavior.
---
   src/gallium/docs/source/screen.rst               | 5 +++++
   src/gallium/drivers/etnaviv/etnaviv_screen.c     | 1 +
   src/gallium/drivers/freedreno/freedreno_screen.c | 1 +
   src/gallium/drivers/i915/i915_screen.c           | 1 +
   src/gallium/drivers/llvmpipe/lp_screen.c         | 1 +
   src/gallium/drivers/nouveau/nv30/nv30_screen.c   | 1 +
   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           | 1 +
   src/gallium/drivers/r600/r600_pipe.c             | 1 +
   src/gallium/drivers/radeonsi/si_pipe.c           | 1 +
   src/gallium/drivers/softpipe/sp_screen.c         | 1 +
   src/gallium/drivers/svga/svga_screen.c           | 1 +
   src/gallium/drivers/swr/swr_screen.cpp           | 1 +
   src/gallium/drivers/vc4/vc4_screen.c             | 1 +
   src/gallium/drivers/virgl/virgl_screen.c         | 1 +
   src/gallium/include/pipe/p_defines.h             | 1 +
   17 files changed, 21 insertions(+)

diff --git a/src/gallium/docs/source/screen.rst
b/src/gallium/docs/source/screen.rst
index b375e53..9dab38b 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -391,20 +391,25 @@ The integer capabilities:
     shader outputs.
   * ``PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX``: Whether a buffer with
just
     PIPE_BIND_CONSTANT_BUFFER can be legally passed to
set_vertex_buffers.
   * ``PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION``: As the name
says.
   * ``PIPE_CAP_POST_DEPTH_COVERAGE``: whether
     ``TGSI_PROPERTY_FS_POST_DEPTH_COVERAGE`` is supported.
   * ``PIPE_CAP_BINDLESS_TEXTURE``: Whether bindless texture operations
are
     supported.
   * ``PIPE_CAP_NIR_SAMPLERS_AS_DEREF``: Whether NIR tex instructions
should
     reference texture and sampler as NIR derefs instead of by indices.
+* ``PIPE_CAP_NIR_LOWER_IO``: Whether the nir_lower_io pass should be
run to
+  replace variable accesses by the corresponding intrinsics. Note that
when
+  this is false, the state tracker can no longer leave accesses to
+  default-block uniforms in the shader, meaning that
nir_lower_uniforms_to_ubo
+  is used.


   .. _pipe_capf:

   PIPE_CAPF_*
   ^^^^^^^^^^^^^^^^

   The floating-point capabilities are:

   * ``PIPE_CAPF_MAX_LINE_WIDTH``: The maximum width of a regular line.
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c
b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index 85b7e91..7f2a231 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
@@ -252,20 +252,21 @@ etna_screen_get_param(struct pipe_screen
*pscreen, enum pipe_cap param)
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      /* Stream output. */
      case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
      case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
      case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
      case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
         return 0;

      /* Geometry shader output, unsupported. */
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c
b/src/gallium/drivers/freedreno/freedreno_screen.c
index 6380996..8fab5fd 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -174,20 +174,21 @@ fd_screen_get_param(struct pipe_screen *pscreen,
enum pipe_cap param)
          case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
          case PIPE_CAP_SEAMLESS_CUBE_MAP:
          case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
          case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
          case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
          case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
          case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
          case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
          case PIPE_CAP_STRING_MARKER:
          case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
+       case PIPE_CAP_NIR_LOWER_IO:
                  return 1;

          case PIPE_CAP_VERTEXID_NOBASE:
                  return is_a3xx(screen) || is_a4xx(screen);

          case PIPE_CAP_USER_CONSTANT_BUFFERS:
                  return is_a4xx(screen) ? 0 : 1;

          case PIPE_CAP_COMPUTE:
                  return has_compute(screen);
diff --git a/src/gallium/drivers/i915/i915_screen.c
b/src/gallium/drivers/i915/i915_screen.c
index 3a0dade..17f4858 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -304,20 +304,21 @@ i915_get_param(struct pipe_screen *screen, enum
pipe_cap cap)
      case PIPE_CAP_INT64_DIVMOD:
      case PIPE_CAP_TGSI_TEX_TXF_LZ:
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      case PIPE_CAP_MAX_VIEWPORTS:
         return 1;

      case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
         return 64;

      case PIPE_CAP_GLSL_FEATURE_LEVEL:
         return 120;
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c
b/src/gallium/drivers/llvmpipe/lp_screen.c
index 08edc08..df3edcf 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -350,20 +350,21 @@ llvmpipe_get_param(struct pipe_screen *screen,
enum pipe_cap param)
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;
      }
      /* should only get here on unhandled cases */
      debug_printf("Unexpected PIPE_CAP %d query\n", param);
      return 0;
   }

   static int
   llvmpipe_get_shader_param(struct pipe_screen *screen,
                             enum pipe_shader_type shader,
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
index 570a5d4..0acc12e 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
@@ -214,20 +214,21 @@ nv30_screen_get_param(struct pipe_screen
*pscreen, enum pipe_cap param)
      case PIPE_CAP_TGSI_TEX_TXF_LZ:
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      case PIPE_CAP_VENDOR_ID:
         return 0x10de;
      case PIPE_CAP_DEVICE_ID: {
         uint64_t device_id;
         if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE,
&device_id)) {
            NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n");
            return -1;
         }
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
index fbda514..8347a2c 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
@@ -266,20 +266,21 @@ nv50_screen_get_param(struct pipe_screen
*pscreen, enum pipe_cap param)
      case PIPE_CAP_DOUBLES:
      case PIPE_CAP_INT64:
      case PIPE_CAP_INT64_DIVMOD:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      case PIPE_CAP_VENDOR_ID:
         return 0x10de;
      case PIPE_CAP_DEVICE_ID: {
         uint64_t device_id;
         if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE,
&device_id)) {
            NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n");
            return -1;
         }
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index 6a7a575..65d4d43 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -295,20 +295,21 @@ nvc0_screen_get_param(struct pipe_screen
*pscreen, enum pipe_cap param)
      case PIPE_CAP_PCI_DEVICE:
      case PIPE_CAP_PCI_FUNCTION:
      case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
      case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
      case PIPE_CAP_NATIVE_FENCE_FD:
      case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
      case PIPE_CAP_INT64_DIVMOD:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      case PIPE_CAP_VENDOR_ID:
         return 0x10de;
      case PIPE_CAP_DEVICE_ID: {
         uint64_t device_id;
         if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE,
&device_id)) {
            NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n");
            return -1;
         }
diff --git a/src/gallium/drivers/r300/r300_screen.c
b/src/gallium/drivers/r300/r300_screen.c
index a994a05..4caa94f 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -236,20 +236,21 @@ static int r300_get_param(struct pipe_screen*
pscreen, enum pipe_cap param)
           case PIPE_CAP_TGSI_TEX_TXF_LZ:
           case PIPE_CAP_TGSI_CLOCK:
           case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
           case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
           case PIPE_CAP_TGSI_BALLOT:
           case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
           case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
           case PIPE_CAP_POST_DEPTH_COVERAGE:
           case PIPE_CAP_BINDLESS_TEXTURE:
           case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+        case PIPE_CAP_NIR_LOWER_IO:
               return 0;

           /* SWTCL-only features. */
           case PIPE_CAP_PRIMITIVE_RESTART:
           case PIPE_CAP_USER_VERTEX_BUFFERS:
           case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
               return !r300screen->caps.has_tcl;

           /* HWTCL-only features / limitations. */
           case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
diff --git a/src/gallium/drivers/r600/r600_pipe.c
b/src/gallium/drivers/r600/r600_pipe.c
index f09e468..86c7e92 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -392,20 +392,21 @@ static int r600_get_param(struct pipe_screen*
pscreen, enum pipe_cap param)
          case PIPE_CAP_INT64_DIVMOD:
          case PIPE_CAP_TGSI_TEX_TXF_LZ:
          case PIPE_CAP_TGSI_CLOCK:
          case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
          case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
          case PIPE_CAP_TGSI_BALLOT:
          case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
          case PIPE_CAP_POST_DEPTH_COVERAGE:
          case PIPE_CAP_BINDLESS_TEXTURE:
          case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+       case PIPE_CAP_NIR_LOWER_IO:
                  return 0;

          case PIPE_CAP_DOUBLES:
                  if (rscreen->b.family == CHIP_ARUBA ||
                      rscreen->b.family == CHIP_CAYMAN ||
                      rscreen->b.family == CHIP_CYPRESS ||
                      rscreen->b.family == CHIP_HEMLOCK)
                          return 1;
                  return 0;

diff --git a/src/gallium/drivers/radeonsi/si_pipe.c
b/src/gallium/drivers/radeonsi/si_pipe.c
index 05a4555..6727f84 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -585,20 +585,21 @@ static int si_get_param(struct pipe_screen*
pscreen, enum pipe_cap param)
          case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
          case PIPE_CAP_VERTEXID_NOBASE:
          case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
          case PIPE_CAP_MAX_WINDOW_RECTANGLES:
          case PIPE_CAP_NATIVE_FENCE_FD:
          case PIPE_CAP_TGSI_FS_FBFETCH:
          case PIPE_CAP_TGSI_MUL_ZERO_WINS:
          case PIPE_CAP_UMA:
          case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
          case PIPE_CAP_POST_DEPTH_COVERAGE:
+       case PIPE_CAP_NIR_LOWER_IO:
                  return 0;

          case PIPE_CAP_QUERY_BUFFER_OBJECT:
                  return si_have_tgsi_compute(sscreen);

          case PIPE_CAP_DRAW_PARAMETERS:
          case PIPE_CAP_MULTI_DRAW_INDIRECT:
          case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
                  return sscreen->has_draw_indirect_multi;

diff --git a/src/gallium/drivers/softpipe/sp_screen.c
b/src/gallium/drivers/softpipe/sp_screen.c
index 6ed2ce1..eadd476 100644
--- a/src/gallium/drivers/softpipe/sp_screen.c
+++ b/src/gallium/drivers/softpipe/sp_screen.c
@@ -300,20 +300,21 @@ softpipe_get_param(struct pipe_screen *screen,
enum pipe_cap param)
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;
      case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
         return 4;
      }
      /* should only get here on unhandled cases */
      debug_printf("Unexpected PIPE_CAP %d query\n", param);
      return 0;
   }

   static int
diff --git a/src/gallium/drivers/svga/svga_screen.c
b/src/gallium/drivers/svga/svga_screen.c
index 6126b55..01443a7 100644
--- a/src/gallium/drivers/svga/svga_screen.c
+++ b/src/gallium/drivers/svga/svga_screen.c
@@ -439,20 +439,21 @@ svga_get_param(struct pipe_screen *screen, enum
pipe_cap param)
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;
      }

      debug_printf("Unexpected PIPE_CAP_ query %u\n", param);
      return 0;
   }


   static int
   vgpu9_get_shader_param(struct pipe_screen *screen,
diff --git a/src/gallium/drivers/swr/swr_screen.cpp
b/src/gallium/drivers/swr/swr_screen.cpp
index b0796bb..1e51d88 100644
--- a/src/gallium/drivers/swr/swr_screen.cpp
+++ b/src/gallium/drivers/swr/swr_screen.cpp
@@ -335,20 +335,21 @@ swr_get_param(struct pipe_screen *screen, enum
pipe_cap param)
      case PIPE_CAP_TGSI_CLOCK:
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;

      case PIPE_CAP_VENDOR_ID:
         return 0xFFFFFFFF;
      case PIPE_CAP_DEVICE_ID:
         return 0xFFFFFFFF;
      case PIPE_CAP_ACCELERATED:
         return 0;
      case PIPE_CAP_VIDEO_MEMORY: {
         /* XXX: Do we want to return the full amount of system memory ?
*/
diff --git a/src/gallium/drivers/vc4/vc4_screen.c
b/src/gallium/drivers/vc4/vc4_screen.c
index 6acd9bf..f4a207f 100644
--- a/src/gallium/drivers/vc4/vc4_screen.c
+++ b/src/gallium/drivers/vc4/vc4_screen.c
@@ -122,20 +122,21 @@ vc4_screen_get_param(struct pipe_screen *pscreen,
enum pipe_cap param)
           case PIPE_CAP_NPOT_TEXTURES:
           case PIPE_CAP_SHAREABLE_SHADERS:
           case PIPE_CAP_USER_CONSTANT_BUFFERS:
           case PIPE_CAP_TEXTURE_SHADOW_MAP:
           case PIPE_CAP_BLEND_EQUATION_SEPARATE:
           case PIPE_CAP_TWO_SIDED_STENCIL:
           case PIPE_CAP_TEXTURE_MULTISAMPLE:
           case PIPE_CAP_TEXTURE_SWIZZLE:
           case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
           case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
+        case PIPE_CAP_NIR_LOWER_IO:
                   return 1;

                   /* lying for GL 2.0 */
           case PIPE_CAP_OCCLUSION_QUERY:
           case PIPE_CAP_POINT_SPRITE:
                   return 1;

           case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
                   return 256;

diff --git a/src/gallium/drivers/virgl/virgl_screen.c
b/src/gallium/drivers/virgl/virgl_screen.c
index e155b4a..8a579a0 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -259,20 +259,21 @@ virgl_get_param(struct pipe_screen *screen, enum
pipe_cap param)
      case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
      case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
      case PIPE_CAP_TGSI_BALLOT:
      case PIPE_CAP_DOUBLES:
      case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
      case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
      case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
      case PIPE_CAP_POST_DEPTH_COVERAGE:
      case PIPE_CAP_BINDLESS_TEXTURE:
      case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
+   case PIPE_CAP_NIR_LOWER_IO:
         return 0;
      case PIPE_CAP_VENDOR_ID:
         return 0x1af4;
      case PIPE_CAP_DEVICE_ID:
         return 0x1010;
      case PIPE_CAP_ACCELERATED:
         return 1;
      case PIPE_CAP_UMA:
      case PIPE_CAP_VIDEO_MEMORY:
         return 0;
diff --git a/src/gallium/include/pipe/p_defines.h
b/src/gallium/include/pipe/p_defines.h
index 08690ba..460238e 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -774,20 +774,21 @@ enum pipe_cap
      PIPE_CAP_TGSI_CLOCK,
      PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE,
      PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE,
      PIPE_CAP_TGSI_BALLOT,
      PIPE_CAP_TGSI_TES_LAYER_VIEWPORT,
      PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX,
      PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION,
      PIPE_CAP_POST_DEPTH_COVERAGE,
      PIPE_CAP_BINDLESS_TEXTURE,
      PIPE_CAP_NIR_SAMPLERS_AS_DEREF,
+   PIPE_CAP_NIR_LOWER_IO,
   };

   #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
   #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600 (1 << 1)

   enum pipe_endian
   {
      PIPE_ENDIAN_LITTLE = 0,
      PIPE_ENDIAN_BIG = 1,
   #if defined(PIPE_ARCH_LITTLE_ENDIAN)
--
2.9.3

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



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to