iris: blorp URB
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 23 Apr 2018 20:26:06 +0000 (13:26 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:06 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_blorp.c

index 6b43a86a658b39fe2cd48a752f7196253137ee71..795a80ae0738ee652162a7ead038e0cdff044126 100644 (file)
@@ -26,6 +26,7 @@
 #include "iris_resource.h"
 #include "iris_context.h"
 
+#include "intel/common/gen_l3_config.h"
 #include "blorp/blorp_genX_exec.h"
 #include "util/u_upload_mgr.h"
 
@@ -218,13 +219,28 @@ blorp_emit_urb_config(struct blorp_batch *blorp_batch,
                       unsigned vs_entry_size,
                       UNUSED unsigned sf_entry_size)
 {
-   // XXX: URB...
-#if 0
-   if (ice->urb.vsize >= vs_entry_size)
-      return;
-
-   gen7_upload_urb(ice, vs_entry_size, false, false);
-#endif
+   struct iris_context *ice = blorp_batch->blorp->driver_ctx;
+   struct iris_batch *batch = blorp_batch->driver_batch;
+   const struct gen_device_info *devinfo = &batch->screen->devinfo;
+
+   // XXX: Track last URB config and avoid re-emitting it if it's good enough
+   const unsigned push_size_kB = 32;
+   unsigned entries[4];
+   unsigned start[4];
+   unsigned size[4] = { vs_entry_size, 1, 1, 1 };
+
+   gen_get_urb_config(devinfo, 1024 * push_size_kB,
+                      1024 * ice->shaders.urb_size,
+                      false, false, size, entries, start);
+
+   for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
+      blorp_emit(blorp_batch, GENX(3DSTATE_URB_VS), urb) {
+         urb._3DCommandSubOpcode += i;
+         urb.VSURBStartingAddress     = start[i];
+         urb.VSURBEntryAllocationSize = size[i] - 1;
+         urb.VSNumberofURBEntries     = entries[i];
+      }
+   }
 }
 
 static void