iris: Always reserve binding table space for NIR constants
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 29 May 2019 22:30:51 +0000 (15:30 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Mon, 3 Jun 2019 21:14:45 +0000 (14:14 -0700)
Don't have a separate mechanism for NIR constants to be removed from
the table.  If unused, we will compact it away.  The use_null_surface
is needed when INTEL_DISABLE_COMPACT_BINDING_TABLE is set.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c

index f18c914f62d433b128bbff0572d340d5e0d7164d..3f8896ffd7df68175f9a2a9d7bf410515b052bc5 100644 (file)
@@ -678,14 +678,14 @@ iris_setup_binding_table(struct nir_shader *nir,
 
    bt->sizes[IRIS_SURFACE_GROUP_IMAGE] = info->num_images;
 
-   /* Allocate a slot in the UBO section for NIR constants if present.
+   /* Allocate an extra slot in the UBO section for NIR constants.
+    * Binding table compaction will remove it if unnecessary.
+    *
     * We don't include them in iris_compiled_shader::num_cbufs because
     * they are uploaded separately from shs->constbuf[], but from a shader
     * point of view, they're another UBO (at the end of the section).
     */
-   if (nir->constant_data_size > 0)
-      num_cbufs++;
-   bt->sizes[IRIS_SURFACE_GROUP_UBO] = num_cbufs;
+   bt->sizes[IRIS_SURFACE_GROUP_UBO] = num_cbufs + 1;
 
    /* The first IRIS_MAX_ABOs indices in the SSBO group are for atomics, real
     * SSBOs start after that.  Compaction will remove unused ABOs.
index abfd812c57234f2a281034c7c8362e0f75c88853..9cab4625b81d14c0835264570db8f152820123c9 100644 (file)
@@ -4191,11 +4191,16 @@ iris_populate_binding_table(struct iris_context *ice,
    foreach_surface_used(i, IRIS_SURFACE_GROUP_UBO) {
       uint32_t addr;
 
-      if ((i == bt->sizes[IRIS_SURFACE_GROUP_UBO] - 1) && ish->const_data) {
-         iris_use_pinned_bo(batch, iris_resource_bo(ish->const_data), false);
-         iris_use_pinned_bo(batch, iris_resource_bo(ish->const_data_state.res),
-                            false);
-         addr = ish->const_data_state.offset;
+      if (i == bt->sizes[IRIS_SURFACE_GROUP_UBO] - 1) {
+         if (ish->const_data) {
+            iris_use_pinned_bo(batch, iris_resource_bo(ish->const_data), false);
+            iris_use_pinned_bo(batch, iris_resource_bo(ish->const_data_state.res),
+                               false);
+            addr = ish->const_data_state.offset;
+         } else {
+            /* This can only happen with INTEL_DISABLE_COMPACT_BINDING_TABLE=1. */
+            addr = use_null_surface(batch, ice);
+         }
       } else {
          addr = use_ubo_ssbo(batch, ice, &shs->constbuf[i],
                              &shs->constbuf_surf_state[i], false);