iris: URB configs.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 26 Jan 2018 05:23:45 +0000 (21:23 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:05 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.c
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/iris/iris_state.c

index 4675e2e62c196cd3fe8e42a05ce3431bf91070d6..f4a912a102fd0607ddf099f930e177397f0d843a 100644 (file)
@@ -124,6 +124,8 @@ iris_create_context(struct pipe_screen *pscreen, void *priv, unsigned flags)
    ctx->flush = iris_flush;
    ctx->set_debug_callback = iris_set_debug_callback;
 
+   ice->shaders.urb_size = devinfo->urb.size;
+
    iris_init_blit_functions(ctx);
    iris_init_clear_functions(ctx);
    iris_init_program_functions(ctx);
index 3d16cfedc31bb80de76adc6c2f53d7c2c8325614..fc1b4c572dba3e5a5c74f381e4ab880b73031301 100644 (file)
@@ -119,6 +119,8 @@ struct iris_context {
 
       struct u_upload_mgr *uploader;
       struct hash_table *cache;
+
+      unsigned urb_size;
    } shaders;
 
    /** The main batch for rendering */
index 82dfd6a50503266a5fcc9fa0e116bef62b1cdbe3..e2e92b839ae3f4813e3fd6255d00e11ccf37609c 100644 (file)
@@ -377,10 +377,6 @@ iris_update_compiled_shaders(struct iris_context *ice)
          }
       }
    }
-
-   if (ice->state.dirty & IRIS_DIRTY_URB) {
-      // ... back to the state module :/
-   }
 }
 
 void
index 10b81859bd305dc86b0b724f97438eb58f572f48..289bc1c47118a980db0ae834829b583d2139fded 100644 (file)
@@ -40,6 +40,7 @@
 #include "util/u_transfer.h"
 #include "i915_drm.h"
 #include "intel/compiler/brw_compiler.h"
+#include "intel/common/gen_l3_config.h"
 #include "intel/common/gen_sample_positions.h"
 #include "iris_batch.h"
 #include "iris_context.h"
@@ -1696,6 +1697,42 @@ iris_set_derived_program_state(const struct gen_device_info *devinfo,
    }
 }
 
+static void
+iris_upload_urb_config(struct iris_context *ice, struct iris_batch *batch)
+{
+   const struct gen_device_info *devinfo = &batch->screen->devinfo;
+   const unsigned push_size_kB = 32;
+   unsigned entries[4];
+   unsigned start[4];
+   unsigned size[4];
+
+   for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
+      if (!ice->shaders.prog[i]) {
+         size[i] = 1;
+      } else {
+         struct brw_vue_prog_data *vue_prog_data =
+            (void *) ice->shaders.prog[i]->prog_data;
+         size[i] = vue_prog_data->urb_entry_size;
+      }
+      assert(size[i] != 0);
+   }
+
+   gen_get_urb_config(devinfo, 1024 * push_size_kB,
+                      1024 * ice->shaders.urb_size,
+                      ice->shaders.prog[MESA_SHADER_TESS_EVAL] != NULL,
+                      ice->shaders.prog[MESA_SHADER_GEOMETRY] != NULL,
+                      size, entries, start);
+
+   for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
+      iris_emit_cmd(batch, GENX(3DSTATE_URB_VS), urb) {
+         urb._3DCommandSubOpcode += i;
+         urb.VSURBStartingAddress     = start[i];
+         urb.VSURBEntryAllocationSize = size[i] - 1;
+         urb.VSNumberofURBEntries     = entries[i];
+      }
+   }
+}
+
 static void
 iris_upload_render_state(struct iris_context *ice,
                          struct iris_batch *batch,
@@ -1725,7 +1762,7 @@ iris_upload_render_state(struct iris_context *ice,
    /* XXX: L3 State */
 
    if (dirty & IRIS_DIRTY_URB) {
-      /* XXX: 3DSTATE_URB */
+      iris_upload_urb_config(ice, batch);
    }
 
    if (dirty & IRIS_DIRTY_BLEND_STATE) {