iris: fix SSBO indexing
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 25 Jul 2018 00:44:09 +0000 (17:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:07 +0000 (10:26 -0800)
st/nir offsets SSBO indexes by MaxABOs.  This is not what we want,
as it bloats the binding tables.  We'll need to adjust it to use
info->num_abos as the offset and buffer base instead.  For now,
just use the inefficient format to get us rolling.  We can add a
PIPE_CAP later.

src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_screen.c
src/gallium/drivers/iris/iris_state.c

index 98af24cf2238eef515fa4a5e890ca2e7fcaca5f6..cda649127c794bc9dec6b4a55b1cdd8ed500e0ff 100644 (file)
@@ -43,6 +43,9 @@ struct blorp_params;
 #define IRIS_RESOURCE_FLAG_DYNAMIC_MEMZONE (PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
 
 #define IRIS_MAX_TEXTURE_SAMPLERS 32
+/* IRIS_MAX_ABOS and IRIS_MAX_SSBOS must be the same. */
+#define IRIS_MAX_ABOS 16
+#define IRIS_MAX_SSBOS 16
 #define IRIS_MAX_VIEWPORTS 16
 
 #define IRIS_DIRTY_COLOR_CALC_STATE         (1ull <<  0)
index f98b17bb1fb344834322e75ff81a3456c5f71606..105ac0e5f620d0259f38df203f66dcdf1e5e3e4b 100644 (file)
@@ -384,8 +384,9 @@ iris_get_shader_param(struct pipe_screen *pscreen,
    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
-   case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
       return IRIS_MAX_TEXTURE_SAMPLERS;
+   case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
+      return IRIS_MAX_ABOS + IRIS_MAX_SSBOS;
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
       return 0;
index bc27de8f7d84fc79ad5d9679e4ae44dad009bedc..13371908e3eab05205a40b9629dd6e44301c7199 100644 (file)
@@ -2680,8 +2680,15 @@ iris_populate_binding_table(struct iris_context *ice,
       bt_map[s++] = use_const_buffer(batch, cbuf);
    }
 
-   for (int i = 0; i < info->num_abos + info->num_ssbos; i++) {
-      bt_map[s++] = use_ssbo(batch, ice, shs, i);
+   /* XXX: st is wasting 16 binding table slots for ABOs.  Should add a cap
+    * for changing nir_lower_atomics_to_ssbos setting and buffer_base offset
+    * in st_atom_storagebuf.c so it'll compact them into one range, with
+    * SSBOs starting at info->num_abos.  Ideally it'd reset num_abos to 0 too
+    */
+   if (info->num_abos + info->num_ssbos > 0) {
+      for (int i = 0; i < IRIS_MAX_ABOS + info->num_ssbos; i++) {
+         bt_map[s++] = use_ssbo(batch, ice, shs, i);
+      }
    }
 
 #if 0